//Main函数调用
#include<stdio.h>
#include<string.h>
#include"Root.h"
intmaxNum =0;//最大值
intscore =0;//当前得分
inthisScore =0;//历史最高分
intmain(intargc,constchar* argv[]) {
intnumbers[X][Y]={0};
int* p = *numbers;
randNum(p,1);//首次登陆显示两个随机数
randNum(p,1);
show(p);
maxNum=selMax(p,&maxNum);
read_file(&maxNum, &hisScore);
showMain(numbers,p,&maxNum,&score,&hisScore);
printf("max = %d\n",maxNum);
return0;
}
//
#include"Root.h"
voidshowMain(int(*numbers)[],int*p,int*maxNum,int*score,int*hisScore)
{
intcond=0;//循环条件
intzt =0;//状态
chargesture[2];//滑动指令
do{
printf("W(上)、S(下)、A(左)、D(右)\n");
printf("MAX = %d\t当前得分=%d\t历史最高分=%d\n",*maxNum,*score,*hisScore);
printf("指令:");
scanf("%s",gesture);
if(strcmp(gesture,"W") ==0
||strcmp(gesture,"w") ==0
||strcmp(gesture,"S") ==0
||strcmp(gesture,"s") ==0
||strcmp(gesture,"A") ==0
||strcmp(gesture,"a") ==0
||strcmp(gesture,"D") ==0
||strcmp(gesture,"d") ==0) {
zt =changeXY(numbers,gesture,score,hisScore);
if(zt ==1) {
randNum(p,1);
show(p);
intcd =selMax(p,maxNum);
//存储最大值和历史最高分
if(*score > *hisScore
|| cd > *maxNum) {
*maxNum = cd;
write_file(maxNum,score);//保存历史最高分
}
}elseif(zt == -1) {
if(isEnd(numbers) ==0) {
printf("game over!\n");
cond =1;
}
}
}else{
printf("指令有误!\n");
}
}while(cond ==0);
}
/*
返回值-1无可随机位置
返回值0正常
参数index = 0校验是否结束
参数index = 1生成随机数
*/
intrandNum(int*p,intindex)//index判断是否生产随机数,
{
srand((unsigned)time(0));
intnums[X*Y]={0};
intz =0;//可用位置存储
intz1 =0;//是否有可用位置
intbaseNum =0;//基数
for(inti =0; i <X*Y; i++) {
if(*(p+i) ==0) {
nums[z] = i;
z++;
z1 =1;
}
}
if(z1 ==0) {
return-1;
}
//index = 0校验是否结束
//index = 1生成随机数
if(index ==1) {
intlocation =0;//位置
location =rand()%z;
baseNum = (rand()%2+1)*2;//随机2、4
*(p+nums[location]) = baseNum;
}
return0;
}
/*
返回值 isChange 0 1-1
-1无可移动需要判断是否结束
0无可移动
1移动完成
*/
intchangeXY(int(*p)[Y],chargest[],int*score,int*hisScore)
{
inti =0;
intisChange =0;//是否移动过;
do{
if(strcmp(gest,"W") ==0
||strcmp(gest,"w") ==0) {
for(inti =1; i <X; i++) {
for(intj =0; j <Y; j++) {
if(*(*(p+i)+j) == *(*(p+i-1)+j)
&& *(*(p+i)+j) !=0) {
*(*(p+i-1)+j) = *(*(p+i-1)+j) *2;
*(*(p+i)+j) =0;
isChange =1;
*score += *(*(p+i-1)+j);
}elseif(*(*(p+i-1)+j) ==0
&& *(*(p+i)+j) !=0) {
*(*(p+i-1)+j) = *(*(p+i)+j);
*(*(p+i)+j) =0;
isChange =1;
}
}
}
}elseif(strcmp(gest,"A") ==0
||strcmp(gest,"a") ==0) {
for(intj =1; j <Y; j++) {
for(inti =0; i<X; i++) {
if(*(*(p+i)+j) == *(*(p+i)+j-1)
&& *(*(p+i)+j) !=0) {
*(*(p+i)+j-1) = *(*(p+i)+j-1) *2;
*(*(p+i)+j) =0;
isChange =1;
*score += *(*(p+i)+j-1);
}elseif(*(*(p+i)+j-1) ==0
&& *(*(p+i)+j) !=0) {
*(*(p+i)+j-1) = *(*(p+i)+j);
*(*(p+i)+j) =0;
isChange =1;
}
}
}
}elseif(strcmp(gest,"D") ==0
||strcmp(gest,"d") ==0) {
for(intj =Y-2; j >=0; j--) {
for(inti =X-1; i>=0; i--) {
if(*(*(p+i)+j) == *(*(p+i)+j+1)
&& *(*(p+i)+j) !=0) {
*(*(p+i)+j+1) = *(*(p+i)+j+1) *2;
*(*(p+i)+j) =0;
isChange =1;
*score += *(*(p+i)+j+1);
}elseif(*(*(p+i)+j+1) ==0
&& *(*(p+i)+j) !=0) {
*(*(p+i)+j+1) = *(*(p+i)+j);
*(*(p+i)+j) =0;
isChange =1;
}
}
}
}else{
for(inti =X-2; i >=0; i--) {
for(intj =Y-1; j >=0; j--) {
if(*(*(p+i)+j) == *(*(p+i+1)+j)
&& *(*(p+i)+j) !=0) {
*(*(p+i+1)+j) = *(*(p+i+1)+j) *2;
*(*(p+i)+j) =0;
isChange =1;
*score += *(*(p+i+1)+j);
}elseif(*(*(p+i+1)+j) ==0
&& *(*(p+i)+j) !=0) {
*(*(p+i+1)+j) = *(*(p+i)+j);
*(*(p+i)+j) =0;
isChange =1;
}
}
}
}
i++;
}while(i <3);
if(isChange ==0) {
isChange =randNum(*p,0);
}
returnisChange;
}
intselMax(int*p,int*max)
{
for(inti =0; i <X*Y; i++) {
*max = *(p+i) > *max ?*(p+i):*max;
}
return*max;
}
//返回值0结束,1,正常
intisEnd(int(*p)[Y])
{
// int i = 0;
intisEnd =0;//是否结束
// do{
//W
for(inti =1; i <X; i++) {
for(intj =0; j <Y; j++) {
if(*(*(p+i)+j) == *(*(p+i-1)+j)
&& *(*(p+i)+j) !=0) {
isEnd =1;
}elseif(*(*(p+i-1)+j) ==0
&& *(*(p+i)+j) !=0) {
isEnd =1;
}
}
}
//A
for(intj =1; j <Y; j++) {
for(inti =0; i<X; i++) {
if(*(*(p+i)+j) == *(*(p+i)+j-1)
&& *(*(p+i)+j) !=0) {
isEnd =1;
}elseif(*(*(p+i)+j-1) ==0
&& *(*(p+i)+j) !=0) {
isEnd =1;
}
}
}
//D
for(intj =Y-2; j >=0; j--) {
for(inti =X-1; i>=0; i--) {
if(*(*(p+i)+j) == *(*(p+i)+j+1)
&& *(*(p+i)+j) !=0) {
isEnd =1;
}elseif(*(*(p+i)+j+1) ==0
&& *(*(p+i)+j) !=0) {
isEnd =1;
}
}
}
//S
for(inti =X-2; i >=0; i--) {
for(intj =Y-1; j >=0; j--) {
if(*(*(p+i)+j) == *(*(p+i+1)+j)
&& *(*(p+i)+j) !=0) {
isEnd =1;
}elseif(*(*(p+i+1)+j) ==0
&& *(*(p+i)+j) !=0) {
isEnd =1;
}
}
}
// i++;
// }while(i < 3);
returnisEnd;
}
voidshow(int*p)
{
for(inti =0; i <X*Y; i++) {
if(i %4==0)printf("\n");
if(*(p+i) >0) {
printf("%d\t",*(p+i));
}else{
printf(".\t");
}
}
printf("\n");
}
voidwrite_file(int*max,int*hisScore)
{
FILE* fp =NULL;
fp =fopen("2048Root.dat","w");
if(!fp) {
return;
}
fwrite(max,sizeof(int),1, fp);
fwrite(hisScore,sizeof(int),1, fp);
fclose(fp);
}
voidread_file(int*max,int*hisScore)
{
FILE* fp =NULL;
fp =fopen("2048Root.dat","r");
if(!fp) {
return;
}
fread(max,sizeof(int),1, fp);
fread(hisScore,sizeof(int),1, fp);
fclose(fp);
}
//#ifndef ___048____Root__
#define ___048____Root__
#define X4
#define Y4
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
intrandNum(int*p,intindex);
intchangeXY(int(*p)[Y],chargest[],int*max,int*hisScore);
intisEnd(int(*p)[Y]);
voidshow(int*p);
intselMax(int*p,int*max);
voidshowMain(int(*numbers)[],int*p,int*maxNum,int*score,int*hisScore);
voidwrite_file(int*max,int*hisScore);
voidread_file(int*max,int*hisScore);
#endif/* defined(___048____Root__) */