前面有Linux的常用命令和vim文本编辑器还没有介绍,之后我会补上的。

今天来介绍如何用C语言写一个简单的小游戏,叫做“小老鼠推箱子”。虽然游戏的编写过程不复杂,但是我觉得能够从中找到自己对于编程的不足和完善自己的编程思维是最重要的。游戏代码不多,所以直接写在一个c文件中。本人小白,有不足之处还望指教

游戏介绍

下图是游戏开始界面,$是小老鼠,#是墙,O是终点,当小老鼠把所有箱子推进终点就代表游戏通过。

游戏思维

游戏地图用一个二维数组去存储。数组中不同的值代表不同的对象(老鼠、墙、路等)。当小老鼠在移动时,数组中的值也会随之改变,但是为了在游戏无法进行下去时可以从新开始游戏,所以需要另一个数组去保留地图的初始状态。也就是说需要两个二维数组,一个始终不改变,一个用来记录实时的状态。

小老鼠在移动时会遇到两种情况,即可移动和不可移动。在编写代码时,只需要将可移动的情况写完成,那么就不需要去判断不可移动的状态。可移动的情况有下面两种:

1、小老鼠面前什么也没有(面前是路或者是终点)。

2、小老鼠前面是箱子,此时分为两种情况(箱子前面是路或者箱子前面是终点)。

这时候,应当思考的是如何根据二维数组的值去判断上述情况,以及当小老鼠移动和推动箱子时,二维数组的值是如何变化的。

#include

#include "get_keyboard.h"

//地图7行8列 行[0-6] 列[0-7]

//0 路

//1 墙

//2 箱子

//3 终点

//4 小老鼠

//7 小老鼠站在终止上

//5 箱子到达终点上

int g_boards[7][8] =

{

{0,1,1,1,1,1,1,0},

{0,1,0,0,0,0,1,1},

{1,3,0,1,1,2,0,1},

{1,0,3,3,2,0,0,1},

{1,0,0,1,2,0,0,1},

{1,0,0,4,0,1,1,1},

{1,1,1,1,1,0,0,0}

}, boards[7][8]={};

//记录小老鼠在移动中的位置

int row = 0;

int col = 0;

int cnt = 0;//箱子个数,用来判断游戏是否结束。

用0~4表示地图上面有的小老鼠等物体,值得提的是对于箱子和小老鼠来说,他们移动时都可能会在终点上,那么他们移入终点和移开终点时的情况需要分别去判断,为了能够避免过多的判断,当它们移入终点时,终点所在位置的值就等于它们的值加上终点的值。同理,当它们移开终点时,终点所在位置的值就等于终点的值减去它们的值。这样就不用去判断小老鼠和箱子在不在终点上了。所以,小老鼠在终点上的值是7。

代码详解

这里先从main()函数开始思考。当游戏开始时,需要先将地图初始化,即把用来记录实时状态的地图初始化成游戏开始时的地图(就是前面提的的两个地图),所以这里需要init()函数。初始化后就是开始游戏,游戏过程中需要获取方向键,这些在start()函数中完成。之后,在这些函数中再去思考是否需要去写其他函数补足功能。

//初始化地图

void init()

{

for(int i=0; i<7*8; i++)

{ //这里是为了当你按下enter键时,能够重置游戏,重置游戏时需要重新初始化地图

boards[i/8][i%8]=g_boards[i/8][i%8];

if(4==boards[i/8][i%8]) //这里还需要记录老鼠的位置

{

row=i/8;

col=i%8;

}

}

}

//打印地图

void print()

