用c语言完成2048小游戏

#include<stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#define FILE_NAME "1.txt"
void printarr(int arr[][4]);
int Getcount(int arr[][4]);
void rand_num(int arr[][4]);
void get_slide();
void move(int a[],int *ismove);
void add(int a[4],int *ismove);
void move_left(int arr[][4]);
void move_right(int arr[][4]);
void move_up(int arr[][4]);
void move_down(int arr[][4]);
int success(int arr[][4]);
int isflail(int arr[][4]);
void get_slide();
void welcome();
void play();
int prescore();
void read_file();
void top_player();
void sort();
struct player
{
    char name[20];
    int score; 
}play1;

int flage = 1; //判断是否游戏结束的标志
int footnum = 0; //游戏的步数 
//int arr[4][4] = {0};
int arr[][4] = {
    {0,0,0,0},
    {0,0,0,0},
    {0,0,0,0},
    {0,0,0,0}
}; //初始的数组
int score_top[5]={0}; //储存的历史数据
int main()
{
    play1.score = 0;
    // play1.name = "xiaowang";
    srand(time(NULL));
    rand_num(arr);
    rand_num(arr);
    //read_file(); //先读取数据
    welcome();
     //再进行文件的覆盖
    //read_file();
   //top_player();
//     while (flage)
//    {    
//         printf("\n按 w a s d 向上 向左 向右 向下 移动,按 q 键退出;\n");
//         printarr(arr);
//         printf("------------------\n");
       
//         //printf("flage = %d\n",flage); 
//         get_slide(); 
//         system("clear");
//         if(flage==0){
//             break;
//         }
//         printarr(arr);
//         if(success(arr)==0){
//            // flage = 0;
//             break;
//         }
//         if (isflail(arr)==0)
//         {
//             break;
//         }
//    } 
}
//打印二维数组
void printarr(int arr[][4])
{
    printf("* * * * * * * * * * * * * * * * * * * * * *\n");
    printf("*                                         *\n");
    printf("*                                         *\n");
    printf("*                                         *\n");
    printf("*                                         *\n");
    for (int  i = 0; i < 4; i++)
    { 
        printf("*   * * * * * * * * * * * * *             *\n");
        printf("*  ");
        for (int  j = 0; j < 4; j++)
        { 
            printf(" *%4d",arr[i][j]);
        }
        printf(" *             *\n");
    }
    printf("*   * * * * * * * * * * * * *             *\n");
    printf("*                                         *\n");
    printf("*   当前得分:%4d      已走步数:%4d      *\n",play1.score,footnum);
    printf("*                                         *\n");
    printf("*                                         *\n");
    printf("* * * * * * * * * * * * * * * * * * * * * *\n");
}
/*
获取空位的个数
*/
int Getcount(int arr[][4])
{
    int num = 0;
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            if (arr[i][j] == 0)
            {
                num++;
            }
            
        }
        
    }
    return num;
}
void rand_num(int a[][4])
{
    int temp = 0;
    int count = Getcount(a);
    int k = rand()%count+1;
    //printf("k = %d",k);
    //printf("temp = %d",temp);
    for (int  i = 0; i < 4; i++)
    {
        for (int  j = 0; j < 4; j++)
        {
            if (a[i][j] == 0)
            {
                temp++;
                if (temp == k)
                {
                    a[i][j] = rand()%10<7?2:4;
                }
                
            }
            
        }
        
    }
}

// void get_slide()
// {
//      int flage = 1;
//    do
//    {
//     int getchar(void);
//     char ch = getchar();
//      switch (ch)
//     {
//     case 'a':
//     case 'A':
//         printf("向左\n");
//         break;
//     case 'd':
//     case 'D':
//         printf("向右\n");
//         break;
//     case 'w':
//     case 'W':
//         printf("向上\n");
//         break;
//     case 's':
//     case 'S':
//         printf("向下\n");
//         break;
//     case 'q':
//     case 'Q':
//         flage = 0;
//         printf("退出\n");
//         break;
//     default:
//         break;
//     }
//    } while (flage);
   
// }

void add(int a[4],int *ismove)
{
    for (int  i = 0; i < 3; i++)
    {
            if (a[i+1] == a[i]&& a[i] != 0)
            {
                a[i] *= 2;
                a[i+1]  = 0;
                *ismove = 0;
                play1.score+=2;
            }
    }
    
}

