linux写c语言工具,Linux下用C语言实现推箱子游戏

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

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

游戏介绍

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

e8e57e7a9e301e7c9f00f1e9a8f40bcf.png

游戏思维

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

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

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("\n");

}

}

//推箱子

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("通关!\n");

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持WEB开发者。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/57943.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

错别字检测的软件有哪些?自动检查错别字的工具 文字校对 文本纠错 查错别字 校对软件 错别字检查 论文格式 在线校对

我们日常生活中&#xff0c;无论从事什么行业做什么工作&#xff0c;都一定会需要在电脑上打字、写文章文件&#xff0c;而大部分人都难免出现写错别字的情况。这时候就很需要自动检查错别字的软件&#xff0c;来帮助我们快速解决错别字的问题。 爱校对 错别字在线识别检测 错…

如何写好需求文档?

有一天&#xff0c;一位朋友打电话给我。 朋友&#xff1a;“听说你们公司是做产权的&#xff0c;我这有相关的项目&#xff0c;你们能做吗&#xff1f;” 老吴&#xff1a;“我们公司现在不打算接项目了&#xff0c;以做产品为主。” 朋友&#xff1a;“你在公司负责什么啊…

以梦为马,不负韶华|电巢科技延安大学飞鹰计划实习班精彩回顾

时光流淌无声&#xff0c;昨天仿佛还初次见面&#xff0c;今天却又是一年的尾声。你是否结交到亲密的小伙伴&#xff1f;你是否感受到团队合作的魅力&#xff1f;你是否在延大这片沃土得到成长&#xff1f;假如你还没答案&#xff0c;那么看看其他人的回答。 在延安大学&#x…

oracle _读取,oracle中如何读写bold类型的数据

Oracle的Blob字段比较特殊,他比long字段的性能要好很多,可以用来保存例如图片之类的二进制数据。 写入Blob字段和写入其它类型字段的方式非常不同,因为Blob自身有一个cursor,你必须使用cursor对 blob进行操作,因而你在写入Blob之前,必须获得cursor才能进行写入,那么如何…

linux下mysql 大小写敏感 设置

说明&#xff1a; MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的&#xff1a;    1、数据库名与表名是严格区分大小写的&#xff1b;    2、表的别名是严格区分大小写的&#xff1b;    3、列名与列的别名在所有的情况下均是忽略大小写的&#xff1b;…

如何用python读写excel文件_如何用Python读写Excel文件?最便捷的3种方式

python读写excel的方式有很多&#xff0c;这里我介绍3种方式&#xff0c;一种是利用xlrd和xlwt进行excel读写&#xff0c;一种是openpyxl读写&#xff0c;最后一种是利用pandas进行读写&#xff0c;下面我主要介绍一下3种方式读写的过程&#xff0c;实验环境win7python3.6pycha…

基于模型的软件开发方法综述

文章目录 前言1 基于模型的软件开发概述2模型驱动架构2.1 模型驱动的软件体系结构2.2 模型驱动的软件开发步骤 3 建模语言3.1UML3.2 SysML3.3 AADL 4 软件建模工具4.1 Rhapsody4.2 SCADE4.3 Matlab4.3.1 Matlab Coder4.3.2 Simulink Coder 4.4 其他工具4.4.1 Enterprise Archit…

(附源码)spring boot流浪动物救助系统 毕业设计180920

目 录 摘要 1 1 绪论 1 1.1 研究背景 1 1.2国内外研究现状 1 1.3论文结构与章节安排 1 2 流浪动物救助系统系统分析 3 2.1 可行性分析 3 2.2 系统流程分析 3 2.2.1 数据流程 3 3.3.2 业务流程 4 2.3 系统功能分析 4 2.3.1 功能性分析 4 2.3.2 非功能性分析 5 2.4 系统用例分析 …

大气污染扩散模型Calpuff教程

详情点击链接&#xff1a;大气污染扩散模型Calpuff教程一&#xff0c;Calpuff 1.Calpuff模型 2、Calpuff模型基础 3、Calpuff模型下载安装 1&#xff09;Calpro系统安装 2&#xff09;安装环境要求 3&#xff09;需安装的辅助软件二&#xff0c;数据预处理 1.网格设置 …

北大核心期刊2012《科技通报》杂志简介《科技通报》论文范文

