①运行的时候会突然某一行都变成16或者32,这个是怎么回事 附上代码,有些长 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <conio.h> int num[4][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}; int score=0;//记录合成分数 //产生随机数 int randnum(int x) { int a; //srand((unsigned)time(NULL)); a=rand()%x; return a; } //判断游戏是否结束,结束返回0,否则返回1 int gamefail() { int i,j,l=0; for(i=0;i<4;i++) { for(j=0;j<4;j++) { if(num[i][j]!=0) l++; //l记录非空白格的个数 } } //判断 if(l!=16) { return 1; }else{ l=0; //l记录是否有相邻的数字相同 //从上往下 for(j=0;j<4;j++) { for(i=1;i<3;i++) { if((num[i][j]==num[i+1][j])||(num[i][j]==num[i-1][j])) { l++; break; } } if((num[i][j]==num[i+1][j])||(num[i][j]==num[i-1][j])) break; } if(l!=0) return 1; else { l=0; for(i=0;i<4;i++) { for(j=1;j<3;j++) { if((num[i][j]==num[i][j+1])||(num[i][j]==num[i][j-1])) { l++; break; } } if((num[i][j]==num[i][j+1])||(num[i][j]==num[i][j-1])) break; } if(l!=0) return 1; else return 0; } } } //初始化 void start() { int x1,y1;//初始随机坐标 int r;//随机数 int i,j; x1=randnum(4); y1=randnum(4); r=randnum(10); if(r==9) { num[x1][y1]=4; }else{ num[x1][y1]=2; } i=randnum(4); j=randnum(4); while(num[i][j]!=0) { i=randnum(4); j=randnum(4); } r=randnum(10); if(r==9) { num[i][j]=4; }else{ num[i][j]=2; } } void randr() { int i,j,r; i=randnum(4); j=randnum(4); while(num[i][j]!=0) { i=randnum(4); j=randnum(4); } r=randnum(10); if(r==9) num[i][j]=4; else num[i][j]=2; } void moveup() { int i,j,k; int temp[4]={0,0,0,0}; //间接转换 //将原来的数组中的非零数相邻放置 for(j=0;j<4;j++) { for(i=0;i<4;i++) { for(k=0;k<3;k++) { if(num[k][j]==0) { num[k][j]=num[k+1][j]; num[k+1][j]=0; } } } } //将数组的列转入中间变量并移动、相加 for(j=0;j<4;j++) { k=0; for(i=0;i<4;i++) { if(i==3) { temp[k++]=num[i][j]; num[i][j]=0; }else{ if(num[i][j]!=num[i+1][j]&&num[i][j]!=0) { temp[k++]=num[i][j]; num[i][j]=0; }else if(num[i][j]==num[i+1][j]) { temp[k++]=num[i][j]+num[i+1][j]; score+=temp[k-1];//计算得分 num[i][j]=num[i+1][j]=0; } } } for(i=0;i<4;i++) num[i][j]=temp[i]; } } void moveleft() { int i,j,k; int temp[4]={0,0,0,0}; for(i=0;i<4;i++) { for(j=0;j<4;j++) { for(k=0;k<3;k++) { if(num[i][k]==0) { num[i][k]=num[i][k+1]; num[i][k+1]=0; } } } } for(i=0;i<4;i++) { k=0; for(j=0;j<4;j++) { if(j==3) { if(num[i][j]!=0) { temp[k++]=num[i][j]; num[i][j]=0; } }else{ if(num[i][j]!=num[i][j+1]&&num[i][j]!=0) { temp[k++]=num[i][j]; num[i][j]=0; }else if(num[i][j]==num[i][j+1]) { temp[k++]=num[i][j]+num[i][j+1]; score+=temp[k-1]; num[i][j]=num[i][j+1]=0; } } } for(j=0;j<4;j++) { num[i][j]=temp[j]; } } } void movedown() { int i,j,k; int temp[4]={0,0,0,0}; for(j=0;j<4;j++) { for(i=3;i>=0;i--) { for(k=3;k>0;k--) { if(num[k][j]==0) { num[k][j]=num[k-1][j]; num[k-1][j]=0; } } } } for(j=0;j<4;j++) { k=3; for(i=3;i>=0;i--) { if(i==0) { if(num[i][j]!=0) { temp[k--]=num[i][j]; num[i][j]=0; } }else{ if(num[i][j]!=num[i-1][j]&&num[i][j]!=0) { temp[k--]=num[i][j]; num[i][j]=0; }else if(num[i][j]==num[i-1][j]) { temp[k--]=num[i][j]+num[i-1][j]; score+=temp[k+1]; num[i][j]=num[i-1][j]=0; } } } for(i=3;i>=0;i--) num[i][j]=temp[i]; } } void moveright() { int i,j,k; int temp[4]={0,0,0,0}; for(i=0;i<4;i++) { for(j=3;j>=0;j--) { for(k=3;k>0;k--) { if(num[i][k]==0) { num[i][k]=num[i][k-1]; num[i][k-1]=0; } } } } for(i=0;i<4;i++) { k=3; for(j=3;j>=0;j--) { if(j==0) { if(num[i][j]!=0) { temp[k--]=num[i][j]; num[i][j]=0; } }else{ if(num[i][j]!=num[i][j-1]&&num[i][j]!=0) { temp[k--]=num[i][j]; num[i][j]=0; }else if(num[i][j]==num[i][j-1]) { temp[k--]=num[i][j]+num[i][j-1]; score+=temp[k+1]; num[i][j]=num[i][j-1]=0; } } } for(j=0;j<4;j++) num[i][j]=temp[j]; } } //输出 void output() { int i,j; for(i=0;i<4;i++) { for(j=0;j<4;j++) { if(j==3) printf("%6d\n",num[i][j]); else printf("%6d",num[i][j]); } } printf("分数:%d\n",score); } int max() { int i,j,m=num[0][0]; for(i=0;i<4;i++) { for(j=0;j<4;j++) { if(num[i][j]>m) m=num[i][j]; } } return m; } void search() { if(max()==2048) printf("成功合成2048"); else if(max()==4096) printf("成功合成4096"); else if(max()==8192) printf("成功合成8192"); } void main() { int i,j,k=0,l=0; char c;//接收w,a,s,d int move; int num1[4][4]; //初始化 do { for(i=0;i<4;i++) { for(j=0;j<4;j++) { num[i][j]=0; } } start(); for(i=0;i<4;i++) { for(j=0;j<4;j++) { if(num[i][j]!=0) l++; } } }while(l!=2); output(); //开始游戏 while(gamefail())//首先判断游戏是否可以继续进行 { move=0; //判断如何移动 for(i=0;i<4;i++) { for(j=0;j<4;j++) { num1[i][j]=num[i][j]; } } c=getch(); switch(c) { case ""W"": case ""w"":moveup();break; case ""A"": case ""a"":moveleft();break; case ""S"": case ""s"":movedown();break; case ""D"": case ""d"":moveright();break; default :printf("请输入正确的按键\n"); } for(i=0;i<4;i++) { for(j=0;j<4;j++) { if(num1[i][j]==num[i][j]) move++; else break; } if(num1[i][j]!=num[i][j]) break; } if(move!=16) { //在空白地方产生一个随机数 randr(); system("cls"); //输出 output(); }else{ printf("请移动方块\n"); } search(); } printf("GAME OVER"); system("pause"); } |
|
40分 |
Srand这个函数应该只运行一次,他是随机数种子,起初始化作用。你把它放在每一个随机数函数执行之前是多余的,
|
参考代码段:
https://github.com/707wk/Senior-middle-school/tree/master/2048 |
|
原来是这样 |
|
C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\rand.c
/*** *rand.c - random number generator * * Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: * defines rand(), srand() - random number generator * *******************************************************************************/ #include <cruntime.h> #include <mtdll.h> #include <stddef.h> #include <stdlib.h> /*** *void srand(seed) - seed the random number generator * *Purpose: * Seeds the random number generator with the int given. Adapted from the * BASIC random number generator. * *Entry: * unsigned seed - seed to seed rand # generator with * *Exit: * None. * *Exceptions: * *******************************************************************************/ void __cdecl srand ( unsigned int seed ) { _getptd()->_holdrand = (unsigned long)seed; } /*** *int rand() - returns a random number * *Purpose: * returns a pseudo-random number 0 through 32767. * *Entry: * None. * *Exit: * Returns a pseudo-random number 0 through 32767. * *Exceptions: * *******************************************************************************/ int __cdecl rand ( void ) { _ptiddata ptd = _getptd(); return( ((ptd->_holdrand = ptd->_holdrand * 214013L + 2531011L) >> 16) & 0x7fff ); } |