当前位置: 首页 > news >正文

C语言之2048小游戏理解分析

目录

游戏程序思维导图:

​编辑

功能介绍:

代码管理:

主函数:

    头文件:


游戏程序思维导图:
功能介绍:

按键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才会++}}
​
}

希望每天都可以进步!!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 最优化原理(笔记)
  • MINE:Mutual Information Neural Estimation
  • 【学习笔记】无人机系统(UAS)的连接、识别和跟踪(七)-广播远程识别码(Broadcast Remote ID)
  • Nova Admin - 简洁干净、免费开源的后台管理系统,基于Vue3 / Vite5 / Typescript / Naive UI 等前端开发技术栈
  • Express 框架基本用法以及相关知识点
  • 一个电子小说阅读系统源码,thinkphp开发的小说系统系统
  • C基础(学习)2024.7.23
  • JDBC操作MySQL数据
  • 通天星CMSV6车载视频监控平台disable接口处存在SQL注入漏洞 [附POC]
  • 如何保护你的网络安全?
  • K3s部署及研究
  • Ubuntu24.04 NFS 服务配置
  • React前端面试每日一试 2.JSX是什么?JSX如何工作?
  • 新版GPT-4omini上线!快!真TM快!
  • mac 如何给默认终端(zsh)装插件,使得更美观易用
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Angular2开发踩坑系列-生产环境编译
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • ECMAScript6(0):ES6简明参考手册
  • es6要点
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • node学习系列之简单文件上传
  • Spring Boot MyBatis配置多种数据库
  • springMvc学习笔记(2)
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • Vue.js 移动端适配之 vw 解决方案
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 从零开始学习部署
  • 前端设计模式
  • 深入浏览器事件循环的本质
  • 学习笔记:对象,原型和继承(1)
  • 《码出高效》学习笔记与书中错误记录
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • #知识分享#笔记#学习方法
  • (C++20) consteval立即函数
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (web自动化测试+python)1
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (二刷)代码随想录第15天|层序遍历 226.翻转二叉树 101.对称二叉树2
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (新)网络工程师考点串讲与真题详解
  • (一)kafka实战——kafka源码编译启动
  • (转)Linux下编译安装log4cxx
  • .bat批处理出现中文乱码的情况
  • .Net 6.0 处理跨域的方式
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • 。Net下Windows服务程序开发疑惑
  • :not(:first-child)和:not(:last-child)的用法
  • @property括号内属性讲解
  • @取消转义
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解