北大核心期刊2012《科技通报》杂志简介《科技通报》论文范文 转载▼ 标签&#xff1a; 刘兴 柳林 科技通报 中文核心期刊 动态规划 文化 刊名&#xff1a; 科技通报 Bulletin of Science and Technology 主办&#xff1a; 浙江省科学技术协会 周期&#x…

【论文阅读】社交网络识别影响力最大节点方法综述-05

Vital nodes identification in complex networks 识别单个重要节点的方法基于结构信息一、结构中心性&#xff08;Structural centralities&#xff09;1.度中心性&#xff08;基于邻域的中心性&#xff09;2.四阶邻居信息&#xff08;基于邻域的中心性&#xff09;3.ClusterR…

【论文阅读】基于整合项目反应理论(IRT)的深度神经网络的解析自动作文评分

摘要 作文考试一直以来作为一种衡量应试者的更高等级的能力的方式吸引大家的注意&#xff0c;但是目前在对他们进行评分评定等级的时候有两个主要的缺陷&#xff0c;一是人力成本昂贵&#xff0c;二是存在公平性的问题。作为一种克服这些困难的方式&#xff0c;自动作文评分&a…

JSP基于WEB网上论坛设计与实现(源代码+论文+开题报告+答辩PPT+外文翻译)

cc学院 毕业设计&#xff08;论文&#xff09;开题报告 题 目&#xff1a; 基于JSP的学生学籍管理系统 学 科 部&#xff1a; 信工学科部 专 业&#xff1a; 计算机科学与技术 班 级&#xff1a; 学 号&#xff1a; 姓 名&#xff1a; 指导教师&#xff1a; 填表日期&…

【文本生成】必读论文合集推荐 丨剑桥大学等提出全新的 MAGIC 框架,得到明显优于弱监督模型的文本生成质量

文本生成是自然语言处理中一个重要的研究领域&#xff0c;具有广阔的应用前景。国内外已有如Automated Insights、Narrative Science以及“小南”机器人和“小明”机器人等文本生成系统投入使用。这些系统根据格式化数据或自然语言文本生成新闻、财报或者其他解释性文本。 AMin…

百篇论文纵览大型语言模型最新研究进展

© 作者&#xff5c;王晓磊 机构&#xff5c;中国人民大学 方向 | 对话式信息获取 来自 | RUC AI Box 进NLP群—>加入NLP交流群(备注nips/emnlp/nlpcc进入对应投稿群) 本文整理了2022年以来发表在顶级会议上的大语言模型相关论文。 导读 去年底&#xff0c;OpenA…

#论文阅读# MORAN

论文地址&#xff1a;https://arxiv.org/pdf/1901.03003.pdf 代码地址&#xff1a;MORANv2-pytorch版本 1 abstract 不规则文本识别由于有着各种各样的形状&#xff0c;因此仍有较大的困难&#xff0c;本文提出MORAN&#xff1a;包含一个多目标蒸馏网络&#xff08;multi-obj…

论文阅读_MAE

论文信息 name_en: Masked Autoencoders Are Scalable Vision Learners name_ch: 带遮蔽的自编码器是大规模的视觉学习者 paper_addr: https://ieeexplore.ieee.org/document/9879206/ doi: 10.1109/CVPR52688.2022.01553 date_read: 2023-04-08 date_publish: 2022-06-01 tag…

eval有时候也可以用,而且有奇效

ChatGPT取代程序员还是给程序员加Buff&#xff1f; 这两周&#xff0c;AI新闻一个接着一个&#xff0c;3月23日&#xff0c;Google开放了内测已久的AI对话服务Bard&#xff0c;Google强调&#xff0c;这是一款定位为用户提供创意之源的产品&#xff0c;可生成写作草稿或生活中…

chatgpt赋能python:Python数据散点图:用于数据可视化的强大工具

Python数据散点图&#xff1a;用于数据可视化的强大工具 数据可视化是将数据转化为图表或图形的过程&#xff0c;以使人们更容易理解和解释数据。散点图是一个强大的数据可视化工具&#xff0c;可以使用Python来制作。 什么是散点图 散点图是一种在二维平面上以点的形式展示…

chatgpt赋能python:PythonU盘:如何使用Python为U盘增加更多功能

Python U盘&#xff1a;如何使用Python为U盘增加更多功能 Python已经成为了世界上使用最广泛和最流行的编程语言之一。它具有易于上手&#xff0c;简洁明了的语法&#xff0c;以及强大的库和工具生态系统&#xff0c;使得Python在开发各种不同类型的应用程序和系统时非常受欢迎…