赞
踩
1.如何做到打印外面的方框。
- void Game_printf()
- {
- int i,k,j;
- printf("SCORE = %d\n", score);
- for (i=0;i<high;i++) //从第一行开始打印,由上往下。
- {
- for (k=0;k<4;k++) //画出每一行的格子分割线。
- {
- printf(" ");
- for(j=0;j<4;j++)
- {
- printf("-");
- }
- }
- printf("\n");
- for (k=0;k<4;k++)
- {
- printf("|");
- if (array[i][k]!=0) //如果这个不为0则将这个数打出来
- {
- printf("%4d", array[i][k]);
- }
- else //如果这个数是0的话,则打印空格。
- {
- for (j=0; j<4;j++)
- {
- printf(" ");
- }
- }
-
- }
- printf("|\n");
- if (i==high-1) //当i位于最后一行的时候,不需要用分割线来进行分割。
- {
- for (k=0; k<4; k++)
- {
- printf(" ");
- for (j=0; j<4; j++)
- {
- printf("-"); //打出最下面的底线。
- }
- }
- printf("\n");
- }
- }
- printf("使用上下左右或者wasd来进行游戏操作\n"); //提示本游戏的键位设置,应该如何玩这个游戏。
- }
对于打印方框来说,用好其他的符号,便可以很好的打印这个边框。
每一个空格占四个格子,在进行输出的时候,如果是零,为了美观,我们将这个用四个空格来进行代替。如果是其他的数字,那么就用%4d来输出,那样,数字就会正好的在中间。
- void Game_ranf() //生成一个随机数。
- {
- int x,y,t;
- do{
- x=rand()%4;
- y=rand()%4;
- }while(array[x][y]); //只有在等于0的空格上随机出现。
- t=rand()%10;
- if(t==4) //设置概率,当t随机出来为4的时候,赋值给array[x][y]
- array[x][y]=4;
- else //否则就是将2赋值给数组空白地方
- array[x][y]=2;
- }
2.当知道如何打印格子之后,我们就要开始我们的第一步,根据2048的游戏规则,我么在最开始的时候,我们需要先生成两个随机数,那么我们应该如何来生成着两个随机数呢。
我们可以采用rand(),函数来进行我们的随机数输出,因为是随机生成2或者4,并且我们的2生成的概率要大于四。我们先定义一个xy,来进行位置的输出,如果x和y的数组不是零,那么重新进行随机数的赋值。当然我们还需要注意一个,我们的随机数很多,但是我们的随机数应该被四除取余数。
- int Game_win()
- {
- int i,j;
- for(i=0;i<4;i++)
- {
- for(j=0;j<4;j++)
- {
- if(array[i][j]==2048)
- return 1;
- if(array[i][j]==0)
- return 0;
- }
- }
- return -1;
- }
我们还需要写一个来判断输赢的函数,进行暴力搜索,如果有2048,那么就返回1,则代表游戏已经赢了,如果是0,那么返回为0,表示游戏继续,当搜索完成之后,任然没有找到2048或者0,那么我们的游戏就输了。返回-1;
- void move_left()
- {
- int i,j,k;
- for(i=0;i<4;i++) //从第一行开始,然后一个一个的来进行左移;
- {
- k=0; //用k来当最左边的那个列元素。
- for(j=1;j<4;j++) //从这一行的第二个开始来进行判断。
- {
- if(array[i][j]!=0) //判断这个地方的元素是不是等于零,如果等于零,直接下一个。
- {
- if(array[i][k]==0) //如果第一个等于零,把第一个的元素往右边移动。
- {
- array[i][k]=array[i][j];
- array[i][j]=0; //移动之后,原本的那个元素变成了零。
- }
- else //如果不等于零,那么分为两种情况,一种是两个元素相等,一个是不相等。
- if(array[i][k]==array[i][j]) //如果两个元素相等,那么相加,然后到最左边,之后k++;
- {
- array[i][k]=2*array[i][k];
- score+=array[i][k];
- array[i][j]=0; //原本的那个元素变为了零。
- k++;
- }
- else //如果两个元素不相同,那么就是碰撞。
- {
- k++; //首先先加跳到下一个
- array[i][k]=array[i][j]; //将下一个值赋给k。
- if (j!=k) //如果j不等于k的值,那么就是直接将j的那个元素变为0;
- {
- array[i][j]=0;
- }
- }
- }
- }
- }
- }
现在到了我们整个程序最复杂的地方了,我们拿往左边移动来进行举例说明,既然是往左边移动,那么我们就从左边开始我们的循环,设置三个变量,首先用k来当最左边的那个数,在将j赋值1从第二个开始我们的计算查找,如果等于零,那么往后继续走,但是k的值不变,如果碰见不等于的值,那么将k与j的元素互换,相当于j转移到了最左边的地方。如果两个元素相同,将右边的那个置零,左边的元素乘2,那样子,我们等到了合成的式子,如果不是一样的,把右边的放在左边元素的下一位。
- void Game_jixu()
- {
- //为了判断在键盘上按下的哪个键
- int ch2 = 0;
- while (1)
- {
- ch2 = _getch();
- if (ch2 == 72||ch2=='w')
- {
- move_up();
- break;
- }
- if (ch2 == 80||ch2=='s')
- {
- move_down();
- break;
- }
- if (ch2 == 75||ch2=='a')
- {
- move_left();
- break;
- }
- if (ch2 == 77||ch2=='d')
- {
- move_right();
- break;
- }
- }
-
- }
这一段代码游戏继续的代码,从键盘中获取按键,最好使用<conio.h>文件里面的getch()来进行判断,因为整个是获取后直接执行,更加适合我们这个游戏的设定。
- int Game()
- {
- int t;
- srand((unsigned int)time(NULL));
- suijishu();
- suijishu();
- dayin();
- Game_jixu();
- while(1)
- {
- t=shuying();
- if(t==1)
- {
- printf("恭喜你,赢得了比赛!\n");
- return;
- }
- if(t==-1)
- {
- printf("很遗憾,你已经没有可移动的方块,你输了\n");
- return;
- }
- else
- {
- Game_jixu();
- system("cls");
- suijishu();
- dayin();
- }
- }
- }
剩下的就是游戏的本体了,没有很多需要讲解的,不过我们最好加一个<windows.h>文件下的system("cls");来进行每一次执行之后的清屏,使得玩起来更加舒适。
最后把整个代码放在下面,供参考,如果有写的不好的地方,希望各位大佬指出来,共同学习。
- #include<stdio.h>
- #include<stdlib.h>
- #include<time.h>
- #include<windows.h>
- #include<conio.h>
- #define high 4
- #define wide 4
- int score=0;
- int array[4][4]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- void suijishu() //生成一个随机数。
- {
- int x,y,t;
- do{
- x=rand()%4;
- y=rand()%4;
- }while(array[x][y]); //只有在等于0的空格上随机出现。
- t=rand()%10;
- if(t==4) //设置概率,当t随机出来为4的时候,赋值给array[x][y]
- array[x][y]=4;
- else //否则就是将2赋值给数组空白地方
- array[x][y]=2;
- }
- void dayin()
- {
- int i,k,j;
- printf("SCORE = %d\n", score);
- for (i=0;i<high;i++) //从第一行开始打印,由上往下。
- {
- for (k=0;k<4;k++) //画出每一行的格子分割线。
- {
- printf(" ");
- for(j=0;j<4;j++)
- {
- printf("-");
- }
- }
- printf("\n");
- for (k=0;k<4;k++)
- {
- printf("|");
- if (array[i][k]!=0) //如果这个不为0则将这个数打出来
- {
- printf("%4d", array[i][k]);
- }
- else //如果这个数是0的话,则打印空格。
- {
- for (j=0; j<4;j++)
- {
- printf(" ");
- }
- }
-
- }
- printf("|\n");
- if (i==high-1) //当i位于最后一行的时候,不需要用分割线来进行分割。
- {
- for (k=0; k<4; k++)
- {
- printf(" ");
- for (j=0; j<4; j++)
- {
- printf("-"); //打出最下面的底线。
- }
- }
- printf("\n");
- }
- }
- printf("使用上下左右或者wasd来进行游戏操作\n"); //提示本游戏的键位设置,应该如何玩这个游戏。
- }
- int shuying()
- {
- int i,j;
- for(i=0;i<4;i++)
- {
- for(j=0;j<4;j++)
- {
- if(array[i][j]==2048)
- return 1;
- if(array[i][j]==0)
- return 0;
- }
- }
- return -1;
- }
- void move_left()
- {
- int i,j,k;
- for(i=0;i<4;i++) //从第一行开始,然后一个一个的来进行左移;
- {
- k=0; //用k来当最左边的那个列元素。
- for(j=1;j<4;j++) //从这一行的第二个开始来进行判断。
- {
- if(array[i][j]!=0) //判断这个地方的元素是不是等于零,如果等于零,直接下一个。
- {
- if(array[i][k]==0) //如果第一个等于零,把第一个的元素往右边移动。
- {
- array[i][k]=array[i][j];
- array[i][j]=0; //移动之后,原本的那个元素变成了零。
- }
- else //如果不等于零,那么分为两种情况,一种是两个元素相等,一个是不相等。
- if(array[i][k]==array[i][j]) //如果两个元素相等,那么相加,然后到最左边,之后k++;
- {
- array[i][k]=2*array[i][k];
- score+=array[i][k];
- array[i][j]=0; //原本的那个元素变为了零。
- k++;
- }
- else //如果两个元素不相同,那么就是碰撞。
- {
- k++; //首先先加跳到下一个
- array[i][k]=array[i][j]; //将下一个值赋给k。
- if (j!=k) //如果j不等于k的值,那么就是直接将j的那个元素变为0;
- {
- array[i][j]=0;
- }
- }
- }
- }
- }
- }
- void move_right()
- {
- int i,j,k;
- for (i=0;i<4;i++)
- {
- k=3;
- for(j=2;j>=0;j--)
- {
- if(array[i][j]!=0)
- {
- if (array[i][k]==0)
- {
- array[i][k]=array[i][j];
- array[i][j]=0;
- }
- else
- if(array[i][k] == array[i][j])
- {
- array[i][k]*=2;
- score+=array[i][k];
- array[i][j]=0;
- k--;
- }
- else
- {
- k--;
- array[i][k] = array[i][j];
- if (j != k)
- {
- array[i][j] = 0;
- }
- }
- }
- }
- }
- }
- void move_up()
- {
- int i,j,k;
- for (j = 0; j < 4; j++)
- {
- k=0;
- for (i=1;i<4;i++)
- {
- if(array[i][j]>0)
- {
- if (array[k][j] == array[i][j])
- {
- array[k][j]*=2;
- score+=array[k][j];
- array[i][j]=0;
- k++;
- }
- else
- if(array[k][j]==0)
- {
- array[k][j]=array[i][j];
- array[i][j]=0;
- }
- else
- {
- k++;
- array[k][j]=array[i][j];
- if(i!=k)
- {
- array[i][j]=0;
- }
- }
- }
- }
- }
- }
- void move_down()
- {
- int i,j,k;
- for(j=0;j<4;j++)
- {
- k=3;
- for(i=2;i>=0;i--)
- {
- if(array[i][j]>0)
- {
- if(array[k][j]==array[i][j])
- {
- array[k][j]*=2;
- score+=array[k][j];
- array[i][j]=0;
- k--;
- }
- else
- if(array[k][j]==0)
- {
- array[k][j]=array[i][j];
- array[i][j]=0;
- }
- else
- {
- k--;
- array[k][j]=array[i][j];
- if (i!=k)
- {
- array[i][j]=0;
- }
- }
- }
- }
- }
- }
- void Game_jixu()
- {
- //为了判断在键盘上按下的哪个键
- int ch2 = 0;
- while (1)
- {
- ch2 = _getch();
- if (ch2 == 72||ch2=='w')
- {
- move_up();
- break;
- }
- if (ch2 == 80||ch2=='s')
- {
- move_down();
- break;
- }
- if (ch2 == 75||ch2=='a')
- {
- move_left();
- break;
- }
- if (ch2 == 77||ch2=='d')
- {
- move_right();
- break;
- }
- }
-
- }
- int Game()
- {
- int t;
- srand((unsigned int)time(NULL));
- suijishu();
- suijishu();
- dayin();
- Game_jixu();
- while(1)
- {
- t=shuying();
- if(t==1)
- {
- printf("恭喜你,赢得了比赛!\n");
- return;
- }
- if(t==-1)
- {
- printf("很遗憾,你已经没有可移动的方块,你输了\n");
- return;
- }
- else
- {
- Game_jixu();
- system("cls");
- suijishu();
- dayin();
- }
- }
- }
- int main()
- {
- Game();
- system("pause");
- return 0;
- }
-
-
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。