main.c

主函数,负责开启游戏

#include<stdio.h>
#include"direction.h"
#include"game2048.h"
#include"tools.h"
int main()
{   start_game();play();
}

game2048.c

游戏为一个死循环,直到满足条件后结束

#include<stdio.h>
#include"game2048.h"
#include"tools.h"
void play(void)
{for(;;){new_step();//清理屏幕、随机位置生成2move();//上下左右移动   if_win();}
}

game2048.h

game2048源文件所需的头文件,主要作用为声明函数

#ifndef GAME_2048_H
#define GAME_2048_H
void play(void);
#endif

tools.c

辅助工具:游戏初始化、移动键、判断是否结束

#include<stdio.h>
#include<getch.h>
#include<stdlib.h>
#include<time.h>
#include"tools.h"
#include"direction.h"
int map[4][4]={};
int if_add_2=1;
void start_game(void)
{for(int i=0;i<4;i++)for(int j=0;j<4;j++)map[i][j]=0;srand(time(NULL));int x=0;int y=0;x=rand()%4;y=rand()%4;if(map[x][y]==0)    map[x][y]=2;
}
void new_step(void)//清屏 随机生成一个2
{system("clear");srand(time(NULL));if(if_add_2==1)for(; ;){int x=0;int y=0;x=rand()%4;y=rand()%4;if(map[x][y]==0){    map[x][y]=2;if_add_2=0;break;}}for(int i=0;i<4;i++){for(int j=0;j<4;j++)printf("%-5d",map[i][j]);printf("\n\n");}}
void move(void)//移动
{switch(getch()){case 183: up();break;case 184: down();break;case 186: left();break;case 185: right();break;}
}
void if_win(void)//判断结束
{for(int i=0;i<4;i++)for(int j=0;j<4;j++){if(map[i][j]==2048){printf("你真腻害!\n");exit(0);}}int if_full=1;for(int i=0;i<4;i++)for(int j=0;j<4;j++){if(i-1>=0&&map[i-1][j]==map[i][j])if_full=0;if(i+1<4&&map[i+1][j]==map[i][j])if_full=0;if(j-1>=0&&map[i][j-1]==map[i][j])if_full=0;if(j+1<4&&map[i][j+1]==map[i][j])if_full=0;if(map[i][j]==0)if_full=0;}if(if_full==1){printf("菜狗\n");exit(0);}
}

tools.h

tools.c源文件的头文件

#ifndef TOOLS_H
#define TOOLS_H
void new_step(void);
void move(void);
void if_win(void);
void start_game(void);
#endif

direction.c

方向键——枚举法,后续进行优化

方向键——枚举法//后续进行优化
#include<stdio.h>
#include"direction.h"
extern int map[4][4];//调用tools.c里定义的二维数组
extern int if_add_2;
void up(void)
{for(int i=0;i<4;i++){    if(map[0][i]>0&&map[0][i]==map[1][i]){map[0][i]=2*map[0][i];map[1][i]=0;if_add_2=1;}else if(map[0][i]>0&&map[1][i]==0&&map[0][i]==map[2][i]){map[0][i]=2*map[0][i];map[2][i]=0;if_add_2=1;}else if(map[0][i]>0&&map[1][i]==0&&map[2][i]==0&&map[0][i]==map[3][i]){map[0][i]=2*map[0][i];map[3][i]=0; if_add_2=1;}//第一格数据处理if(map[1][i]>0&&map[1][i]==map[2][i]){map[1][i]=2*map[1][i];map[2][i]=0; if_add_2=1; }else if(map[1][i]>0&&map[2][i]==0&&map[1][i]==map[3][i]){map[1][i]=2*map[1][i];map[3][i]=0;  if_add_2=1;     }//第二格数据处理if(map[2][i]>0&&map[2][i]==map[3][i]){map[2][i]=2*map[2][i];map[3][i]=0;if_add_2=1;   }//第三格数据处理if(map[1][i]>0&&map[0][i]==0){map[0][i]=map[1][i];map[1][i]=0;if_add_2=1;}//第二格移动if(map[2][i]>0&&map[1][i]==0&&map[0][i]==0){map[0][i]=map[2][i];map[2][i]=0;if_add_2=1;}else if(map[2][i]>0&&map[1][i]==0){map[1][i]=map[2][i];map[2][i]=0;if_add_2=1;}//第三格移动if(map[3][i]>0&&map[2][i]==0&&map[1][i]==0&&map[0][i]==0){map[0][i]=map[3][i];map[3][i]=0;if_add_2=1;}else if(map[3][i]>0&&map[2][i]==0&&map[1][i]==0){map[1][i]=map[3][i];map[3][i]=0;if_add_2=1;}else if(map[3][i]>0&&map[2][i]==0){map[2][i]=map[3][i];map[3][i]=0;if_add_2=1;}//第四格移动}
}void down(void)
{for(int i=3;i>=0;i--){    if(map[3][i]>0&&map[3][i]==map[2][i]){map[3][i]=2*map[3][i];map[2][i]=0;if_add_2=1;  }else if(map[3][i]>0&&map[2][i]==0&&map[3][i]==map[1][i]){map[3][i]=2*map[3][i];map[1][i]=0;  if_add_2=1; }else if(map[3][i]>0&&map[2][i]==0&&map[1][i]==0&&map[3][i]==map[0][i]){map[3][i]=2*map[3][i];map[0][i]=0;  if_add_2=1;         }//第一格数据处理if(map[2][i]>0&&map[2][i]==map[1][i]){map[2][i]=2*map[2][i];map[1][i]=0;if_add_2=1; }else if(map[2][i]>0&&map[1][i]==0&&map[2][i]==map[0][i]){map[2][i]=2*map[2][i];map[0][i]=0;if_add_2=1;             }//第二格数据处理if(map[1][i]>0&&map[1][i]==map[0][i]){map[1][i]=2*map[1][i];map[0][i]=0;if_add_2=1;           }//第三格数据处理if(map[2][i]>0&&map[3][i]==0){map[3][i]=map[2][i];map[2][i]=0;if_add_2=1;}//第二格移动if(map[1][i]>0&&map[2][i]==0&&map[3][i]==0){map[3][i]=map[1][i];map[1][i]=0;if_add_2=1;}else if(map[1][i]>0&&map[2][i]==0){map[2][i]=map[1][i];map[1][i]=0;if_add_2=1;}//第三格移动if(map[0][i]>0&&map[1][i]==0&&map[2][i]==0&&map[3][i]==0){map[3][i]=map[0][i];map[0][i]=0;if_add_2=1;}else if(map[0][i]>0&&map[1][i]==0&&map[2][i]==0){map[2][i]=map[0][i];map[0][i]=0;if_add_2=1;}else if(map[0][i]>0&&map[1][i]==0){map[1][i]=map[0][i];map[0][i]=0;if_add_2=1;}//第四格移动}
}void left(void)
{for(int i=0;i<4;i++){    if(map[i][0]>0&&map[i][0]==map[i][1]){map[i][0]=2*map[i][0];map[i][1]=0; if_add_2=1;         }else if(map[i][0]>0&&map[i][1]==0&&map[i][0]==map[i][2]){map[i][0]=2*map[i][0];map[i][2]=0;if_add_2=1;           }else if(map[i][0]>0&&map[i][1]==0&&map[i][2]==0&&map[i][0]==map[i][3]){map[i][0]=2*map[i][0];map[i][3]=0;  if_add_2=1;         }//第一格数据处理if(map[i][1]>0&&map[i][1]==map[i][2]){map[i][1]=2*map[i][1];map[i][2]=0;  if_add_2=1;         }else if(map[i][1]>0&&map[i][2]==0&&map[i][1]==map[i][3]){map[i][1]=2*map[i][1];map[i][3]=0;  if_add_2=1;         }//第二格数据处理if(map[i][2]>0&&map[i][2]==map[i][3]){map[i][2]=2*map[i][2];map[i][3]=0;      if_add_2=1;     }//第三格数据处理if(map[i][1]>0&&map[i][0]==0){map[i][0]=map[i][1];map[i][1]=0;if_add_2=1;}//第二格移动if(map[i][2]>0&&map[i][1]==0&&map[i][0]==0){map[i][0]=map[i][2];map[i][2]=0;if_add_2=1;}else if(map[i][2]>0&&map[i][1]==0){map[i][1]=map[i][2];map[i][2]=0;if_add_2=1;}//第三格移动if(map[i][3]>0&&map[i][2]==0&&map[i][1]==0&&map[i][0]==0){map[i][0]=map[i][3];map[i][3]=0;if_add_2=1;}else if(map[i][3]>0&&map[i][2]==0&&map[i][1]==0){map[i][1]=map[i][3];map[i][3]=0;if_add_2=1;}else if(map[i][3]>0&&map[i][2]==0){map[i][2]=map[i][3];map[i][3]=0;if_add_2=1;}//第四格移动}
}void right(void)
{for(int i=3;i>=0;i--){    if(map[i][3]>0&&map[i][3]==map[i][2]){map[i][3]=2*map[i][3];map[i][2]=0;if_add_2=1;          }else if(map[i][3]>0&&map[i][2]==0&&map[i][3]==map[i][1]){map[i][3]=2*map[i][3];map[i][1]=0;if_add_2=1;           }else if(map[i][3]>0&&map[i][2]==0&&map[i][1]==0&&map[i][3]==map[i][0]){map[i][3]=2*map[i][3];map[i][0]=0;  if_add_2=1;         }//第一格数据处理if(map[i][2]>0&&map[i][2]==map[i][1]){map[i][2]=2*map[i][2];map[i][1]=0;  if_add_2=1;     }else if(map[i][2]>0&&map[i][1]==0&&map[i][2]==map[i][0]){map[i][2]=2*map[i][2];map[i][0]=0;  if_add_2=1;         }//第二格数据处理if(map[i][1]>0&&map[i][1]==map[i][0]){map[i][1]=2*map[i][1];map[i][0]=0;if_add_2=1;}//第三格数据处理if(map[i][2]>0&&map[i][3]==0){map[i][3]=map[i][2];map[i][2]=0;if_add_2=1;}//第二格移动if(map[i][1]>0&&map[i][2]==0&&map[i][3]==0){map[i][3]=map[i][1];map[i][1]=0;if_add_2=1;}else if(map[i][1]>0&&map[i][2]==0){map[i][2]=map[i][1];map[i][1]=0;if_add_2=1;}//第三格移动if(map[i][0]>0&&map[i][1]==0&&map[i][2]==0&&map[i][3]==0){map[i][3]=map[i][0];map[i][0]=0;if_add_2=1;}else if(map[i][0]>0&&map[i][1]==0&&map[i][2]==0){map[i][2]=map[i][0];map[i][0]=0;if_add_2=1;}else if(map[i][0]>0&&map[i][1]==0){map[i][1]=map[i][0];map[i][0]=0;if_add_2=1;}//第四格移动}
}

direction.h

#ifndef DIRECTION_H
#define DIRECTION_H
void up(void);
void down(void);
void left(void);
void right(void);
#endif

getch.h

获取键值所需的头文件,需要放到include文件夹内,或者和以上文件放到一起,引用时用#include"getch.h"

#ifndef GETCH_H
#define GETCH_H#include <termios.h>
#include <unistd.h>
#include <stdio.h>
static int getch(void)
{// 记录终端的配置信息struct termios old;// 获取终端的配置信息tcgetattr(STDIN_FILENO,&old);// 设置新的终端配置   struct termios new_1 = old;// 取消确认、回显new_1.c_lflag &= ~(ICANON|ECHO);// 设置终端配置信息tcsetattr(STDIN_FILENO,TCSANOW,&new_1);// 在新模式下获取数据   int key_val = 0; do{key_val += getchar();}while(stdin->_IO_read_end - stdin->_IO_read_ptr);// 还原配置信息tcsetattr(STDIN_FILENO,TCSANOW,&old); return key_val;
}#endif//GETCH_H

欢迎大家指正补充

@2048小游戏——C语言、多文件编程、Linux系统相关推荐

  1. 2048小游戏 无限反悔 存档版

    2048小游戏 C语言小菜鸟,写的一个2048小游戏,不足之处多多包涵 代码实现 头文件 void read();//读档 void save();//存档 void readcheat();//作弊 ...

  2. 粤嵌gec6818LED屏幕上画图 太极图 图片显示 电子相册 2048小游戏 实现识别触摸坐标的识别 电子自助点餐设计等项目

    交叉开发     在一个有编辑/编译功能的PC机上进行编辑/编译,生成的可执行文件通过     交叉开发工具下载到目标机(GEC-6818)          开发板 --- Linux内核 --- ...

  3. c语言课程结束小项目:2048小游戏

    <C语言程序设计基础>学习完毕,完成第一个项目:2048小游戏. //思考:编程时,要先想整个框架还是先想每个函数的算法. //思考:每一个函数要不要传参数(即数组) //思考:每一个函数 ...

  4. c语言程序2048_C语言2048小游戏演示和说明

    2048游戏是风靡一时的小游戏,我们提供的2048小游戏不依赖 TC 环境,不依赖任何第三方库,可以在 VS.CodeBlocks.DEV C++ 等常见 IDE中编译通过.我们提供给大家的 2048 ...

  5. C语言实现2048小游戏

    C语言实现2048小游戏-粤嵌GE6818嵌入式系统实训 部分功能演示视频. 实现的全部功能: 1.字模显示封面组员名字 2.完成2048游戏在板子上的运行 3.成功或者失败需要有标志也可以计分 4. ...

  6. C语言实现2048小游戏---粤嵌GE6818嵌入式系统实训

    C语言实现2048小游戏---粤嵌GE6818嵌入式系统实训 实现的全部功能: 功能演示: 版本介绍 简易版--大佬选这个 完整版--想保研.想得高分.想要装逼的同学选这个 至尊版--零基础的.想要装 ...

  7. c语言2048代码linux,C语言实现2048小游戏(示例代码)

    2048 一.设计思路 1.游戏规则 想要制作游戏,首先需要了解游戏的规则,下面就来介绍2048的游戏规则 2048游戏共有16个格子,初始时初始数字由2或者4构成. 手指向一个方向滑动,所有格子会向 ...

  8. Linux C语言编写2048小游戏

    2048 2048小游戏是用Linux C语言写的,运行在Ubuntu系统上,其中Ubuntu链接Ncuses库.首先,我们简单了解一下Ncurses. Ncurses库是由原CURSES库发展而来的 ...

  9. java 2048游戏_JAVA2048游戏 本课程设计是基于java语言的2048小游戏设计 联合开发网 - pudn.com...

    JAVA2048游戏 所属分类:游戏 开发工具:Java 文件大小:789KB 下载次数:4 上传日期:2020-11-23 10:57:11 上 传 者:滴滴滴大萌 说明:  本课程设计是基于jav ...

最新文章

  1. 在DevExpress中使用CameraControl控件进行摄像头图像采集
  2. JVM学习01总体概述
  3. JAVA进制的表示方式
  4. python的运行方式有哪两种_Python基础:Python运行的两种基本方式
  5. 实体词典 情感词典_基于情感词典的情感分析
  6. IIS6同一IP部署多域名证书(部署指南)
  7. jdk版本和java版本一样吗_jdk版本查看,以及java -version 和JAVA_HOME不一致问题
  8. Unity下载安装及许可证获取教程
  9. 湖北广电机顶盒(九联HDC-2100K)安装第3方app保姆教程
  10. C语言编程 犯二的程度,犯二的程度 - osc_jhl7rojx的个人空间 - OSCHINA - 中文开源技术交流社区...
  11. 解读arduino读取模拟信号实例
  12. core dumped 错误
  13. java 佛祖保佑_【Java】SpringBoot 佛祖保佑banner.txt
  14. 计算机专业本科考教资可以考哪些,高中教师资格证计算机专业考什么内容
  15. Java判断一个序列是否可由给定序列通过栈操作获得(ABCDEF)
  16. kafka中Topic、Partition、Groups、Brokers概念辨析
  17. matlab计算涡度的函数_涡度的计算
  18. 计算机二级班主任助理王老师,计算机二级office练习题
  19. 轻松搞定网吧记费管理系统
  20. CCPD2019车牌提取和字符提取

热门文章

  1. SpringCloud Alibaba 简介
  2. php输入文字不显示,ps写了文字为什么不显示 ps里输入文字不显示的四个原因及解决方法...
  3. 罗斯蒙特变送器三种常见故障
  4. 基于CH32V307的自动浇水系统
  5. 中南大学软件学院机器学习实训
  6. AMD四核开六核,微星主板
  7. 情人节程序员用HTML网页表白【中英文版HTML5手机端婚礼邀请函模板下】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript
  8. 大学生医用计算机题库,大学生计算机考题题库.doc
  9. 游戏开始了------全屏与横屏
  10. pycharm mysql 安装_pycharm安装mysql驱动包