/* 1.0 */ #include #include #include #include int i,j; int arr[7][9]={0}; int grade=0; //地图输出 int map(){ for(i=1;i<=5;i+=2){ for(j=1;j<=7;j+=2) arr[i][j]=5; } for(i=0;i<=6;i++){ for(j=0;j<=8;j+=2) arr[i][j]=7; } for(i=1;i<=5;i+=2){ for(j=2;j<=6;j+=2) arr[i][j]=9; } printf("*********************\n"); printf("*****Grade:%5d*****\n",grade); printf("*********************\n"); for(i=0;i<=6;i++){ for(j=0;j<=8;j++){ if(arr[i][j]==7) printf("|"); else if(arr[i][j]==5) printf(" -- "); else if(arr[i][j]==9) printf("+"); else if(arr[i][j]==0) printf(" "); else printf("%4d",arr[i][j]); } printf("\n"); } printf("*********************\n"); } int move(){ char direction; int n=1,m=0; printf("请输入方向:w为上,s为下,a为左,d为右\n"); scanf("%c",&direction); scanf("%*c"); switch(direction){ case 'w':{ /* 移动 */ //每一列的移动 for(j=1;j<=7;j+=2){ if(arr[0][j]==0){ n=0; for(i=0;i<=6;i+=2){ if(arr[i][j]!=0){ arr[n][j]=arr[i][j]; arr[i][j]=0; n+=2; } } continue; } else if(arr[2][j]==0){ n=2; for(i=2;i<=6;i+=2){ if(arr[i][j]!=0){ arr[n][j]=arr[i][j]; arr[i][j]=0; n+=2; } } continue; } else if(arr[4][j]==0){ n=4; for(i=4;i<=6;i+=2){ if(arr[i][j]!=0){ arr[n][j]=arr[i][j]; arr[i][j]=0; n+=2; } } continue; } } //相加相邻的数 for(j=1;j<=7;j+=2){ for(i=0;i<=6;i+=2){ if(arr[i][j]==arr[i+2][j] && arr[i][j]!=0){ arr[i][j]=2*arr[i][j]; arr[i+2][j]=0; } } } //每一列的移动 for(j=1;j<=7;j+=2){ if(arr[0][j]==0){ n=0; for(i=0;i<=6;i+=2){ if(arr[i][j]!=0){ arr[n][j]=arr[i][j]; arr[i][j]=0; n+=2; } } continue; } else if(arr[2][j]==0){ n=2; for(i=2;i<=6;i+=2){ if(arr[i][j]!=0){ arr[n][j]=arr[i][j]; arr[i][j]=0; n+=2; } } continue; } else if(arr[4][j]==0){ n=4; for(i=4;i<=6;i+=2){ if(arr[i][j]!=0){ arr[n][j]=arr[i][j]; arr[i][j]=0; n+=2; } } continue; } } //最后一行随机分配一个数 if(arr[6][1]!=0 && arr[6][3]!=0 && arr[6][5]!=0 && arr[6][7]!=0){ break; } else{ for(;;){ m=(rand()%4)*2+1; if(arr[6][m]==0){ arr[6][m]=(rand()%2+1)*2; break; } } } //结束'w' break; } case 's':{ //移动 //每一列的移动 for(j=1;j<=7;j+=2){ if(arr[6][j]==0){ n=6; for(i=6;i>=0;i-=2){ if(arr[i][j]!=0){ arr[n][j]=arr[i][j]; arr[i][j]=0; n-=2; } } continue; } else if(arr[4][j]==0){ n=4; for(i=4;i>=0;i-=2){ if(arr[i][j]!=0){ arr[n][j]=arr[i][j]; arr[i][j]=0; n-=2; } } continue; } else if(arr[2][j]==0){ n=2; for(i=2;i>=0;i-=2){ if(arr[i][j]!=0){ arr[n][j]=arr[i][j]; arr[i][j]=0; n-=2; } } continue; } } //相加相邻的数 for(j=1;j<=7;j+=2){ for(i=0;i<=6;i+=2){ if(arr[i][j]==arr[i+2][j] && arr[i][j]!=0){ arr[i][j]=2*arr[i][j]; arr[i+2][j]=0; } } } //每一列的移动 for(j=1;j<=7;j+=2){ if(arr[6][j]==0){ n=6; for(i=6;i>=0;i-=2){ if(arr[i][j]!=0){ arr[n][j]=arr[i][j]; arr[i][j]=0; n-=2; } } continue; } else if(arr[4][j]==0){ n=4; for(i=4;i>=0;i-=2){ if(arr[i][j]!=0){ arr[n][j]=arr[i][j]; arr[i][j]=0; n-=2; } } continue; } else if(arr[2][j]==0){ n=2; for(i=2;i>=0;i-=2){ if(arr[i][j]!=0){ arr[n][j]=arr[i][j]; arr[i][j]=0; n-=2; } } continue; } } //最后一行随机分配一个数 if(arr[0][1]!=0 && arr[0][3]!=0 && arr[0][5]!=0 && arr[0][7]!=0){ break; } else{ for(;;){ m=(rand()%4)*2+1; if(arr[0][m]==0){ arr[0][m]=(rand()%2+1)*2; break; } } } //结束's' break; } case 'a':{ //移动 //每一行的移动 for(i=0;i<=6;i+=2){ if(arr[i][1]==0){ n=1; for(j=1;j<=7;j+=2){ if(arr[i][j]!=0){ arr[i][n]=arr[i][j]; arr[i][j]=0; n+=2; } } continue; } else if(arr[i][3]==0){ n=3; for(j=3;j<=7;j+=2){ if(arr[i][j]!=0){ arr[i][n]=arr[i][j]; arr[i][j]=0; n+=2; } } continue; } else if(arr[i][5]==0){ n=5; for(j=5;j<=7;j+=2){ if(arr[i][j]!=0){ arr[i][n]=arr[i][j]; arr[i][j]=0; n+=2; } } continue; } } //相加相邻的数 for(i=0;i<=6;i+=2){ for(j=1;j<=7;j+=2){ if(arr[i][j]==arr[i][j+2] && arr[i][j]!=0){ arr[i][j]=2*arr[i][j]; arr[i][j+2]=0; } } } //每一行的移动 for(i=0;i<=6;i+=2){ if(arr[i][1]==0){ n=1; for(j=1;j<=7;j+=2){ if(arr[i][j]!=0){ arr[i][n]=arr[i][j]; arr[i][j]=0; n+=2; } } continue; } else if(arr[i][3]==0){ n=3; for(j=3;j<=7;j+=2){ if(arr[i][j]!=0){ arr[i][n]=arr[i][j]; arr[i][j]=0; n+=2; } } continue; } else if(arr[i][5]==0){ n=5; for(j=5;j<=7;j+=2){ if(arr[i][j]!=0){ arr[i][n]=arr[i][j]; arr[i][j]=0; n+=2; } } continue; } } //最后一行随机分配一个数 if(arr[0][7]!=0 && arr[2][7]!=0 && arr[4][7]!=0 && arr[6][7]!=0){ break; } else{ for(;;){ m=(rand()%4)*2; if(arr[m][7]==0){ arr[m][7]=(rand()%2+1)*2; break; } } } //结束'a' break; } case 'd':{ //移动 //每一行的移动 for(i=0;i<=6;i+=2){ if(arr[i][7]==0){ n=7; for(j=7;j>=1;j-=2){ if(arr[i][j]!=0){ arr[i][n]=arr[i][j]; arr[i][j]=0; n-=2; } } continue; } else if(arr[i][5]==0){ n=5; for(j=5;j>=1;j-=2){ if(arr[i][j]!=0){ arr[i][n]=arr[i][j]; arr[i][j]=0; n-=2; } } continue; } else if(arr[i][3]==0){ n=3; for(j=3;j>=1;j-=2){ if(arr[i][j]!=0){ arr[i][n]=arr[i][j]; arr[i][j]=0; n-=2; } } continue; } } //相加相邻的数 for(i=0;i<=6;i+=2){ for(j=1;j<=7;j+=2){ if(arr[i][j]==arr[i][j+2] && arr[i][j]!=0){ arr[i][j]=2*arr[i][j]; arr[i][j+2]=0; } } } //每一行的移动 for(i=0;i<=6;i+=2){ if(arr[i][7]==0){ n=7; for(j=7;j>=1;j-=2){ if(arr[i][j]!=0){ arr[i][n]=arr[i][j]; arr[i][j]=0; n-=2; } } continue; } else if(arr[i][5]==0){ n=5; for(j=5;j>=1;j-=2){ if(arr[i][j]!=0){ arr[i][n]=arr[i][j]; arr[i][j]=0; n-=2; } } continue; } else if(arr[i][3]==0){ n=3; for(j=3;j>=1;j-=2){ if(arr[i][j]!=0){ arr[i][n]=arr[i][j]; arr[i][j]=0; n-=2; } } continue; } } //最后一行随机分配一个数 if(arr[0][1]!=0 && arr[2][1]!=0 && arr[4][1]!=0 && arr[6][1]!=0){ break; } else{ for(;;){ m=(rand()%4)*2; if(arr[m][1]==0){ arr[m][1]=(rand()%2+1)*2; break; } } } //结束'd' break; } default: printf("输入不正确请重新输入\n"); } } int mark(){ grade=0; for(i=0;i<=6;i+=2){ for(j=1;j<=7;j+=2){ grade=grade+arr[i][j]; } } } bool over(){ int num=0; for(j=1;j<=7;j+=2){ for(i=2;i<=6;i+=2){ if(arr[i][j]!=arr[i-2][j]&&arr[i][j]!=0){ num++; } } } for(j=1;j<=7;j+=2){ for(i=0;i<=4;i+=2){ if(arr[i][j]!=arr[i+2][j]&&arr[i][j]!=0){ num++; } } } for(i=0;i<=6;i+=2){ for(j=1;j<=5;j+=2){ if(arr[i][j]!=arr[i][j+2]&&arr[i][j]!=0){ num++; } } } for(i=0;i<=6;i+=2){ for(j=3;j<=7;j+=2){ if(arr[i][j]!=arr[j-2][j]&&arr[i][j]!=0){ num++; } } } if(num==48){ return true; } else if(num<48){ return false; } } int file(int new_grade){ int old_grade=0; FILE *fp=fopen("grade.bin","wb+"); if(fp){ fread(&old_grade,sizeof(int),1,fp); } } int main(){ srand(time(0)); //随机赋值 for(i=1;i<=4;i++){ arr[(rand()%4)*2][(rand()%4)*2+1]=(rand()%2+1)*2; } map(); while(1){ move(); mark(); system("clear"); map(); if(over()){ printf("******Game Over******\n"); printf("*********************\n"); break; } } printf("**你的分数是:%5d***\n",grade); printf("*********************\n"); return 0; }