目录
游戏程序思维导图:
编辑
功能介绍:
代码管理:
主函数:
头文件:
游戏程序思维导图:
功能介绍:
按键W --------------- 向上
按键A --------------- 向左
按键S --------------- 向下
按键D --------------- 向右
按键P --------------- 开始游戏
按键L --------------- 结束游戏
按键其他 ---------- 提示有错
代码管理:
direction_choose.c 包含 1、get_errorInfo函数 获取错误信息并打印
2、get_chooseInfo函数 获取方向选择的信息
3、choose_func函数 (1)判断输入的不同方向输出相应的数组
(2)判断输入的不同方向计算的得分
(3)判断输入信息,输出相应错误原因
draw_map.c draw函数 打印函数
game_cg.c game_cg函数 判断是否通关
game_over.c game_over函数 判断游戏是否失败
go_down.c 包含 1、go_down_move函数 向下移动函数
2、go_down_add函数 向下相加函数
3、go_down函数 整合向下移动函数和向下相加函数
go_up.c 包含 1、go_up_move函数 向上移动函数
2、go_up_add函数 向上相加函数
3、go_up函数 整合向上移动函数和向上相加函数
go_left.c 包含 1、go_left_move函数 向左移动函数
2、go_left_add函数 向左相加函数
3、go_left函数 整合向左移动函数和向左相加函数
go_right.c 包含 1、go_right_move函数 向右移动函数
2、go_right_add函数 向右相加函数
3、go_right函数 整合向有移动函数和向右相加函数
init.c 包含 1、CreateNumber函数 随机产生2或者4
2、init函数 调用CreateNumber函数在数组中随机0位随机产生2或者4
主函数:
#include "head.h"
int main()
{
char mode = 0;
char start = 0;
int score = 0;
//lable:
printf("开始游戏请按 P ,结束游戏请按 L\n");
lable:
system("stty -icanon"); // 系统函数将缓冲区清空
start = getchar();
if(start == 'p')
{
choose_func(start,score);
}
else
{
get_errorInfo(E_ERROR_STATE);
goto lable;
}
while(game_over() && mode != 'l'&& start == 'p')
{
printf("输入A:向左,D:向右,W:向上,S:向下: \n");
system("stty -icanon");
mode = getchar();
if(mode =='p')
{
mode = 'P';
}
score = choose_func(mode,score);
}
if(mode=='l')
{
printf("游戏结束。\n");
}
return 0;
}
头文件:
#ifndef _HEAD_H
#define _HEAD_H
#include<stdio.h>
#include <stdlib.h>
#include<math.h>
#include<time.h>
#include<stdbool.h>
#define ROW 4 //定义行
#define COL 4 //定义列
//存储数据的数组
int map[ROW][COL];
void draw(); // 画图函数
int go_left_move(); // 向左移动函数
int go_left_add(int score); // 向左相加函数
int go_left(int score); // 向左函数
int go_right_move(); // 向右移动函数
int go_right_add(int score); // 向右相加函数
int go_right(int score); // 向右函数
int go_up_move(); // 向上移动函数
int go_up_add(int score); // 向上相加函数
int go_up(int score); // 向上函数
int go_down_move(); //向下移动函数
int go_down_add(int score); // 向下相加函数
int go_down(int score); // 向下函数
void init(); // 初始化函数
int choose_func(char mode,int score); // 选择方向移动函数
bool game_over(); // 游戏结束判断函数
enum choose{left = 0,
right = 1,
up = 2,
down = 3,
start = 4,
end = 5}; // 定义选择枚举
static char get_choose[] = {
[left] = 'a',
[right] = 'd',
[down] = 's',
[up] = 'w',
[start] = 'p',
[end] = 'l'
}; // 定义选择枚举选择相应的字符键
enum errorInfo
{
E_ERROR_INPUT,
E_ERROR_CSTATE,
E_ERROR_STATE,
E_ERROR_NONE
};
static char *error_buf[] = {
[E_ERROR_INPUT] = "输入错误,请重新输入",
[E_ERROR_CSTATE] = "已经开始游戏,请重新输入",
[E_ERROR_STATE] = "开始错误,请按P开始游戏",
[E_ERROR_NONE] = "未知错误"
};
char *get_errorInfo(enum errorInfo mc_erron);
#endif
详细代码可以自行下载浏览。(突然发现自己下载不了,特此补充)
选择函数
#include <stdio.h>
#include "head.h"
/*
* 函数名 : get_errorInfo
* 功能 : 获取错误信息并输出
* 参数 : enum errorInfo mc_erron 枚举errorInfo数据
* 输出 : 定义的指针数组记录的错误信息
*/
char *get_errorInfo(enum errorInfo mc_erron)
{
printf("%s\n",error_buf[mc_erron]);
}
/*
* 函数名 : get_chooseInfo
* 功能 : 获取方向选择的信息
* 参数 : enum choose ch 枚举choose数据
*/
int get_chooseInfo(enum choose ch)
{
get_choose[ch];
}
/*
* 函数名 : choose_func
* 功能 : 1、判断输入的不同方向输出相应的数组
* 2、判断输入的不同方向计算的得分
* 3、判断输入信息,输出相应错误原因
* 参数 : 1、mode 输入的方向名
* 2、score 需要计算的得分
* 返回值 : score 计算后的得分情况
*/
int choose_func(char mode,int score)
{
enum choose My_choose = mode;
switch (get_chooseInfo(My_choose)) // 获取方向信息进行控制
{
case 's':
score = go_down(score);
draw();
printf("当前得分%d\n",score);
break;
case 'w':
score = go_up(score);
draw();
printf("当前得分得分%d\n",score);
break;
case 'd':
score = go_right(score);
draw();
printf("当前得分得分%d\n",score);
break;
case 'a':
score = go_left(score);
draw();
printf("当前得分得分%d\n",score);
break;
case 'p':
printf("游戏开始\n");
init(); // 游戏初始化函数
init(); // 游戏初始化函数
draw(); // 打印函数
break;
case 'l':
printf("游戏结束\n");
printf("最终得分%d\n",score);
break;
case 'P':
get_errorInfo(E_ERROR_CSTATE); // 获取重复输入错误信息
break;
default:
get_errorInfo(E_ERROR_INPUT); // 获取输入异常错误信息
break;
}
return score;
}
打印函数
#include <stdio.h>
#include "head.h"
/*
* 函数名 : draw 打印函数
* 功能 : 打印2048地图
* 主要步骤 : 打印4*4的二维数组,并在0的位置随机生成一个2或者4
*/
void draw()
{
printf("\n--------------------------------------------\n");
for(int i = 0; i < ROW; i++)
{
printf("--\t");
for(int j = 0; j < COL; j++)
{
printf("%d\t",map[i][j]);
}
printf("-- ");
printf("\n");
printf("\n");
}
printf("\n----------------------------------------------\n");
}
游戏结束函数
#include "head.h"
/*
* 函数名 : game_over
* 功能 : 判断游戏是否结束
* 返回值 : 0 或 1
*/
bool game_over()
{
for (int i = 0; i < ROW; i++)
{
for(int j = 0; j < COL; j++)
{
if(map[i][j]==map[i][j+1]&&j!=3)
{
return true;
}
if(map[i][j]==map[i+1][j]&&i!=3)
{
return true;
}
}
}
printf("game_over !!\n");
return false;
}
向左函数
#include "head.h"
/*
* 函数名 : go_left_move
* 功能 : 向左移动
*/
int go_left_move()
{
for(int i = 0; i < ROW; i++)
{
int k = 0;
for(int j = 0; j < COL; j++)
{
if(map[i][j]==0)
{
k++;
}
if(map[i][j]!=0&&j!=0&&k>0)
{
map[i][j-k]=map[i][j];
map[i][j]=0;
}
}
}
}
/*
* 函数名 : go_left_add
* 功能 : 向左相加
* 参数 : score 计算向左相加得分
* 返回值 : score 返回计算后得分
*/
int go_left_add(int score)
{
for(int i = 0; i < ROW; i++)
{
int k = 0;
for(int j = 0; j < COL; j++)
{
if(map[i][j]==map[i][j+1]&&j!=3)
{
score += map[i][j]*2;
map[i][j]+=map[i][j+1];
map[i][j+1]=0;
}
}
}
return score;
}
/*
* 函数名 : go_left
* 功能 : 1、调用向左移动函数和向下相加函数
* 2、得到向左后得分
* 3、初始化获得一个随机值
* 参数 : score 需要计算的得分
* 返回值 : score 返回计算后得分
*/
int go_left(int score)
{
go_left_move();
score = go_left_add(score);
go_left_move();
init();
return score;
}
向右函数
#include "head.h"
/*
* 函数名 : go_right_move
* 功能 : 向右移动
*/
int go_right_move()
{
for(int i = 0; i < ROW; i++)
{
int k = 0;
for(int j = COL-1; j >= 0; j--)
{
if(map[i][j] == 0)
{
k++;
}
if(map[i][j] != 0 && j != (COL-1) && k > 0)
{
map[i][j+k]=map[i][j];
map[i][j]=0;
}
}
}
}
/*
* 函数名 : go_right_add
* 功能 : 向右相加
* 参数 : score 计算向右相加得分
* 返回值 : score 返回计算后得分
*/
int go_right_add(int score)
{
for(int i = 0; i < ROW; i++)
{
for(int j = COL-1; j >= 0; j--)
{
if(map[i][j]==map[i][j-1])
{
score += map[i][j]*2;
map[i][j]+=map[i][j-1];
map[i][j-1]=0;
}
}
}
return score;
}
/*
* 函数名 : go_right
* 功能 : 1、调用向右移动函数和向下相加函数
* 2、得到向右后得分
* 3、初始化获得一个随机值
* 参数 : score 需要计算的得分
* 返回值 : score 返回计算后得分
*/
int go_right(int score)
{
go_right_move();
score = go_right_add(score);
go_right_move();
init();
return score;
}
向上函数
#include "head.h"
/*
* 函数名 : go_up_move
* 功能 : 向上移动
*/
int go_up_move()
{
for(int i = 0; i < COL; i++)
{
int k = 0;
for(int j = 0; j < ROW; j++)
{
if(map[j][i]==0)
{
k++;
}
if(map[j][i]!=0&&j!=0&&k>0)
{
map[j-k][i]=map[j][i];
map[j][i]=0;
}
}
}
}
/*
* 函数名 : go_up_add
* 功能 : 向上相加
* 参数 : score 计算向上相加得分
* 返回值 : score 返回计算后得分
*/
int go_up_add(int score)
{
for(int i = 0; i < COL; i++)
{
for(int j = 0; j < ROW; j++)
{
if(map[j][i]==map[j+1][i]&&j!=3)
{
score += map[j][i]*2;
map[j][i]+=map[j+1][i];
map[j+1][i]=0;
}
}
}
return score;
}
/*
* 函数名 : go_up
* 功能 : 1、调用向上移动函数和向下相加函数
* 2、得到向上后得分
* 3、初始化获得一个随机值
* 参数 : score 需要计算的得分
* 返回值 : score 返回计算后得分
*/
int go_up(int score)
{
go_up_move();
score = go_up_add(score);
go_up_move();
init();
return score;
}
向下函数
#include "head.h"
/*
* 函数名 : go_down_move
* 功能 : 向下移动
*/
int go_down_move()
{
for(int i = 0; i < COL; i++)
{
int k = 0;
for(int j = ROW-1; j >= 0; j--)
{
if(map[j][i] == 0)
{
k++;
}
if(map[j][i] != 0 && j != (ROW-1) && k > 0)
{
map[j+k][i]=map[j][i];
map[j][i]=0;
}
}
}
}
/*
* 函数名 : go_down_add
* 功能 : 向下相加
* 参数 : score 计算向下相加得分
* 返回值 : score 返回计算后得分
*/
int go_down_add(int score)
{
for(int i = 0; i < COL; i++)
{
for(int j = ROW-1; j >= 0; j--)
{
if(map[j][i]==map[j-1][i])
{
score += map[j][i]*2;
map[j][i]+=map[j-1][i];
map[j-1][i]=0;
}
}
}
return score;
}
/*
* 函数名 : go_down
* 功能 : 1、调用向下移动函数和向下相加函数
* 2、得到向下后得分
* 3、初始化获得一个随机值
* 参数 : score 需要计算的得分
* 返回值 : score 返回计算后得分
*/
int go_down(int score)
{
go_down_move();
score = go_down_add(score);
go_down_move();
init();
return score;
}
初始化函数
#include "head.h"
#define ROW 4 //行
#define COL 4 //列
//存储数据的数组
int map[ROW][COL];
//随机产生2或者4
int CreateNumber()
{
if(rand() % 10 != 0)
{
return 2;
}
else
{
return 4;
}
}
//初始化函数
void init()
{
srand(time(NULL)); //设置随机种子
// 随机产生一个数,并且放到数组里面去
for(int i = 0; i < 2; i++)
{
int r = rand() % ROW;
int c = rand() % COL; //随机产生一个数2或者4,2的概率更大
if(map[r][c]==0)
{
map[r][c] = CreateNumber();
i++; //只有正确生成了数字,i才会++
}
}
}
希望每天都可以进步!!