{

for(int i=0; i<7; i++)

{

for(int j=0; j<8; j++)

{

switch(boards[i][j])

{

case 0:

printf(" ");break; //空格代表路径

case 1:

printf("#");break; //打印墙

case 2:

case 5:

printf("@");break; //打印箱子

case 3:

printf("O");break; //打印终点

case 4:

case 7:

printf("$");break; //打印小老鼠

}

}

printf("

");

}

}

//推箱子

void move(int nrow, int ncol, int nnrow, int nncol)

{

if(0==boards[nrow][ncol] || 3==boards[nrow][ncol]) //如果小老鼠前面是路或者终点,说明可以移动

{

boards[nrow][ncol] +=4;//小老鼠进入这个位置了

boards[row][col] -=4;//小老鼠离开这个位置了

//移动过后小老鼠的位置也改变了

row = nrow;

col = ncol;

}

else if(2==boards[nrow][ncol] || 5==boards[nrow][ncol]) //如果小老鼠前面是箱子

{

if(0==boards[nnrow][nncol] || 3==boards[nnrow][nncol]) //如果箱子前面是路或者终点则可以移动

{

boards[nnrow][nncol] +=2;

boards[nrow][ncol] -=2-4;

//这里其实是boards[nrow][ncol]=boards[nrow][ncol]-2+4

//减去2是因为箱子移走了,加上4是因为小老鼠进入了

boards[row][col] -=4;

row=nrow;

col=ncol;

}

}

for(int i=0; i<7; i++) //统计游戏是否结束,当箱子都在终点上时就结束了

{

for(int j=0; j<8; j++)

{

if(5==boards[i][j])

{

cnt++;

}

if(3==cnt)

{

printf("通关!

");

exit(0);//通关退出游戏

}

}

}

cnt=0; //如果游戏没有结束,下次还是需要从0统计

}

//开始游戏

void start()

{

while(1)

{

print();//游戏开始时需要打印地图,每次从键盘上获得方向移动后也需要打印地图

int dir=get_keyboard(); //从键盘获取方向

system("clear"); //下次打印地图时,先将屏幕清空

switch(dir) //每次都需要判断小老鼠前面和前面的前面的坐标的状态,这样可以在move()

//函数中统一各个方向的写法

{

case KEY_UP: move(row-1, col, row-2, col);break;

case KEY_DOWN: move(row+1, col, row+2, col);break;

case KEY_LEFT: move(row, col-1, row, col-2);break;

case KEY_RIGHT: move(row, col+1, row, col+2);break;

case KEY_ENTER:

init();break; //按enter则从新开始游戏

case KEY_q:

exit(0);//如果按q则退出游戏

}

}

}

int main()

{

//游戏初始化

init();

system("clear"); //系统命令,用来清空屏幕

//开始游戏

start();

return 0;

}

好了,这就是今天的内容。这里需要的用来获取键盘的头文件直接粘贴在下面。

#ifndef GETCH_H

#define GETCH_H

#include

#include

#include

#include

typedef enum KEYBOARD

{

KEY_UP = 183,

KEY_DOWN = 184,

KEY_RIGHT = 185,

KEY_LEFT = 186,

KEY_BACKSPACE = 127,

KEY_ENTER = 10,

KEY_0 = 48,

KEY_1 = 49,

KEY_2 = 50,

KEY_3 = 51,

KEY_4 = 52,

KEY_5 = 53,

KEY_6 = 54,

KEY_7 = 55,

KEY_8 = 56,

KEY_9 = 57,

KEY_A = 65,

KEY_B = 66,

KEY_C = 67,

KEY_D = 68,

KEY_E = 69,

KEY_F = 70,

KEY_G = 71,

KEY_H = 72,

KEY_I = 73,

KEY_J = 74,

KEY_K = 75,

KEY_L = 76,

KEY_M = 77,

KEY_N = 78,

KEY_O = 79,

KEY_P = 80,

KEY_Q = 81,

KEY_R = 82,

KEY_S = 83,

KEY_T = 84,

KEY_U = 85,

KEY_V = 86,

KEY_W = 87,

KEY_X = 88,

KEY_Y = 89,

KEY_Z = 90,

KEY_a = 97,

KEY_b = 98,

KEY_c = 99,

KEY_d = 100,

KEY_e = 101,

KEY_f = 102,

KEY_g = 103,

KEY_h = 104,

KEY_i = 105,

KEY_j = 106,

KEY_k = 107,

KEY_l = 108,

KEY_m = 109,

KEY_n = 110,

KEY_o = 111,

KEY_p = 112,

KEY_q = 113,

KEY_r = 114,

KEY_s = 115,

KEY_t = 116,

KEY_u = 117,

KEY_v = 118,

KEY_w = 119,

KEY_x = 120,

KEY_y = 121,

KEY_z = 122

}KEYBOARD;

//此函数能立即从键盘不回显的接收数据

static int get_keyboard(void)

{

//接收系统调用的执行结果

int ret = 0;

//存储终端设备的配置信息

struct termios old;

//通过系统调用获取终端的配置信息

ret=tcgetattr(STDIN_FILENO,&old);

if(0 > ret)

{

perror("tcgetattr");

return -1;

}

//初始化新的终端配置信息

struct termios new = old;

//取消回显并立即获取

new.c_lflag &= ~(ICANON|ECHO);

//设置新的终端配置信息

ret= tcsetattr(STDIN_FILENO,TCSANOW,&new);

if(0 > ret)

{

perror("tcsetattr");

return -2;

}

//在新的模式下从终端获取数据

int key_value = 0;

do

{

key_value += getchar();

//由于和系统对FILE结构体的实现各不相同

//linux系统 while(stdin->_IO_read_end - stdin->_IO_read_ptr);

//OS系统 while(stdin->_r);

}while(stdin->_IO_read_end - stdin->_IO_read_ptr);

//还原终端的配置信息

ret = tcsetattr(STDIN_FILENO,TCSANOW,&old);

if(0 > ret)

{

perror("tcsetattr");

return -3;

}

//返回获取到的数据

return key_value;

}

#endif//GETCH_H

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持云海天教程。

原文链接:https://blog.csdn.net/weixin_43374839/article/details/107367696

linux推箱子游戏,Linux下用C语言实现推箱子游戏相关推荐

  1. 纯java语言做rpg游戏_【纯JAVA语言做个RPG游戏】2.游戏界面及角色移动的基本实现...

    继上次做的地图编辑器,我大致的做了一个4000X4000的游戏地图数组,不过只画了一部分,以后要加什么新东西继续编辑这个地图就行了,保存在了一个文件中. 现在便可以继续下一步,做出游戏的大致界面了. ...

  2. c语言贪吃蛇游戏的论文,基于c语言的贪吃蛇游戏论文.doc

    基于c语言的贪吃蛇游戏论文 第 PAGE \* Arabic \* MERGEFORMAT 15 页第 PAGE \* Arabic \* MERGEFORMAT 15 页 学校代码 学号 分 类 号 ...

  3. c语言推箱子游戏实习报告,用C语言编写推箱子游戏

    本文实例为大家分享了C语言推箱子游戏的具体实现代码,供大家参考,具体内容如下 #include #include #include #include //行和列 #define ROW 10 #def ...

  4. c语言出圈游戏课设报告,c语言作业 出圈游戏

    #include//头函数 #include #include #define SIZE 100 struct SeqList{ int num; char name[10]; }; int menu ...

  5. c语言24点游戏代码回法,C语言解24点游戏程序

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 前几天在微博上看到24点的游戏,6 6 6 10.算了很久是在算不出来,最后我想我何不写一个小程序解决它?说做就做,我刚开始的想法很简单,就是列举4个数的 ...

  6. c语言猜数字游戏用while,用C语言实现猜数字游戏

    本文实例为大家分享了C语言实现猜数字的具体代码,供大家参考,具体内容如下 问题:计算机随机生成一个数字,用户进行猜数字,当用户猜错时,提醒用户猜高/猜低,直到用户猜的数字与计算机给的随机数一致时,提示 ...

  7. c语言游戏菜单栏界面设计,C语言课程设计-精美游戏目录选择界面.doc

    计算机技术基础课程设计 C语言 设计报告 题目:精美游戏目录选择界面演示 学院:化学工程学院 专业:制药工程专业 班级:050607 姓名:徐成 指导教师:顾煜新 设计日期:2006年12月14日→2 ...

  8. 算法c语言源码_C语言实现推箱子

    很多同学说C语言难学,不知道C语言学了能做什么,如果说不涉及嵌入式设备编程,我们可以用它来写游戏?是的,C语言能写的游戏有很多,推箱子,贪食蛇,等等 上学的时候老师说过,程序=数据结构+算法,真是这样 ...

  9. C语言编写2048小游戏

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/104992424 2 ...

  10. C语言实现三子棋游戏(规范化)

    `在复习了数组之后,对有些经典的数组题进行了,其中一道就是三子棋游戏这一功能的实现.下面附上我的个人理解和代码,希望各位大佬不吝指教. 首先有一个万能游戏模板,在c语言中有好多实现游戏的代码,我总结了 ...

最新文章

  1. java判断总共天数_Java判断两个日期相差天数的方法
  2. C++类里面的哪些成员函数是内联函数?
  3. 2022.2.17自制辣白菜
  4. 关于华科的计算系统结构专业
  5. (229)DPU加速数据处理
  6. 把互信息写成KL散度的形式
  7. delphi windows编程_学习C/C++:伴随我成长的编程书!
  8. 同城o2o商城系统开发和运营四大要素
  9. Qt之QtCreator Qt5示例丢失解决方案
  10. CES现场直击 AI让你现场获得虚拟双胞胎
  11. 【深度好文】simhash文本去重流程
  12. google 常用的技术搜索关键词
  13. 计算机应用技术要学java吗,计算机应用技术专业主要学什么
  14. 苹果电脑忘记开机密码怎么办?一段代码轻松解决
  15. 如何从mp4视频格式中提取出mp3音频格式
  16. 许多大学生喜欢玩计算机游戏英语作文,英语作文:现在一些青少年沉迷于网络游戏...
  17. python迷宫万花筒代码_Python实现PS滤镜的万花筒效果示例,python万花筒
  18. 小项目一:使用fping统计网络中主机的网络连通情况
  19. 单月涨粉超600w,直播销售额破5亿,2月的黑马都是谁?
  20. python对txt文本文件边读边写,同时读取和写入的方式修改文件

热门文章

  1. JavaScript代理_ES6新增
  2. BiTree T 和Bitree T
  3. 很哇塞的网页特效之字符串切换
  4. 真惭愧--连这样的小事都没有坚持下来
  5. LTK5325 2X5.3W双声道升压G类音频功率放大器
  6. 大数据职业理解_大数据职业发展方向
  7. Spark SQL简介
  8. 数据中心IDC产业研究报告:碳中和背景下,IDC产业链的破局之路
  9. BCH5月硬分叉,如果做成了支付,会超越BTC吗?
  10. JasperReport:数据填充和多种类别报表