2048字符版C語言實作
- main.c
- lcd.h 和 lcd.c
- input.h 和 input.c
- game.h 和 game.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;
}
運行效果顯示

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/262469.html
標籤:其他
