2048字符版C语言实现

main.c

#include "game.h"

int main()
{
    //1.初始化游戏
    game_init();

    //2.执行游戏
    game_exec();

    //3.结束游戏
    //game_finish();

    return 0;
}

lcd.h 和 lcd.c

lcd.h

#ifndef __LCD_H_
#define __LCD_H_

void show_arry(int (*p)[4], int col);

#endif

lcd.c

#include "lcd.h"
#include <stdio.h>

void show_arry(int (*p)[4], int row)
{
    printf("*******************\n");
    for(int i = 0; i < row ; i++)
    {
        printf("|");
        for(int j = 0; j < 4; j++)
        {
            printf("%3d ", p[i][j]);
        }

        printf(" |\n");
    }
    printf("*******************\n");
}

input.h 和 input.c

input.h

#ifndef __INPUT_H_
#define __INPUT_H_

enum key 
{
    left = 97, up = 119 , right = 100, down = 115
};

enum key input();

#endif

input.c

#include "input.h"
#include "stdio.h"

enum key input()
{
    enum key key_value = 0;
    while(1) 
    {
        key_value = getchar();
        if(key_value == left || key_value == right || key_value == up || key_value == down)
        {
          return key_value;
        }
    }
}

game.h 和 game.c

game.h

#ifndef __GAME_H_
#define __GAME_H_

void game_init();
void game_exec();
int game_finish();
void left_matrix(int (*arry_2048)[4]);
void right_matrix(int (*arry_2048)[4]);
void up_matrix(int (*arry_2048)[4]);
void down_matrix(int (*arry_2048)[4]);
int zero_num(int (*arry_2048)[4]);
int write_digit();
void change_hori(int (*arry_2048)[4]);
void change_transpose(int (*arry_2048)[4]);
void judge(int key_value);
int matrix_equal(int (*arry_2048)[4]);
#endif

game.c

#include "game.h"
#include <time.h>
#include <stdlib.h>
#include "lcd.h"
#include "input.h"
#include <stdio.h>

//定义生成的数
int rand_data[5] = {2,4};
//定义一个四阶二维数组用来显示
int arry[4][4] = {0};
int test_arry[4][4] = {0};
int count = 0;
void game_init()
{
    //1.生成一个在任意位置生成一个数
     int row1 = 0, col1 = 0;
     int row2 = 0, col2 = 0;
    while(row1 == row2 &&  col1 == col2)
    {
        srand((unsigned)time(NULL));
        row1 = rand() % 4;
        col1 = rand() % 4;
        row2 = rand() % 4;
        col2 = rand() % 4;
    }
   
    //2.在刚才的任意位置生成一个2或者4的数
    int index1 = rand() % 2;
    arry[row1][col1] = rand_data[index1];
    int index2 = rand() % 2;
    arry[row2][col2] = rand_data[index2];

    //3.显示生成的数
    show_arry(arry,4);
}

void game_exec()
{
    while(1)
    {
        //1.从键盘接收一个指令
        enum key key_value = input();
        //2.游戏执行,先合成,然后在0的任意位置生成一个数
        switch(key_value)
        {
            case left : left_matrix(arry);write_digit();show_arry(arry,4); break;
            case right : right_matrix(arry);write_digit();show_arry(arry,4); break;
            case up : up_matrix(arry);write_digit();show_arry(arry,4);break;
            case down : down_matrix(arry);write_digit();show_arry(arry,4);break;
        }

        if(game_finish())
        {
            break;
        }
    }
    
}

//结束游戏
int game_finish()
{
    int b[4][4];
    for(int i = 0 ; i < 4; i++)
    {
        for(int j = 0; j < 4; j++)
        {
            b[i][j] = arry[i][j];
        }
    }

    //下一步左移(右移)和上移(下移)没有位置可以填充
    left_matrix(b);
    int num1 = zero_num(b);
    up_matrix(b);
    int num2 = zero_num(b);

    if(num1 == 0 && num2 == 0)
    {
        printf("GAME OVER!!!\n");
        return 1;
    }

    return 0;
}