void move(int a[],int *ismove)
{
    int i = 0, j = 0; //设置初始值 i 代表非零数字 j 代表0
    for (int  i = 0; i < 4; i++)
    {
        if (a[i] != 0) //获取到非零数字的位置
        {
            a[j] = a[i];
            if (i != j)
            {
                a[i] = 0;
                *ismove = 0;
            }
            j++;
           // printf("变化%d\t",a[i]);
        }
    }
}
//左移函数
void move_left(int a[][4])
{
    int ismove = 1; //判断是否发生移动
    int temp[4] = {0};
    for (int  i = 0; i < 4; i++)
    {
        for (int  j = 0; j <4; j++)
        {
            temp[j] = a[i][j];
        }
        move(temp,&ismove);
        add(temp,&ismove);
        move(temp,&ismove);
        for (int  j = 0; j < 4; j++)
        {
            a[i][j] = temp[j];
        }       
    }
    //printf("ismove = %d\n",ismove);
    if (ismove == 0)
    {
        //printf("进入判断!\n");
        rand_num(arr);
        footnum++;
    }else{
        printf("不能向左移动了\n");
    }
    
}
 void move_right(int a[][4])
 {
    int ismove = 1;
    int temp[4] = {0};
    int k = 0;
    for (int  i = 0; i < 4; i++)
    {
        for (int  j = 3; j>=0; j--)
        {
            temp[k] = a[i][j];
            k++;
        }
        move(temp,&ismove);
        add(temp,&ismove);
        move(temp,&ismove);
        for (int  j = 0; j < 4; j++)
        {
            k--;
            a[i][j] = temp[k];
        }
    }
     if (ismove == 0)
    {
        rand_num(arr);
        footnum++;
    }
 }

void move_up(int arr[][4])
{
    int ismove = 1;
    int temp[4] = {0};
    for (int  i = 0; i < 4; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            temp[j] = arr[j][i];
        }
        move(temp,&ismove);
        add(temp,&ismove);
        move(temp,&ismove);
        for (int  j = 0; j < 4; j++)
        {
            arr[j][i] = temp[j];
        }           
    }
    if (ismove == 0)
    {
        rand_num(arr);
        footnum++;
    }
}

void move_down(int arr[][4])
{
    int ismove = 1;
    int temp[4] = {0};
    int k = 0;
    for (int  i = 0; i < 4; i++)
    {
        for (int j = 3; j >=0 ; j--)
        {
            temp[k++] = arr[j][i];
        }
        
        move(temp,&ismove);
        add(temp,&ismove);
        move(temp,&ismove);
        //  for (int  i = 0; i < 4; i++)
        // {
        //     printf("%d\t",temp[i]);
        // }
        for (int  j = 0; j <4; j++)
        {
            arr[j][i] = temp[--k];
        }       
    }
     if (ismove == 0)
    {
        rand_num(arr);
        footnum++;
    }
}

//按键
void get_slide()  //不能传参 传入参数之后flage恒为1
{

    int getchar(void);
    char ch = getchar();
    //getchar();
     switch (ch)
    {
    case 'a':
    case 'A':
        move_left(arr);
        printf("向左\n");
        break;
    case 'd':
    case 'D':
        move_right(arr);
        printf("向右\n");
        break;
    case 'w':
    case 'W':
        move_up(arr);
        printf("向上\n");
        break;
    case 's':
    case 'S':
        move_down(arr);
        printf("向下\n");
        break;
    case 'q':
    case 'Q':
        flage = 0;
        printf("退出\n");
        break;
    }
}

int success(int arr[][4])
{
    for (int i = 0; i < 4; i++)
    {
        for (int  j = 0; j < 4; j++)
        {
            if (arr[i][j] == 2048)
            {
                flage = 0;
                printf("游戏成功!\n");
            }
            
        }
    }
    return  flage;
}

int isflail(int arr[][4]) //判断是否失败
{
    int bianliang;
    printf("空位个数:%d\t",Getcount(arr));
    if (Getcount(arr) == 0)  //如果棋盘中空的个数为0,则进行判断 判断是否相邻的两个棋子是否相同
    {
        bianliang = 1;
        //printf("bianliang1_1 = %d\n",bianliang);
        printf("进入isfalile\n");
        // for (int  i = 0; i < 4; i++)
        // {
        //     for (int j = 0; j < 4; j++)
        //     {
        //         printf("%d",arr[i][j]);
        //     }
        //     printf("\n");
        // } 
        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 3; j++)
            {            
                if ( (arr[i][j] == arr[i][j+1])|| (arr[i][j] == arr[i+1][j]))
                {   
                    printf("i,j %d,%d\t",i,j);
                    flage =1;
                    bianliang = 0;
                    //return 1;
                }
            }
           
        }
        // printf("游戏失败!\n");
        // return 0;
        printf("bianliang = %d\n",bianliang);
        if (bianliang == 1)
        {
           flage = 0;
           printf("GAME OVER!\n");
           //printarr(arr);
        }
        
     }
    else{
        //printf("进入else里\n");
       flage = 1; 
    }
    return flage;
}

void play()
{ 
    while (flage)
   { 
        printf("\n按 w a s d 向上 向左 向右 向下 移动,按 q 键退出;\n");
        printf("\n每进行一次成功的相加后分数+2;\n");
        printarr(arr);
        printf("------------------\n");
       
        //printf("flage = %d\n",flage); 
        get_slide(); 
        system("clear");
        if(flage==0){
            break;
        }
        printarr(arr);
        if(success(arr)==0){
           // flage = 0;
            break;
        }
        if (isflail(arr)==0)
        {
            break;
        }
   }
    prescore();
    printf("游戏结束!%d\n",play1.score);
}


