2048-C语言版


//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;//随机24

        *(p+nums[location]) = baseNum;

    }

   return0;

}


/*

 返回值  isChange  0 11

 -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__) */





版权声明:本文为li1101585183原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。