2048游戏
代码有问题有待优化
#include#include #include int board[4][4]; int score; int i,j; int fl_count=1; void beg(){ printf(" 游戏名: 2048 分数:n"); printf(" --------------------------------------------------nn"); // 绘制表格和数字 printf(" ┌────┬────┬────┬────┐n"); printf(" │"); printf(" │"); printf(" 2 │"); printf(" 8 │"); printf(" 4 │"); printf("n"); printf(" ├────┼────┼────┼────┤n"); printf(" │"); printf(" │"); printf(" 8 │"); printf(" 4 │"); printf(" 2 │"); printf("n"); printf(" ├────┼────┼────┼────┤n"); printf(" │"); printf(" 2 │"); printf(" │"); printf(" │"); printf(" │"); printf("n"); printf(" ├────┼────┼────┼────┤n"); // printf("n"); printf(" │"); printf(" │"); printf(" │"); printf(" │"); printf(" │"); printf("n"); printf(" └────┴────┴────┴────┘n"); printf("n"); printf(" --------------------------------------------------n"); printf(" W↑ A← →D ↓S"); printf("n 输 入 任 意 字 母 开 始 游 戏n"); char str; scanf("%c",&str); } void refresh_show(){ // 重设光标输出位置方式清屏可以减少闪烁,system("cls")为备用清屏命令,均为Windows平台相关 COORD pos = { 0, 0 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); // system("cls"); printf(" ┌────┬────┬────┬────┐n"); for( i=0; i<4; i++) { printf(" │"); for( j=0; j<4; j++) { if(board[i][j]!=0) printf("%4d│",board[i][j]); else printf(" │"); } printf("n"); if(i<3) printf(" ├────┼────┼────┼────┤n"); } printf(" └────┴────┴────┴────┘n"); } void moveLeft() { int flag=-1; for(i=0;i<4;i++) { for(j=0;j<4;j++) { int cell=board[i][j]; if(cell!=0) { int k=j+1; while(k<4) { int nextcell=board[i][k]; if(nextcell!=0) { if(cell==nextcell) { flag=0; board[i][j]+=board[i][k]; score+=board[i][j]; board[i][k]=0; } k=4; break; } k++; } } } } for(i=0;i<4;i++) { for(j=0;j<4-1;j++) { int cell=board[i][j]; if(cell==0) { int k=j+1; while(k<4) { int nextcell=board[i][k]; if(nextcell!=0) { flag=0;// board[i][j]=nextcell; board[i][k]=0; k=4; } k++; } } } } } void moveRight() { int flag=-1; for(i=0;i<4;i++) { for(j=3;j>=0;j--) { int cell=board[i][j]; if(cell!=0) { int k=j-1; while(k>=0) { int nextcell=board[i][k]; if(nextcell!=0) { if(cell==nextcell) { flag=0; board[i][j]+=board[i][k]; score+=board[i][j]; board[i][k]=0; } k=-1; break; } k--; } } } } for(i=0;i<4;i++) { for(j=3;j>0;j--) { int cell=board[i][j]; if(cell==0) { int k=j-1; while(k>=0) { int nextcell=board[i][k]; if(nextcell!=0) { flag=0; board[i][j]=nextcell; board[i][k]=0; k=-1; } k--; } } } } } void moveDown() { score=0; int flag=-1; for(i=3;i>=0;i--) { for(j=0;j<4;j++) { int cell=board[i][j]; if(cell!=0) { int k=i-1; while(k>=0) { int nextcell=board[k][j]; if(nextcell!=0) { if(board[i][j]==board[k][j]) { flag=0; board[i][j]+=board[k][j]; score+=board[i][j]; board[k][j]=0; } k=0; break; } k--; } } } } for(i=3;i>0;i--) { for(j=0;j<4;j++) { int cell=board[i][j]; if(cell==0) { int k=i-1; while(k>=0) { int nextcell=board[k][j]; if(nextcell!=0) { flag=0; board[i][j]=nextcell; board[k][j]=0; k=0; } k--; } } } } } void moveUp() { int flag=-1; for(i=0;i<4;i++) { for(j=0;j<4;j++) { int cell=board[i][j]; if(cell!=0) { int k=i+1; while(k<4) { int nextcell=board[k][j]; if(nextcell!=0) { if(cell==nextcell) { flag=0; board[i][j]+=board[k][j]; score+=board[i][j]; board[k][j]=0; } k=4; break; } k++; } } } } for(i=0;i<3;i++) { for(j=0;j<4;j++) { int cell=board[i][j]; if(cell==0) { int k=i+1; while(k<4) { int nextcell=board[k][j]; if(nextcell!=0) { flag=0; board[i][j]=nextcell; board[k][j]=0; k=4; } k++; } } } } } int get_null_count(){ int sum=0; for( i=0; i<4; i++) { for( j=0; j<4; j++) { if(board[i][j]==0) { sum++; } } } return sum; } void add_rand_num(){ srand(time(0)); int n = rand() % get_null_count();// 确定在何处空位置生成随机数 int i,j; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { if (board[i][j] == 0) { if (n-- == 0) //定位待生成的位置 { board[i][j] = (rand() % 3 ? 2 : 4);//rand() % 3的值为真(1或2)取前值2,反之,取 4 ,保证生成 2 的概率是 4 的 2 倍 return; } } } } } void dir(){ char ch; scanf("%c",&ch); int a=0; if(ch=='w') moveUp(); if(ch=='s') moveDown(); if(ch=='a') moveLeft(); if(ch=='d') moveRight(); } int if_game_over; // 检查游戏是否结束 函数定义 void check_game_over(){ int fl=0; // if_game_over=0,游戏不结束,=1游戏结束 for ( i = 0; i < 4; i++) { if(fl==1) break; for ( j = 0; j < 3; j++) { if (board[i][j] == board[i][j + 1]) { //如果有相等的就是可以合成,游戏还没有结束 fl=1; break; } if (board[j][i] == board[j + 1][i]) { fl=1; break; } } } if(fl==1) if_game_over=0; else if_game_over=1; } void reset_game(){ score = 0; if_game_over = 0; // 了解到游戏初始化时出现的两个数一定会有个 2,所以先随机生成一个 2,其他均为 0 int n = rand() % 16; int i,j; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { board[i][j] = (n-- == 0 ? 2 : 0); } } // 前面已经生成了一个2,这里再生成一个随机的2或者4,且设定生成2的概率是4的两倍 add_rand_num(); // 在这里刷新界面并显示的时候,界面上已经默认出现了两个数字,其他的都为空(值为0) system("cls"); refresh_show(); } int main() { beg(); reset_game(); while(1) { check_game_over(); if(if_game_over==1) { COORD pos = { 0, 0 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); system("cls"); break; } char c; getchar(); dir(); add_rand_num(); check_game_over(); if(if_game_over==1) { COORD pos = { 0, 0 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); system("cls"); break; } refresh_show(); } COORD pos = { 0, 0 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); system("cls"); printf("Game Overn"); return 0; }