void welcome() //欢迎界面
{       
    printf("请输入用户名:");
    scanf("%s",play1.name);
        printf("**************************2048******************************\n");
        printf("\n\t\t全国只有百分之1的人能够通关哦!\n\n");
        printf("\t\t亲爱的:%s  请输入游戏选项:\n",play1.name);
        printf("\t\t\t1.开始游戏:\n");                        
        printf("\t\t\t2.查看历史排行\n");                     
        printf("\t\t\t3.会员充值\n");                        
        printf("\t\t\t4.关于我们\n");
        printf("\t\t-----------------------------\n");
        int num = 0;
        scanf("%d",&num);
        system("clear");
        switch (num)
        {
        case 1: play();//开始游戏
            break;
        case 2: top_player();//历史排行 .....
            break;
        case 3: printf("敬请期待!\n");//历史排行 .....
            break;
        case 4: printf("敬请期待!\n");//历史排行 .....
            break;    
        default:
            break;
        }
}

// int prescore() //保存分数
// {
//     FILE *fp=NULL;
//     fp=fopen("/mnt/hgfs/share/第一周/1.txt","rb+");
//     if (fp == NULL)
//     {
//         printf("打开文件失败!\n");
//         return 0;
//     }
//     fprintf(fp,"%d;",score); //写入分数
//     fclose(fp);
// }
// void getHight() //将文件内的数字进行排行
// { 
//     FILE *fp=NULL;
//     fp=fopen("/mnt/hgfs/share/第一周/1.txt","r");
//     char buf_read[100] = {0};
//     while (!feof(fp)) //没有到文件末尾
//     {
//         memset(buf_read, 0, sizeof(buf_read));
//         fread(buf_read,sizeof(int),sizeof(buf_read),fp);
//         printf("分数为:%s\n",buf_read);
//     }
//     char *temp = strtok(buf_read,";"); //取出文件中的数字
//     //printf("%d",temp);
//     int storescore[100] = {0};
//     while(temp)
//     {
//         temp = strtok(NULL,";");
//         printf("%s\n",temp);
//     }
// }

void sort()
{
    int temp = 0;
    for (int i = 0; i < 5-1; i++)
    {
        for (int j = 0;j<5-i-1;j++)
        {
            if (score_top[j]<score_top[j+1])
            {
                temp = score_top[j];
                score_top[j] = score_top[j+1];
                score_top[j+1] = temp;
            }
        }     
    }
} 

int prescore() //保存分数
{   
    //先初始化score数组
    read_file();
    FILE *fp=fopen("1.txt","w+");
    int temp = 0;
    if(fp==NULL){
        fprintf(fp," %s %d\n;",play1.name,play1.score); //写入分数
    }else{
    for (int  i = 0; i < 5; i++)
    {
         printf("判断之前:%d\n",score_top[i]);
    }
    
    sort();
    
    // for (int i = 0; i < 5; i++)  //写入数据之前进行比较,如果写入的数据比排行榜的数据大,则进行替换,若小则不进行操作
    // {
    //     if ((score_top[i] == 0)) //说明这个参数是空 将输入的数据写入文件中
    //     {
    //         score_top[i] = play1.score;
    //         break;
    //     }
    //     printf("写入后的:%d",score_top[i]);
    // }
    int min = score_top[4];
    printf("min = %d,sc = %d\n",min,score_top[4]);
    if (play1.score>min)
    {
        score_top[4] = play1.score;
    }
    
    sort();
    }
    for (int  i = 0; i < 5; i++)
    {
         printf("排列后的c:%d\n",score_top[i]);
    }
    
    
    for (int  i = 0; i < 5; i++)
    {
        fprintf(fp,"%s %d\n;",play1.name,score_top[i]); //写入分数
        printf("打开成功!\n");  
    }
    // scanf("%s %d")
    // fprintf(fp,"%s %d\n",play1.name,play1.score);
    fclose(fp);
}

void read_file()//读文件的数据 
{
	FILE *fp;
    int temp = 0;
    char name_1[10] = {0};
    int score_1 = 0;
	fp=fopen("1.txt","r");
    fscanf(fp,"%s %d",name_1,&score_1);
    int i = 0;
	while(!feof(fp))	//当文件为空时结束 
	{
        //printf("%s  %d\n",name_1,score_1);//将文件的数据赋值给 a 和 sum 变量,然后在进行输出 
        score_top[i] = score_1;
        fscanf(fp,"%s %d",name_1,&score_1);       
        i++; 
	}
    
    
    // for (int i = 0; i < 5-1; i++)
    // {
    //    for (int j = 0;j<5-i-1;j++)
    //    {
    //         if (score_top[j]<score_top[j+1])
    //         {
    //             temp = score_top[j];
    //             score_top[j] = score_top[j+1];
    //             score_top[j+1] = temp;
    //         }
    //    }       
    // }
	fclose(fp);//关闭文件 
}
void top_player()
{
   read_file();
   printf("*****************************龙虎排行榜:***************************\n");
   for (int  i = 0; i < 5; i++)
    {
        
        printf("\t\t\t\tTop%d:%d\n",i+1,score_top[i]); 
    }
    printf("------------------------------------------------------------------\n");
}

完成了游戏的运行 还有数据的排行榜 其他功能待开发

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值