//左移
void left_matrix(int (*arry_2048)[4])
{
    for(int i = 0;i < 4; i++)
    {
        for(int j = 0; j < 3; j++)
        {
            int t = j;
            int flag = 0;
            if(arry_2048[i][j] == 0)
            {
                while(arry_2048[i][t] == 0 )
                {
                    t++;
                    //如果从j开始后面的值全为0,则直接退出本行循环
                    if(t == 4)
                    {
                        flag = 1;
                        break;
                    }
                }

                if(flag)
                {
                    continue;
                }
                //将第1个不为0的数赋给改行的j位置
                arry_2048[i][j] = arry_2048[i][t];
                arry_2048[i][t] = 0;
            }
           
                
            //该数值位的数一定不为0
            t = j + 1;

            //忽略0且不越界
            while(t != 4 && arry_2048[i][t] == 0 )
                t++;

            if(t == 4)
            {
               continue;
            }
            if( arry_2048[i][j] == arry_2048[i][t])
            {
                    arry_2048[i][j] = arry_2048[i][j] + arry_2048[i][t];
                    arry_2048[i][t] = 0;
                    continue;
            }
        }
    }
}

//右移
void right_matrix(int (*arry_2048)[4])
{
    //水平变换,左移相当于右移
    change_hori(arry_2048);
    left_matrix(arry_2048);
    change_hori(arry_2048);
}

//上移
void up_matrix(int (*arry_2048)[4])
{
    change_transpose(arry_2048);
    left_matrix(arry_2048);
    change_transpose(arry_2048);
}

//下移
void down_matrix(int (*arry_2048)[4])
{
    change_transpose(arry_2048);
    change_hori(arry_2048);
    left_matrix(arry_2048);
    change_hori(arry_2048);
    change_transpose(arry_2048);
}

//填充随机数
int write_digit()
{
    srand((unsigned)time(NULL));
    int index = rand() % 2;
    int zeros = zero_num(arry);

    if(zeros == 0)
        return 0;

    int pos = rand() % zeros;
    int count = -1;
    for(int i = 0; i < 4; i++)
    {
        for(int j = 0; j < 4; j++)
        {
            if(arry[i][j] == 0)
            {
                count++;
            }

            if(count == pos)
            {
                arry[i][j] = rand_data[index];
                return 1;
            }
        }
    }
}

int zero_num(int (*arry_2048)[4])
{
    int count = 0;
    for(int i = 0; i < 4; i++)
    {
        for(int j = 0; j < 4; j++)
        {
            if(arry_2048[i][j] == 0)
            {
                count++;
            }
        }
    }
    return count;
}

//矩阵左右转换
void change_hori(int (*arry_2048)[4])
{
    for(int m = 0; m < 4; m++)
    {
        int i = 0;
        int j = 3;
        while(i < j)
        {
            int t;
            t = arry_2048[m][i];
            arry_2048[m][i] = arry_2048[m][j];
            arry_2048[m][j] = t;
            i++;
            j--;
        }
    }
}

//矩阵转置
void change_transpose(int (*arry_2048)[4])
{
   int t[4][4];
   for(int i = 0; i < 4; i++)
   {
       for(int j = 0; j < 4 ;j++)
       {
           t[i][j] = arry_2048[j][i];
       }
   }

   for(int i = 0; i < 4; i++)
   {
       for(int j = 0; j < 4 ;j++)
       {
          arry_2048[i][j] = t[i][j];
       }
   }
}

//判断是否相等
int matrix_equal(int (*arry_2048)[4])
{
    int count = 0;
    for(int i = 0; i < 4; i++)
    {
        for(int j = 0; j < 4; j++ )
        {
            if(arry_2048[i][j] == arry[i][j])
            {
                count++;
            }
        }
    }
    if(count == 16)
    {
        return 1;
    }

    return 0;
    
}

运行效果显示

在这里插入图片描述

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值