2048-C语言版

这是一个使用C语言编写的2048游戏代码,包括主函数、显示、滑动操作、随机数生成等功能。游戏逻辑通过滑动指令控制矩阵中数字的合并和更新,同时实现了读写文件以保存最高分。
摘要由CSDN通过智能技术生成


//Main函数调用

#include <stdio.h>

#include <string.h>

#include "Root.h"


int maxNum = 0;//最大值

int score = 0;//当前得分

int hisScore = 0;//历史最高分


int main(int argc, const char * argv[]) {

    int numbers[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);

    

    return 0;

}

//

#include "Root.h"


void showMain(int (*numbers)[],int *p,int *maxNum,int *score,int *hisScore)

{

    int cond=0;//循环条件

    int zt = 0;//状态

    char gesture[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);

                

                int cd = selMax(p,maxNum);

                //存储最大值和历史最高分

                if (*score > *hisScore

                    || cd > *maxNum) {

                    *maxNum = cd;

                    write_file(maxNum,score);//保存历史最高分

                }

                

            }else if(zt == -1) {

                if(isEnd(numbers) == 0) {

                    printf("game over!\n");

                    cond = 1;

                }

            }

        }else{

            printf("指令有误!\n");

        }

    } while (cond == 0);

}


/*

 返回值 -1 无可随机位置

 返回值 0 正常

 参数 index = 0 校验是否结束

 参数 index = 1 生成随机数

 */

int randNum(int *p,int index)//index 判断是否生产随机数,

{

    srand((unsigned)time(0));

    int nums[X*Y]={0};

    int z = 0;//可用位置存储

    int z1 = 0;//是否有可用位置

    int baseNum = 0;//基数

    for (int i = 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) {

        int location = 0;//位置

        location = rand()%z;

        baseNum = (rand()%2+1)*2;//随机24

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

    }

    return 0;

}


/*

 返回值  isChange  0 1 1

 -1 无可移动需要判断是否结束

 0 无可移动

 1 移动完成

 */

int changeXY(int (*p)[Y],char gest[],int *score,int *hisScore)

{

    int i = 0;

    int isChange = 0;//是否移动过;

    do{

        if (strcmp(gest, "W") == 0

            || strcmp(gest, "w") == 0) {

            for (int i = 1; i < X; i++) {

                for (int j = 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);

                    }else if (*(*(p+i-1)+j) == 0

                              && *(*(p+i)+j) != 0) {

                        *(*(p+i-1)+j) = *(*(p+i)+j);

                        *(*(p+i)+j) = 0;

                        isChange = 1;

                    }

                }

            }

        }else if (strcmp(gest, "A") == 0

                  || strcmp(gest, "a") == 0) {

            for (int j = 1; j < Y; j++) {

                for (int i = 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);

                    }else if (*(*(p+i)+j-1) == 0

                              && *(*(p+i)+j) != 0) {

                        *(*(p+i)+j-1) = *(*(p+i)+j);

                        *(*(p+i)+j) = 0;

                        isChange = 1;

                    }

                }

            }

        }else if (strcmp(gest, "D") == 0

                  || strcmp(gest, "d") == 0) {

            for (int j = Y-2; j >= 0; j--) {

                for (int i = 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);

                    }else if (*(*(p+i)+j+1) == 0

                              && *(*(p+i)+j) != 0) {

                        *(*(p+i)+j+1) = *(*(p+i)+j);

                        *(*(p+i)+j) = 0;

                        isChange = 1;

                    }

                }

            }

        }else{

            for (int i = X-2; i >= 0; i--) {

                for (int j = 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);

                    }else if (*(*(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);

    }

    

    return isChange;

}


int selMax(int *p,int *max)

{

    for (int i = 0; i < X*Y; i++) {

        *max = *(p+i) > *max ?*(p+i):*max;

    }

    return *max;

}


//返回值 0 结束,1,正常

int isEnd(int (*p)[Y])

{

//    int i = 0;

    int isEnd = 0;//是否结束

//    do{

        //W

        for (int i = 1; i < X; i++) {

            for (int j = 0; j < Y; j++) {

                if (*(*(p+i)+j) == *(*(p+i-1)+j)

                    && *(*(p+i)+j) != 0) {

                    isEnd = 1;

                }else if (*(*(p+i-1)+j) == 0

                          && *(*(p+i)+j) != 0) {

                    isEnd = 1;

                }

            }

        }

        //A

        for (int j = 1; j < Y; j++) {

            for (int i = 0; i<X; i++) {

                if (*(*(p+i)+j) == *(*(p+i)+j-1)

                    && *(*(p+i)+j) != 0) {

                    isEnd = 1;

                }else if (*(*(p+i)+j-1) == 0

                          && *(*(p+i)+j) != 0) {

                    isEnd = 1;

                }

            }

        }

        //D

        for (int j = Y-2; j >= 0; j--) {

            for (int i = X-1; i>=0; i--) {

                if (*(*(p+i)+j) == *(*(p+i)+j+1)

                    && *(*(p+i)+j) != 0) {

                    isEnd = 1;

                }else if (*(*(p+i)+j+1) == 0

                          && *(*(p+i)+j) != 0) {

                    isEnd = 1;

                }

            }

        }

        //S

        for (int i = X-2; i >= 0; i--) {

            for (int j = Y - 1; j >= 0; j--) {

                if (*(*(p+i)+j) == *(*(p+i+1)+j)

                    && *(*(p+i)+j) != 0) {

                    isEnd = 1;

                }else if (*(*(p+i+1)+j) == 0

                          && *(*(p+i)+j) != 0) {

                    isEnd = 1;

                }

            }

        }

//        i++;

//    }while(i < 3);

    

    return isEnd;

}


void show(int *p)

{

    for (int i = 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");

}


void write_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);

}


void read_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 X 4

#define Y 4


#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <string.h>


int randNum(int *p,int index);

int changeXY(int (*p)[Y],char gest[],int *max,int *hisScore);

int isEnd(int (*p)[Y]);

void show(int *p);

int selMax(int *p,int *max);

void showMain(int (*numbers)[],int *p,int *maxNum,int *score,int *hisScore);

void write_file(int *max,int *hisScore);

void read_file(int *max,int *hisScore);


#endif /* defined(___048____Root__) */




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值