新手用c編的2048小遊戲
新手新學的c語言無聊編了一個2048的小遊戲
演算法和細節方面都還有待加強
歡迎討論啊
//i代表行 j代表列#include"stdio.h"#include "stdlib.h"#include "time.h"#include "ctype.h"void suijiweizhi(int num[4][4]);//產生隨機的2void inw(int num[4][4]);void ina(int num[4][4]);void ins(int num[4][4]);void ind(int num[4][4]);void shuchu(int num[4][4]);//輸出遊戲界面int main(){ int num[4][4],i,j; char shuru; for (i=0;i<4;i++)//遊戲置零 for (j=0;j<4;j++) num[i][j]=0; while(1)//遊戲開始 { printf("-------------------------
"); printf(" welcome to 4x4 2048 game
"); printf(" made by Yves
"); printf("1.輸入wasd來決定移動方向(大小寫都可以)
"); printf("2.若多次提示錯誤先輸入回車再輸入方向
"); printf("3.一次只能輸入一個字母多了有奇怪的bug
"); printf("-------------------------
"); printf(" after move
"); shuchu(num); printf(" new number
"); suijiweizhi(num);//隨機地方出現2 shuchu(num);//輸出遊戲界面 printf("-------------------------
"); loop:printf("your direction is(wasd):"); scanf("%c",&shuru); getchar(); system("cls"); switch(tolower(shuru)) { case w:inw(num); break; case a:ina(num); break; case s:ins(num); break; case d:ind(num); break; default :printf("wrong,please press again
"); goto loop; break; } } return 0;}void shuchu(int num[4][4])//輸出遊戲界面{ int i,j; for (i=0;i<(4);i++) { for (j=0;j<(4);j++) if (num[i][j]==0) printf(" _"); else printf("%5d",num[i][j]); printf("
"); }}void suijiweizhi(int num[4][4])//生成隨機{ int i,j,k,panduan,max=0; panduan=0; srand((unsigned)time( NULL )); for (i=0;i<4;i++)//檢查是否沒有地方生成新數字 for (j=0;j<4;j++) if (num[i][j]==0) panduan=1; if (panduan!=1) { printf(".........................
"); printf(" game over
"); for (i=0;i<4;i++) for (j=0;j<4;j++) if (max<(num[i][j])) max=num[i][j]; printf("the Biggest number is %d
",max); system("pause"); exit(0); } else//隨機生成2 4 { again:i=rand()%(4+1)+0; j=rand()%(4+1)+0; k=rand()%2+1; if (num[i][j]==0) num[i][j]=k*2; else goto again; } }void inw(int num[4][4]){ int i,j,a; for (a=0;a<4;a++)//先移動 for(j=0;j<4;j++) for(i=0;i<4;i++) if (num[i][j]==0) if (i==3) continue; else { num[i][j]=num[i+1][j]; num[i+1][j]=0; } for(j=0;j<4;j++)//求和 { a=0; for(i=0;i<3;i++) if(num[i][j]!=num[i+1][j]) a=1;//a=0代表這列1234行全相等 if (a==0)//4個數全相等 { num[0][j]=num[0][j]*2; num[1][j]=num[0][j]; num[2][j]=num[3][j]=0; continue; } if (num[0][j]==num[1][j] && num[2][j]==num[3][j] && num[1][j]!=num[2][j])//1和2相等 3和4相等 { num[0][j]=num[0][j]*2; num[1][j]=num[2][j]*2; num[2][j]=num[3][j]=0; continue; } if (num[0][j]==num[1][j])//1和2相等 { num[0][j]=num[0][j]*2; num[1][j]=num[2][j]; num[2][j]=num[3][j]; num[3][j]=0; continue; } if (num[1][j]==num[2][j])//2和3相等 { num[1][j]=num[1][j]*2; num[2][j]=num[3][j]; num[3][j]=0; continue; } if (num[2][j]==num[3][j])//3和4相等 { num[2][j]=num[2][j]*2; num[3][j]=0; continue; } }} void ina(int num[4][4]){ int i,j,a; for (a=0;a<4;a++)//先移動 for(i=0;i<4;i++) for(j=0;j<4;j++) if (num[i][j]==0) if (j==3) continue; else { num[i][j]=num[i][j+1]; num[i][j+1]=0; } for(i=0;i<4;i++)//求和 { a=0; for(j=0;j<3;j++) if(num[i][j]!=num[i][j+1]) a=1;//a=0代表這列1234列全相等 if (a==0)//4個數全相等 { num[i][0]=num[i][0]*2; num[i][1]=num[i][0]; num[i][2]=num[i][3]=0; continue; } if (num[i][0]==num[i][1] && num[i][2]==num[i][3] && num[i][1]!=num[i][2])//1列和2列相等 3列和4列相等 { num[i][0]=num[i][0]*2; num[i][1]=num[i][2]*2; num[i][2]=num[i][3]=0; continue; } if (num[i][0]==num[i][1])//1和2相等 { num[i][0]=num[i][0]*2; num[i][1]=num[i][2]; num[i][2]=num[i][3]; num[i][3]=0; continue; } if (num[i][1]==num[i][2])//2和3相等 { num[i][1]=num[i][1]*2; num[i][2]=num[i][3]; num[i][3]=0; continue; } if (num[i][2]==num[i][3])//3和4相等 { num[i][2]=num[i][2]*2; num[i][3]=0; continue; } }}void ins(int num[4][4]){ int i,j,a; for (a=0;a<4;a++)//先移動 for(j=0;j<4;j++) for(i=3;i>=0;i--) if (num[i][j]==0) if (i==0) continue; else { num[i][j]=num[i-1][j]; num[i-1][j]=0; } for(j=0;j<4;j++)//求和 { a=0; for(i=0;i<3;i++) if(num[i][j]!=num[i+1][j]) a=1;//a=0代表這列1234行全相等 if (a==0)//4個數全相等 { num[3][j]=num[3][j]*2; num[2][j]=num[3][j]; num[1][j]=num[0][j]=0; continue; } if (num[0][j]==num[1][j] && num[2][j]==num[3][j] && num[1][j]!=num[2][j])//1和2相等 3和4相等 { num[3][j]=num[3][j]*2; num[2][j]=num[1][j]*2; num[0][j]=num[1][j]=0; continue; } if (num[2][j]==num[3][j])//3和4相等 { num[3][j]=num[3][j]*2; num[2][j]=num[1][j]; num[1][j]=num[0][j]; num[0][j]=0; continue; } if (num[1][j]==num[2][j])//2和3相等 { num[2][j]=num[2][j]*2; num[1][j]=num[0][j]; num[0][j]=0; continue; } if (num[0][j]==num[1][j])//1和2相等 { num[1][j]=num[1][j]*2; num[0][j]=0; continue; } }}void ind(int num[4][4]){ int i,j,a; for (a=0;a<4;a++)//先移動 for(i=0;i<4;i++) for(j=3;j>=0;j--) if (num[i][j]==0) if (j==0) continue; else { num[i][j]=num[i][j-1]; num[i][j-1]=0; } for(i=0;i<4;i++)//求和 { a=0; for(j=0;j<3;j++) if(num[i][j]!=num[i][j+1]) a=1;//a=0代表這列1234列全相等 if (a==0)//4個數全相等 { num[i][3]=num[i][3]*2; num[i][2]=num[i][2]; num[i][0]=num[i][1]=0; continue; } if (num[i][0]==num[i][1] && num[i][2]==num[i][3] && num[i][1]!=num[i][2])//1列和2列相等 3列和4列相等 { num[i][3]=num[i][3]*2; num[i][2]=num[i][1]*2; num[i][0]=num[i][1]=0; continue; } if (num[i][2]==num[i][3])//3和4相等 { num[i][3]=num[i][3]*2; num[i][2]=num[i][1]; num[i][1]=num[i][0]; num[i][0]=0; continue; } if (num[i][1]==num[i][2])//2和3相等 { num[i][2]=num[i][2]*2; num[i][1]=num[i][0]; num[i][0]=0; continue; } if (num[i][0]==num[i][1])//1和2相等 { num[i][1]=num[i][1]*2; num[i][0]=0; continue; } } }
新手
推薦閱讀:
※C++的函數指針問題?
※共用體只能同時儲存一個值嗎?
※如何使自己寫的編譯器生成可在 Windows 或 Linux 下直接運行的可執行文件?
※c++哪個json序列化庫好?