#include "game.h"
int main()
{
//1.初始化游戏
game_init();
//2.执行游戏
game_exec();
//3.结束游戏
//game_finish();
return 0;
}
lcd.h
#ifndef __LCD_H_
#define __LCD_H_
void show_arry(int (*p)[4], int col);
#endif
lcd.c
#include "lcd.h"
#include
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
#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
#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
#include
#include "lcd.h"
#include "input.h"
#include
//定义生成的数
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;
}