#include #include #include #include int a[80][80] = { 0 }; int b[4]; struct kuaikuai { int x; int y; int num; int nextnum; int level; int shudu; int grades; int geshu; }; void gotoxy(int x, int y) { COORD pos; pos.X = x; pos.Y = y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); } int color(int c) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c); return 0; } void title() { color(15); gotoxy(8,0); printf("<<这货是俄罗斯方块>>"); color(11); gotoxy(3,2); printf("■"); gotoxy(3,3); printf("■"); gotoxy(3,4); printf("■"); gotoxy(3,5); printf("■"); color(12); gotoxy(7,3); printf("■■"); gotoxy(7,4); printf("■■"); color(13); gotoxy(13,3); printf("■■"); gotoxy(15,4); printf("■■"); color(10); gotoxy(21,3); printf("■"); gotoxy(21,4); printf("■■■"); color(5); gotoxy(31,3); printf("■"); gotoxy(29,4); printf("■■■"); gotoxy(0,6); printf("\n"); } void sea() { int i; gotoxy(0,7); for (i = 0; i < 36;i++) { color(11 ); gotoxy(i,7); printf("︵"); } for (i = 0; i < 36; i++) { color(3); gotoxy(i,8); printf("﹌"); } } void begin() { int i, j; color(15); gotoxy(33, 10); printf("︻"); gotoxy(33, 11); printf("d"); gotoxy(33, 12); printf("d"); gotoxy(33, 13); printf("d"); gotoxy(33, 14); printf("︼"); color(7); for (i = 0; i < 30; i++) { for (j = 9; j < 18; j++) { gotoxy(i, j); if (j == 9 || j == 17) { printf("s"); } else if (i == 0 || i == 29) { printf("s"); } } } } void game() { int i, j; color(15); gotoxy(5, 2); printf("俄罗斯块块"); gotoxy(42,9); printf("********** 下一块"); gotoxy(42,20); printf("**********"); color(4); gotoxy(43,21); printf("Esc:退出游戏"); gotoxy(43,22); printf("↑:旋转"); gotoxy(43,23); printf("空格:暂停"); color(7); for (j = 5; j < 24; j++) { gotoxy(1, j); printf("|"); gotoxy(41, j); printf("|"); a[1][j] = 2; a[41][j] = 2; } for (i = 2; i < 61; i++) { gotoxy(i,4); printf("—"); gotoxy(i, 24); printf("—"); a[i][24] = 2; } } void making(struct kuaikuai *k) { a[k->x][k->y] = b[0]; switch (k->num) { case 1: a[k->x + 2][k->y] = b[1]; //田 a[k->x][k->y + 1] = b[2]; a[k->x + 2][k->y + 1] = b[3]; break; case 2: a[k->x][k->y + 1] = b[1]; //一 a[k->x][k->y + 2] = b[2]; a[k->x][k->y + 3] = b[3]; break; case 3: a[k->x + 2][k->y] = b[1]; a[k->x + 4][k->y] = b[2]; a[k->x + 6][k->y] = b[3]; break; case 4: a[k->x - 2][k->y] = b[1]; //T a[k->x + 2][k->y] = b[2]; a[k->x][k->y - 1] = b[3]; break; case 5: a[k->x + 2][k->y] = b[1]; a[k->x][k->y - 1] = b[2]; a[k->x][k->y + 1] = b[3]; break; case 6: a[k->x - 2][k->y] = b[1]; a[k->x + 2][k->y] = b[2]; a[k->x][k->y + 1] = b[3]; break; case 7: a[k->x - 2][k->y] = b[1]; a[k->x][k->y - 1] = b[2]; a[k->x][k->y + 1] = b[3]; break; case 8: a[k->x - 2][k->y] = b[1]; //7 a[k->x][k->y + 1] = b[2]; a[k->x][k->y + 2] = b[3]; break; case 9: a[k->x - 2][k->y] = b[1]; a[k->x + 2][k->y] = b[2]; a[k->x + 2][k->y - 1] = b[3]; break; case 10: a[k->x][k->y - 1] = b[1]; a[k->x][k->y + 1] = b[2]; a[k->x + 2][k->y + 1] = b[3]; break; case 11: a[k->x][k->y + 1] = b[1]; a[k->x + 2][k->y] = b[2]; a[k->x + 4][k->y] = b[3]; break; case 12: a[k->x - 2][k->y] = b[1]; //Z a[k->x][k->y + 1] = b[2]; a[k->x + 2][k->y + 1] = b[3]; break; case 13: a[k->x][k->y - 1] = b[1]; a[k->x - 2][k->y] = b[2]; a[k->x - 2][k->y + 1] = b[3]; break; case 14: a[k->x + 2][k->y] = b[1]; //反Z a[k->x][k->y + 1] = b[2]; a[k->x - 2][k->y + 1] = b[3]; break; case 15: a[k->x][k->y - 1] = b[1]; a[k->x + 2][k->y] = b[2]; a[k->x + 2][k->y + 1] = b[3]; break; case 16: a[k->x + 2][k->y] = b[1]; //反7 a[k->x][k->y + 1] = b[2]; a[k->x][k->y + 2] = b[3]; break; case 17: a[k->x - 4][k->y] = b[1]; a[k->x - 2][k->y] = b[2]; a[k->x][k->y + 1] = b[3]; break; case 18: a[k->x][k->y - 2] = b[1]; a[k->x][k->y - 1] = b[2]; a[k->x - 2][k->y] = b[3]; break; case 19: a[k->x][k->y - 1] = b[1]; a[k->x + 2][k->y] = b[2]; a[k->x + 4][k->y] = b[3]; break; } } void makingkuaikuai(struct kuaikuai *k) { int i, j; for (i = 0; i < 4; i++) { b[i] = 1; } making(k); for (i = k->x - 4; i <= k->x + 4; i+=2) { for (j = k->y - 2; j <= k->y + 2; j++) { if (a[i][j] == 1 && j > 5) { gotoxy(i, j); printf("■"); } } } gotoxy(42, 6); color(6); printf("等级:"); color(14); printf("%d",k->level); color(6); gotoxy(42,7); printf("得分:"); color(14); printf("%d",k->grades); } int moving(struct kuaikuai *k) { if (a[k->x][k->y] != 0) { return 0; } else { if ( (k->num == 1 && (a[k->x + 2][k->y] == 0 && //田 a[k->x][k->y + 1] == 0 && a[k->x + 2][k->y + 1] == 0)) || (k->num == 2 && (a[k->x][k->y + 1] == 0 && //一 a[k->x][k->y + 2] == 0 && a[k->x][k->y + 3] == 0)) || (k->num == 3 && (a[k->x + 2][k->y] == 0 && a[k->x + 4][k->y] == 0 && a[k->x + 6][k->y] == 0)) || (k->num == 4 && (a[k->x - 2][k->y] == 0 && //T a[k->x + 2][k->y] == 0 && a[k->x][k->y - 1] == 0)) || (k->num == 5 && (a[k->x + 2][k->y] == 0 && a[k->x][k->y - 1] == 0 && a[k->x][k->y + 1] == 0)) || (k->num == 6 && (a[k->x - 2][k->y] == 0 && a[k->x + 2][k->y] == 0 && a[k->x][k->y + 1] == 0)) || (k->num == 7 && (a[k->x - 2][k->y] == 0 && a[k->x][k->y - 1] == 0 && a[k->x][k->y + 1] == 0)) || (k->num == 8 && (a[k->x - 2][k->y] == 0 && //7 a[k->x][k->y + 1] == 0 && a[k->x][k->y + 2] == 0)) || (k->num == 9 && (a[k->x - 2][k->y] == 0 && a[k->x + 2][k->y] == 0 && a[k->x + 2][k->y - 1] == 0)) || (k->num == 10 && (a[k->x][k->y - 1] == 0 && a[k->x][k->y + 1] == 0 && a[k->x + 2][k->y + 1] == 0)) || (k->num == 11 && (a[k->x][k->y + 1] == 0 && a[k->x + 2][k->y] == 0 && a[k->x + 4][k->y] == 0)) || (k->num == 12 && (a[k->x - 2][k->y] == 0 && //Z a[k->x][k->y + 1] == 0 && a[k->x + 2][k->y + 1] == 0)) || (k->num == 13 && (a[k->x][k->y - 1] == 0 && a[k->x - 2][k->y] == 0 && a[k->x - 2][k->y + 1] == 0)) || (k->num == 14 && (a[k->x + 2][k->y] == 0 && //反Z a[k->x][k->y + 1] == 0 && a[k->x - 2][k->y + 1] == 0)) || (k->num == 15 && (a[k->x][k->y - 1] == 0 && a[k->x + 2][k->y] == 0 && a[k->x + 2][k->y + 1] == 0)) || (k->num == 16 && (a[k->x + 2][k->y] == 0 && //反7 a[k->x][k->y + 1] == 0 && a[k->x][k->y + 2] == 0)) || (k->num == 17 && (a[k->x - 4][k->y] == 0 && a[k->x - 2][k->y] == 0 && a[k->x][k->y + 1] == 0)) || (k->num == 18 && (a[k->x][k->y - 2] == 0 && a[k->x][k->y - 1] == 0 && a[k->x - 2][k->y] == 0)) || (k->num == 19 && (a[k->x][k->y - 1] == 0 && a[k->x + 2][k->y] == 0 && a[k->x + 4][k->y] == 0))) { return 1; } else { return 0; } } } void clean(struct kuaikuai *k) { int i,j; for (i = 0; i < 4; i++) { b[i] = 0; } making(k); for (i = k->x - 4; i <= k->x + 4; i++) { for (j = k->y - 2; j <= k->y + 2; j++) { if (a[i][j] == 0 && j > 5) { gotoxy(i, j); printf(" "); } } } } void full(struct kuaikuai *k) { int i,j,aa, bb=0; for (j = 23; j >5; j--) { aa = 0; for (i = 4; i <= 39; i += 2) { if (a[i][j] == 1) { aa++; if (aa == 18) { for (aa = 4; aa <= 39; aa += 2) { a[aa][j] = 0; gotoxy(aa, j); printf(" "); } for (aa = j - 1; aa > 5; aa--) { for (i = 4; i <= 39; i += 2) { if (a[i][aa] == 1) { a[i][aa] = 0; gotoxy(i, aa); printf(" "); gotoxy(i, aa + 1); printf("■"); } } } } j++; bb++; } } } k->grades += bb; if (bb > 0 && (k->grades % 10 == 0 || k->grades / 10 > k->level - 1)) { k->shudu -= 20; k->level++; } } void suiji(struct kuaikuai *k) { k->geshu++; srand(time(NULL)); if (k->geshu == 1) { k->num = rand() % 19 + 1; } k->nextnum = rand() % 19 + 1; } void play() { int i,n,temp,temp1,temp2; struct kuaikuai t, * k = &t; char ch; k->geshu = 0; k->shudu = 300; k->grades = 0; k->level = 1; while (1) { suiji(k); temp = k->num; k->x = 45; k->y = 18; k->num = k->nextnum; makingkuaikuai(k); k->x = 5; k->y = 8; k->num = temp; while (1) { label: makingkuaikuai(k); Sleep(k->shudu); clean(k); temp1 = k->x; temp2 = k->num; if (_kbhit()) { ch = _getch(); if (ch == 75) { k->x -= 2; } if (ch == 77) { k->x += 2; } if (ch == 80) { if (moving(k) != 0) { k->y += 2; } if (moving(k) == 0) { k->y = 21; } } if (ch == 72) { if (k->num >= 2 && k->num <= 3) { k->num++; k->num %= 2; k->num += 2; } if (k->num >= 4 && k->num <= 7) { k->num++; k->num %= 4; k->num += 4; } if (k->num >= 8 && k->num <= 11) { k->num++; k->num %= 4; k->num += 8; } if (k->num >= 12 && k->num <= 13) { k->num++; k->num %= 2; k->num += 2; } if (k->num >= 14 && k->num <= 15) { k->num++; k->num %= 2; k->num += 14; } if (k->num >= 16 && k->num <= 19) { k->num++; k->num %= 4; k->num += 16; } } if (ch == 32) { makingkuaikuai(k); while (1) { if (_kbhit()) { ch = _getch(); if (ch == 32) { goto label; } } } } if (ch == 27) { system("cls"); memset(a, 0, 6400 * sizeof(int)); title(); sea(); } if (moving(k) == 0) { k->x = temp1; k->num = temp2; } else { goto label; } } k->y++; if (moving == 0) { k->y--; makingkuaikuai(k); full(k); break; } } for (i = k->y - 2; i < k->y + 2; i++) { if (i == 5) { system("cls"); color(12); gotoxy(4, 8); printf("game over!!!!\n"); color(14); gotoxy(4, 9); printf("1、重新开始"); gotoxy(4,10); printf("2、退出"); gotoxy(4, 11); color(6); printf("你的选择是1/2:"); scanf_s("%d",&n); switch (n) { case 1: system("cls"); memset(a, 0, 6400 * sizeof(int)); play(); break; case 2: exit(0); break; } } } k->num = k->nextnum; k->x = 45; k->y = 18; clean(k); } } void bingo() { int n; color(14); gotoxy(3, 11); printf("1、开始游戏"); gotoxy(17, 11); printf("2、按键说明"); gotoxy(3, 15); printf("3、游戏规则"); gotoxy(17, 15); printf("4、EXIT"); color(12); gotoxy(1, 20); printf("请输入选择【1、2、3、4】:"); scanf_s("%d", &n); switch (n) { case 1: system("cls"); //清屏 game(); play(); break; case 2: break; case 3: break; case 4: break; } } int main() { title(); sea(); begin(); bingo(); }