C语言实现俄罗斯方块(非图形界面)

mac2022-06-30  24

#include "windows.h" #include <stdlib.h> #include <stdio.h> #include <time.h> #define Aplay 49 #define Mplay 50 #define EXIT 51 #define UP 72 #define DOWN 80 #define LEFT 75 #define RIGHT 77 #define GO_ON 0 #define STOP 1 #define LAST_LINE 27 #define MAX 10000 #define SPEED 40 #define DEFAULT -1 void draw_square();// void draw_map();// void draw_menu();// void start_game();// void over_game();// int check_game();// void win_game(); void move_square();// void check_line();// int check_boundary(); void change_dir(int);// void define_square();// void goto_xy(SHORT x, SHORT y); int choice, sq1, sq2 = 0; int sq[7][4][2], base[MAX][2], base_num, line[26], dir, dir_tmp, score = 0; void update_square(int pos[7][4][2],int cur_sq,int add_x ,int add_y,char ch) { for(int m = 0 ; m < 4 ; m ++) { goto_xy(sq[cur_sq][m][0] + add_x, sq[cur_sq][m][1] + add_y); printf("%c",ch); } } int main(int argc, char *argv[]) { HANDLE fd = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFO cinfo; cinfo.bVisible = 0; cinfo.dwSize = 1; SetConsoleCursorInfo(fd, &cinfo); start_game(); while(choice != EXIT) move_square(); } void start_game() { srand((unsigned)time(NULL)); base_num = 0; draw_menu(); if (choice != EXIT) { draw_map(); draw_square(); } } void draw_menu() { system("CLS"); system("color 3F"); printf("\ ******************************************************************************\n\ * *\n\ * 1、Auto play *\n\ * *\n\ * 2、Mannual play *\n\ * *\n\ * 3、Exit *\n\ * *\n\ ******************************************************************************"); choice = _getch(); dir=_getch(); } void draw_map() { int tmp; system("CLS"); printf("******************************\n"); for (tmp = 0; tmp <= 26;tmp++) printf("* *\n"); printf("******************************"); goto_xy(34,4); printf("next:"); goto_xy(34, 10); printf("score:"); goto_xy(39, 12); printf("000"); goto_xy(34, 16); printf("speed level:"); goto_xy(39, 18); printf(" 10"); } void define_square() { sq[0][0][0] = 13; // ## sq[0][0][1] = 1; // ## sq[0][1][0] = 14; sq[0][1][1] = 1; sq[0][2][0] = 14; sq[0][2][1] = 2; sq[0][3][0] = 13; sq[0][3][1] = 2; sq[1][0][0] = 12; // #### sq[1][0][1] = 1; sq[1][1][0] = 13; sq[1][1][1] = 1; sq[1][2][0] = 14; sq[1][2][1] = 1; sq[1][3][0] = 15; sq[1][3][1] = 1; sq[2][0][0] = 13; // ### sq[2][0][1] = 1; // # sq[2][1][0] = 14; sq[2][1][1] = 1; sq[2][2][0] = 15; sq[2][2][1] = 1; sq[2][3][0] = 13; sq[2][3][1] = 2; sq[3][0][0] = 13; // ### sq[3][0][1] = 1; // # sq[3][1][0] = 14; sq[3][1][1] = 1; sq[3][2][0] = 15; sq[3][2][1] = 1; sq[3][3][0] = 15; sq[3][3][1] = 2; sq[4][0][0] = 13; // # sq[4][0][1] = 1; // ## sq[4][1][0] = 14; // # sq[4][1][1] = 2; sq[4][2][0] = 14; sq[4][2][1] = 3; sq[4][3][0] = 13; sq[4][3][1] = 2; sq[5][0][0] = 13; // # sq[5][0][1] = 3; // ## sq[5][1][0] = 14; // # sq[5][1][1] = 1; sq[5][2][0] = 14; sq[5][2][1] = 2; sq[5][3][0] = 13; sq[5][3][1] = 2; sq[6][0][0] = 13; // ### sq[6][0][1] = 1; // # sq[6][1][0] = 14; sq[6][1][1] = 1; sq[6][2][0] = 14; sq[6][2][1] = 2; sq[6][3][0] = 15; sq[6][3][1] = 1; } void draw_square() { define_square(); dir_tmp = 0; if (sq2 == DEFAULT) sq1 = rand() % 7; else { sq1 = sq2; update_square(sq,sq2,27 ,4,' '); } update_square(sq,sq1,0 ,0,'#'); sq2 = rand() % 7; update_square(sq,sq2,27 ,4,'#'); } void move_square() { if (check_game() == GO_ON) { int tmp; for (tmp = 0; tmp < SPEED; tmp++) { Sleep(2); if (_kbhit() == 1) { _getch(); dir = _getch(); change_dir(dir); } else if (dir == DOWN) break; } update_square(sq,sq1,0 ,0,' '); update_square(sq,sq1,0 ,1,'#'); for(int m = 0 ; m < 4 ; m ++) sq[sq1][m][1]++; } else { dir = 0; if (base[base_num - 4][1] == 1 || base[base_num - 3][1] == 1 || base[base_num - 2][1] == 1 || base[base_num - 1][1] == 1) over_game(); else { check_line(); draw_square(); } } } int check_game() { int tmp; if (base_num == 0) { if (sq[sq1][0][1] == LAST_LINE || sq[sq1][1][1] == LAST_LINE || sq[sq1][2][1] == LAST_LINE || sq[sq1][3][1] == LAST_LINE) { base[base_num][0] =sq[sq1][0][0]; base[base_num++][1] = sq[sq1][0][1]; base[base_num][0] = sq[sq1][1][0]; base[base_num++][1] = sq[sq1][1][1]; base[base_num][0] = sq[sq1][2][0]; base[base_num++][1] = sq[sq1][2][1]; base[base_num][0] = sq[sq1][3][0]; base[base_num++][1] = sq[sq1][3][1]; return STOP; } else return GO_ON; } for (tmp = 0; tmp < base_num;tmp++) if ( (sq[sq1][0][1]+1 == base[tmp][1] && sq[sq1][0][0] == base[tmp][0]) \ || (sq[sq1][1][1]+1 == base[tmp][1] && sq[sq1][1][0] == base[tmp][0]) \ || (sq[sq1][2][1]+1 == base[tmp][1] && sq[sq1][2][0] == base[tmp][0]) \ || (sq[sq1][3][1]+1 == base[tmp][1] && sq[sq1][3][0] == base[tmp][0])\ || sq[sq1][0][1] == LAST_LINE || sq[sq1][1][1] == LAST_LINE || sq[sq1][2][1] == LAST_LINE || sq[sq1][3][1] == LAST_LINE) { base[base_num][0] = sq[sq1][0][0]; base[base_num++][1] = sq[sq1][0][1]; base[base_num][0] = sq[sq1][1][0]; base[base_num++][1] = sq[sq1][1][1]; base[base_num][0] = sq[sq1][2][0]; base[base_num++][1] = sq[sq1][2][1]; base[base_num][0] = sq[sq1][3][0]; base[base_num++][1] = sq[sq1][3][1]; return STOP; } return GO_ON; } void check_line() { int tmp,tmp2; for (tmp = 0; tmp <=27;tmp++) line[tmp] = 0; for (tmp = 0; tmp < base_num;tmp++) { for (tmp2 = 3;tmp2 <= 27;tmp2++) { if (base[tmp][1] == tmp2) line[tmp2 - 1]++; } } for (tmp = 3; tmp <= 27;tmp++) { if (line[tmp] == 28) { int base_copy[MAX][2], tmp3; score += 10; goto_xy(40, 12); printf("%d", score); for (tmp2 = 0, tmp3 = 0; tmp2 < base_num;tmp2++) { if (base[tmp2][1] == (tmp + 1)) { goto_xy(base[tmp2][0], base[tmp2][1]); printf(" "); } else { base_copy[tmp3][0] = base[tmp2][0]; base_copy[tmp3][1] = base[tmp2][1]; tmp3++; } } for (tmp2 = 0;tmp2 < base_num - 28; tmp2++) { base[tmp2][0] = base_copy[tmp2][0]; base[tmp2][1] = base_copy[tmp2][1]; } base_num -= 28; for (tmp2 = 0,tmp3 = 0;tmp2 < base_num; tmp2++) { if (base[tmp2][1] <= tmp) { base_copy[tmp3][0] = base[tmp2][0]; base_copy[tmp3][1] = base[tmp2][1]; tmp3++; ++base[tmp2][1]; } } for (tmp2 = 0; tmp2 < tmp3;tmp2++) { goto_xy(base_copy[tmp2][0], base_copy[tmp2][1]); printf(" "); } for (tmp2 = 0;tmp2 < base_num; tmp2++) { goto_xy(base[tmp2][0], base[tmp2][1]); printf("#"); } } } } int check_boundary() { int tmp; if (sq[sq1][0][1] >= LAST_LINE || sq[sq1][1][1] >= LAST_LINE || sq[sq1][2][1] >= LAST_LINE || sq[sq1][3][1] >= LAST_LINE\ || sq[sq1][0][1] <= 0 || sq[sq1][1][1] <= 0 || sq[sq1][2][1] <= 0 || sq[sq1][3][1] <= 0\ || sq[sq1][0][0] <= 0 || sq[sq1][1][0] <= 0 || sq[sq1][2][0] <= 0 || sq[sq1][3][0] <= 0\ || sq[sq1][0][0] >= 29 || sq[sq1][1][0] >= 29 || sq[sq1][2][0] >= 29 || sq[sq1][3][0] >= 29\ ) return STOP; for (tmp = 0; tmp < base_num;tmp++) if ((sq[sq1][0][1] == base[tmp][1] && sq[sq1][0][0] == base[tmp][0]) \ || (sq[sq1][1][1] == base[tmp][1] && sq[sq1][1][0] == base[tmp][0])\ || (sq[sq1][2][1] == base[tmp][1] && sq[sq1][2][0] == base[tmp][0])\ || (sq[sq1][3][1] == base[tmp][1] && sq[sq1][3][0] == base[tmp][0])) return STOP; return GO_ON; } void change_dir(int dir) { int tmp; update_square(sq,sq1,0 ,0,' '); if (dir == LEFT) { for(int m = 0 ; m < 4 ; m ++) -- sq[sq1][m][0]; if (check_boundary() == STOP) { for(int m = 0 ; m < 4 ; m ++) ++ sq[sq1][m][0]; } } else if (dir == RIGHT) { for(int m = 0 ; m < 4 ; m ++) ++ sq[sq1][m][0]; if (check_boundary() == STOP) { for(int m = 0 ; m < 4 ; m ++) -- sq[sq1][m][0]; } } else if (dir == UP) { if (sq1 == 1 && dir_tmp==0) { sq[sq1][0][0] += 2;sq[sq1][0][1] -= 3; sq[sq1][1][0] += 1;sq[sq1][1][1] -= 2; sq[sq1][2][0] -= 0;sq[sq1][2][1] -= 1; sq[sq1][3][0] -= 1;sq[sq1][3][1] -= 0; dir_tmp=1; if (check_boundary() == STOP) { sq[sq1][0][0] -= 2;sq[sq1][0][1] += 3; sq[sq1][1][0] -= 1;sq[sq1][1][1] += 2; sq[sq1][2][0] -= 0;sq[sq1][2][1] += 1; sq[sq1][3][0] += 1;sq[sq1][3][1] += 0; dir_tmp = 0; } } else if (sq1 == 1 && dir_tmp == 1) { sq[sq1][0][0] -= 2;sq[sq1][0][1] += 3; sq[sq1][1][0] -= 1;sq[sq1][1][1] += 2; sq[sq1][2][0] -= 0;sq[sq1][2][1] += 1; sq[sq1][3][0] += 1;sq[sq1][3][1] += 0; dir_tmp = 0; if (check_boundary() == STOP) { sq[sq1][0][0] += 2;sq[sq1][0][1] -= 3; sq[sq1][1][0] += 1;sq[sq1][1][1] -= 2; sq[sq1][2][0] -= 0;sq[sq1][2][1] -= 1; sq[sq1][3][0] -= 1;sq[sq1][3][1] -= 0; dir_tmp = 1; } } else if (sq1 == 4 && dir_tmp == 0) { sq[sq1][0][0] += 2; sq[sq1][2][1] -= 2; dir_tmp = 1; if (check_boundary() == STOP) { sq[sq1][0][0] -= 2; sq[sq1][2][1] += 2; dir_tmp = 0; } } else if (sq1 == 4 && dir_tmp == 1) { sq[sq1][0][0] -= 2; sq[sq1][2][1] += 2; dir_tmp = 0; if (check_boundary() == STOP) { sq[sq1][0][0] += 2; sq[sq1][2][1] -= 2; dir_tmp = 1; } } else if (sq1 == 5 && dir_tmp == 0) { sq[sq1][0][1] -= 2; sq[sq1][3][0] += 2; dir_tmp = 1; if (check_boundary() == STOP) { sq[sq1][0][1] += 2; sq[sq1][3][0] -= 2; dir_tmp = 0; } } else if (sq1 == 5 && dir_tmp == 1) { sq[sq1][0][1] += 2; sq[sq1][3][0] -= 2; dir_tmp = 0; if (check_boundary() == STOP) { sq[sq1][0][1] -= 2; sq[sq1][3][0] += 2; dir_tmp = 1; } } else if (sq1 == 6 && dir_tmp == 0) { sq[sq1][3][0] -= 1;sq[sq1][3][1] -= 1; dir_tmp = 1; if (check_boundary() == STOP) { sq[sq1][3][0] += 1;sq[sq1][3][1] += 1; dir_tmp = 0; } } else if (sq1 == 6 && dir_tmp == 1) { sq[sq1][2][0] += 1;sq[sq1][2][1] -= 1; dir_tmp = 2; if (check_boundary() == STOP) { sq[sq1][2][0] -= 1;sq[sq1][2][1] += 1; dir_tmp = 1; } } else if (sq1 == 6 && dir_tmp == 2) { sq[sq1][0][0] += 1;sq[sq1][0][1] += 1; dir_tmp = 3; if (check_boundary() == STOP) { sq[sq1][0][0] -= 1;sq[sq1][0][1] -= 1; dir_tmp = 2; } } else if (sq1 == 6 && dir_tmp == 3) { sq[sq1][3][0] += 1;sq[sq1][3][1] += 1; sq[sq1][0][0] -= 1;sq[sq1][0][1] -= 1; sq[sq1][2][0] -= 1;sq[sq1][2][1] += 1; dir_tmp = 0; if (check_boundary() == STOP) { sq[sq1][3][0] -= 1;sq[sq1][3][1] -= 1; sq[sq1][0][0] += 1;sq[sq1][0][1] += 1; sq[sq1][2][0] += 1;sq[sq1][2][1] -= 1; dir_tmp = 3; } } else if (sq1 == 2 && dir_tmp == 0) { sq[sq1][3][0] += 2; sq[sq1][0][0] += 2;sq[sq1][0][1] += 2; dir_tmp = 1; if (check_boundary() == STOP) { sq[sq1][3][0] -= 2; sq[sq1][0][0] -= 2;sq[sq1][0][1] -= 2; dir_tmp = 0; } } else if (sq1 == 2 && dir_tmp == 1) { sq[sq1][1][1] += 1; sq[sq1][0][0] -= 2; sq[sq1][0][1] -= 1; dir_tmp = 2; if (check_boundary() == STOP) { sq[sq1][1][1] -= 1; sq[sq1][0][0] += 2; sq[sq1][0][1] += 1; dir_tmp = 1; } } else if (sq1 == 2 && dir_tmp == 2) { sq[sq1][2][0] -= 2; sq[sq1][3][0] -= 2; sq[sq1][3][1] -= 2; dir_tmp = 3; if (check_boundary() == STOP) { sq[sq1][2][0] += 2; sq[sq1][3][0] += 2; sq[sq1][3][1] += 2; dir_tmp = 2; } } else if (sq1 == 2 && dir_tmp == 3) { sq[sq1][2][0] += 2; sq[sq1][0][1] -= 1; sq[sq1][1][1] -= 1; sq[sq1][3][1] += 2; dir_tmp = 0; if (check_boundary() == STOP) { sq[sq1][2][0] -= 2; sq[sq1][0][1] += 1; sq[sq1][1][1] += 1; sq[sq1][3][1] -= 2; dir_tmp = 3; } } else if (sq1 == 3 && dir_tmp == 0) { sq[sq1][1][1] += 1; sq[sq1][0][0] += 2;sq[sq1][0][1] -= 1; dir_tmp = 1; if (check_boundary() == STOP) { sq[sq1][1][1] -= 1; sq[sq1][0][0] -= 2; sq[sq1][0][1] += 1; dir_tmp = 0; } } else if (sq1 == 3 && dir_tmp == 1) { sq[sq1][2][0] -= 2; sq[sq1][2][1] += 1; sq[sq1][0][0] -= 2; sq[sq1][0][1] += 1; dir_tmp = 2; if (check_boundary() == STOP) { sq[sq1][2][0] += 2; sq[sq1][2][1] -= 1; sq[sq1][0][0] += 2; sq[sq1][0][1] -= 1; dir_tmp = 1; } } else if (sq1 == 3 && dir_tmp == 2) { sq[sq1][1][1] -= 1; sq[sq1][3][0] -= 2; sq[sq1][3][1] += 1; dir_tmp = 3; if (check_boundary() == STOP) { sq[sq1][1][1] += 1; sq[sq1][3][0] -= 2; sq[sq1][3][1] -= 1; dir_tmp = 2; } } else if (sq1 == 3 && dir_tmp == 3) { sq[sq1][2][0] += 2; sq[sq1][2][1] -= 1; sq[sq1][3][0] += 2; sq[sq1][3][1] -= 1; dir_tmp = 0; if (check_boundary() == STOP) { sq[sq1][2][0] -= 2; sq[sq1][2][1] += 1; sq[sq1][3][0] -= 2; sq[sq1][3][1] += 1; dir_tmp = 3; } } } update_square(sq,sq1,0 ,0,'#'); } void over_game() { goto_xy(10, 13); printf("Game over!!!"); getchar(); start_game(); } void goto_xy(SHORT x, SHORT y) //调用系统接口实现移动光标位置 { HANDLE hOut; hOut = GetStdHandle(STD_OUTPUT_HANDLE); COORD pos = { x,y }; SetConsoleCursorPosition(hOut, pos); }
最新回复(0)