【自用13.1】C++推箱子游戏

news/2024/9/20 3:53:15/ 标签: c++, 游戏, 开发语言

以下是初版代码,进行了初步的简单优化,具体思路以及优化步骤已经在备注中标明。

后期根据情况会出详细版的讲解。

#include <graphics.h>
#include <iostream>
#include <stdlib.h>
#include <string>
#include <conio.h> //与获取热键相关的头文件
using namespace std;//使用宏定义,方便代码的后期维护
#define RATIO 61
#define SCREEN_WIDTH 960
#define SCREEN_HEIGHT 768
#define LINE 9
#define COLUMN 12
#define START_X 100
#define START_Y 150#define isValid(pos) pos.x>0 && pos.x<LINE && pos.y>0 && pos.y<COLUMN//控制键上下左右控制方向,q退出,增强代码可读性
#defin KEY_UP 'w'
#defin KEY_DOWN 's'
#defin KEY_LEFT 'a'
#defin KEY_RIGHT 'd'
#defin KEY_QUIT 'q'//IMAGE images[6];//全局变量设置图标种类数目enum _PROPS{WALL, //墙FLOOR, //地板BOX_DES, //箱子目的地MAN, //小人BOX, //箱子HIT, //箱子命中目标ALL
};struct _POS{int x;//小人所在的二维数组的行int y;//小人所在的二维数组的列
}IMAGE images[ALL];enum _DIRECTION{UP,DOWN,LEFT,RIGHT
};/*游戏地图*/
int map[LINE][COLUMN] = {{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },{ 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0 },{ 0, 1, 4, 1, 0, 2, 1, 0, 2, 1, 0, 0 }, { 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0 },{ 0, 1, 0, 2, 0, 1, 1, 4, 1, 1, 1, 0 },{ 0, 1, 1, 1, 0, 3, 1, 1, 1, 4, 1, 0 },{ 0, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 0 },{ 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0 },{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
};/********************************************************判断游戏是否结束,如果不存在游戏目的地,就代表游戏结束*输入:*返回值:*    true-游戏结束*    false-游戏继续******************************************************/
bool isGameOver(){for(int i=0;i<LINE;i++){for(int j=0;j<COLUMN;j++){if(map[i][j]==BOX_DES) return false;}}return true;
}/********************************************************游戏结束场景,在玩家通关后显示*输入:*   bg-背景图片变量的指针*返回值:无******************************************************/
void gameOverScene(IMAGE *bg){putimage(0,0,bg);settextcolor(WHITE);RECT rec={0,0,SCREEN_WIDTH,SCREEN_HEIGHT};settextstyle(20,0,_T("宋体"));drawtext(_T("恭喜您!\n通过关卡!"),&rec,DT_CENTER|DT_VCENTER|DT_SINGLELINE);//水平居中|垂直居中|文字显示单行
}/********************************************************改变游戏地图视图中一格对应道具并重新显示*输入:*    line-道具在地图数组的行下标*    column-道具在地图数组的列下标*    prop-道具的类型*返回值:无******************************************************/
void changeMap(struct _POS pos, enum _PROPS prop){//int line,int column//map[line][column]=prop;map[pos->x][pos->y]=prop;//putimage(START_X+column*RATIO, START_Y+line*RATIO,&images[prop]);putimage(START_X+pos->y*RATIO, START_Y+pos->x*RATIO,&images[prop]);
}/********************************************************实现游戏四个方向(上下左右)的控制*输入:*    direct-人前进方向*输出:无******************************************************/
void getControl(enum _DIRECTION direct){//int x=man.x;//int y=man.y;struct _POS next_pos=man;struct _POS next_next_pos=man;switch(direct){//找到人的下一个位置和下下个位置的坐标case UP:next_pos.x--;next_next_pos.x-=2;break;case DOWN:next_pos.x++;next_next_pos.x+=2;break;case LEFT:next_pos.y--;next_next_pos.y-=2;break;case RIGHT:next_pos.y++;next_next_pos.y+=2;break;}//优化后//宏展开next_pos.x>0 && next_pos.x<LINE && next_pos.y>0 && next_pos.y<COLUMNif(isVaild(next_pos) && map[next_pos.x][next_pos.y]==FLOOR){//人的前方是地板//changeMap(next_pos.x,next_pos.y);changeMap(&next_pos,MAN);//changeMap(man.x,man.y,FLOOR);changeMap(&man,FLOOR);man=next_pos;}else if(isVaild(next_next_pos) && map[next_pos.x][next_pos.y]==BOX){//人的前方是箱子//两种情况,箱子前面是地板或者是箱子目的地if(map[next_next_pos.x][next_next_pos.y]==FLOOR){//箱子前面是地板changeMap(&next_next_pos,BOX);changeMap(&next_pos,MAN);changeMap(&man,FLOOR);man=next_pos;}else if(map[next_next_pos.x][next_next_pos.y]==BOX_DES){//箱子前面是目的地changeMap(&next_next_pos,HIT);changeMap(&next_pos,MAN);changeMap(&man,FLOOR);man=next_pos;}}//优化前// if(direct==UP){//先处理前进方向是地板的情况//     if((man.x-1)>=0 && map[next_pos.x][next_pos.y]==FLOOR){//map[x-1][y]==FLOOR//         //changeMap(x-1,y,MAN);//小人前进一格//         changeMap(next_pos.x,next_pos.y);//         //man.x=x-1;//         changeMap(man.x,man.y,FLOOR);//         man=next_pos;//         //changeMap(x,y,FLOOR);//     }// }else if(direct==DOWN){//     if((man.x+1)<LINE && map[next_pos.x][next_pos.y]==FLOOR){//map[x+1][y]==FLOOR//         // changeMap(x+1,y,MAN);//         // man.x=x+1;//         // changeMap(x,y,FLOOR);//         changeMap(next_pos.x,next_pos.y);//         changeMap(man.x,man.y,FLOOR);//         man=next_pos;//     }// }else if(direct==LEFT){//     if((man.y-1)>=0 && map[next_pos.x][next_pos.y]==FLOOR){//map[x][y-1]==FLOOR//         // changeMap(x,y-1,MAN);//         // man.y=y-1;//         // changeMap(x,y,FLOOR);//         changeMap(next_pos.x,next_pos.y);//         changeMap(man.x,man.y,FLOOR);//         man=next_pos;//     }// }else if(direct==RIGHT){//     if((man.y+1)<COLUMN && map[next_pos.x][next_pos.y]==FLOOR){//map[x][y+1]==FLOOR//         // changeMap(x,y+1,MAN);//         // man.y=y+1;//         // changeMap(x,y,FLOOR);//         changeMap(next_pos.x,next_pos.y);//         changeMap(man.x,man.y,FLOOR);//         man=next_pos;//     }// }
}int main(void){IMAGE bg_img;//搭台initgraph(SCREEN_WIDTH, SCREEN_HEIGHT);//创建画面,并设置其大小loadimage(&bg_img, _T("blackground.bmp"), SCREEN_WIDTH,SCREEN_HEIGHT, true);//加载画面背景图片putimage(0, 0, &bg_img);//放置画面背景图片,并设置其位置//加载道具图标loadimage(&images[WALL], _T("wall.bmp"), RATIO, RATIO, true);loadimage(&images[FLOOR], _T("floor.bmp"), RATIO, RATIO, true);loadimage(&images[BOX_DES], _T("des.bmp"), RATIO, RATIO, true);loadimage(&images[MAN], _T("man.bmp"), RATIO, RATIO, true);loadimage(&images[BOX], _T("box.bmp"), RATIO, RATIO, true);loadimage(&images[HIT], _T("box.bmp"), RATIO, RATIO, true);for(int i = 0; i< LINE; i++){for(int j = 0; j < COLUMN; j++){if(map[i][j]==MAN){//找到小人的位置man.x=i;man.y=j;}putimage(START_X+j*RATIO, START_Y+i*RATIO,&images[map[i][j]]);//在对应位置放置道具图标}}//游戏环节bool quit=false;do{if(_kbhit()){//如果键盘被敲击,_kbhit()函数会返回truechar ch=_getch();//获取玩家敲击的键//对不同的热键进行处理if(ch==KEY_UP){gameControl(UP);}else if(ch==KEY_DOWN){gameControl(DOWN);}else if(ch==KEY_LEFT){gameControl(LEFT);}else if(ch==KEY_RIGHT){gameControl(RIGHT);}else if(ch==KEY_QUIT){quit=true;}if(isGameOver()){gameOverScene(&bg_img);quit=true;}}Sleep(100);//休眠0.1秒}while(quit==false)system("pause");//游戏结束,释放资源closegraph();return 0;
}


http://www.ppmy.cn/news/1511891.html

相关文章

Axios vs Fetch:哪种网络请求工具在 Vue 项目中更胜一筹?

在 Vue.js 项目中进行网络请求是开发过程中不可避免的一部分&#xff0c;而常用的两种工具就是 axios 和原生的 fetch。这两者各有优劣&#xff0c;开发者在选择时需要根据具体需求进行权衡。本文将详细对比 axios 和 fetch&#xff0c;并展示如何在 Vue 项目中封装和使用它们。…

ubuntu查看CPU、内存、硬盘

1、查看CPU cat /proc/cpuinfo 我这台机器CPU是2核&#xff0c;所以这里是2核 或者使用如下命令也可以查看 lscpu 查看CPU使用率 top 2、查看内存 查看内存信息&#xff1a; free -h 查看内存使用情况&#xff1a; vmstat 3、硬盘 查看硬盘使用情况&#xff1a; df -…

FPGA进阶教程15 使用mdio接口定义百兆以太网

我们接上一讲&#xff0c;要搞懂这一节的内容需要仔细分析一下mdio_ctrl的代码&#xff0c;在百兆以太网中&#xff0c;我们使用的YT8511芯片是需要关闭自协商模式的&#xff0c;也就是寄存器地址为0X00的第12位要置为0&#xff0c;寄存器定义如下图所示&#xff1a; 其次&…

选择金赛增,孩子轻松长高的科学方案

最初我意识到孩子身高矮的时候&#xff0c;其实走了很多弯路&#xff0c;什么钙铁锌硒&#xff0c;各种营养品没少吃&#xff0c;可能是心里不愿意面对孩子可能是生病了这件事&#xff0c;还试了很多偏方&#xff0c;最后实在是不见长&#xff0c;才去了医院。 一开始去市医院…

异构数据同步 datax (3) xxl-job 分布式任务调度

datax 需要手动执行 python 脚本来满足需求&#xff0c;可通过XXL-JOB 进行任务调度实现&#xff0c;满足自动化数据同步需求。 1、nacos 配置 # 配置 xxxx:job:runScript: /home/midware/datax/script/mysql_ps_test.shpythonScriptPath: /home/midware/datax/bin/datax.py j…

MiniCPM-V: A GPT-4V Level MLLM on Your Phone论文阅读

大模型的趋势&#xff1a;模型性能越来越好&#xff0c;模型参数变小&#xff0c;端边设备计算能力变强。 MiniCPM-V优点 结果好、OCR能力突出、多分辨率、多语言、易于部署 模型结构 图片encoder适用vit。输入整体以及切片。切片使用自适应算法&#xff0c;通过计算分数&am…

linux shell 脚本 let 数学计算

linux shell 脚本 let 数学计算 http://www.codebaoku.com/it-shell/ let命令中的算术表达式必须用双引号括起来&#xff0c;以避免解释器对特殊字符进行处理。 在变量的计算中&#xff0c;不需要使用$符号来表示变量&#xff0c; #!/bin/shweek_daydate %u echo $week_day…

MCU复位RAM会保持吗,如何实现复位时变量数据保持

在使用MCU时&#xff0c;通常大家默认MCU复位时RAM会被复位清零&#xff0c;那实际MCU复位时RAM是什么状态&#xff1f;如何让mcu复位时RAM保持不变呢&#xff1f; MCU复位有电源复位、Standby复位、内核复位、看门狗复位、引脚复位等。 其中内部会有掉电动作的复位有电源复位…

笔试练习day5

目录 游游的you题目解析解法方法一贪心方法二 腐烂的苹果题目解析例子1例子2解法多源BFS最短路径代码代码解析 JZ62 孩子们的游戏(圆圈中最后剩下的数)题目解析解法方法一模拟环形链表模拟数组模拟 方法二递推/递归/动态规划状态表示状态转移方程代码 感谢各位大佬对我的支持,如…

全新分支版本!微软推出Windows 11 Canary Build 27686版

已经很久没有看到 Windows 11 全新的分支版本了&#xff0c;今天微软发布 Windows 11 Canary 新版本&#xff0c;此次版本号已经转移到 Build 27xxx&#xff0c;首发版本为 Build 27686 版。 此次更新带来了多项改进&#xff0c;包括 Windows Sandbox 沙盒功能切换到 Microsof…

Compose(5)组件

讲一下compose的组件 在 Jetpack Compose 中&#xff0c;有许多不同类型的组件可用于构建用户界面。 一、基础组件 1.Text&#xff1a;用于显示文本内容。可以设置字体大小、颜色、样式等属性。 例如&#xff1a; Composablefun TextExample() {Text(text "Hello, Co…

【CAN-IDPS】汽车网关信息安全要求以及实验方法

《汽车网关信息安全技术要求及试验方法》是中国的一项国家标准,编号为GB/T 40857-2021,于2021年10月11日发布,并从2022年5月1日起开始实施 。这项标准由全国汽车标准化技术委员会(TC114)归口,智能网联汽车分会(TC114SC34)执行,主管部门为工业和信息化部。 该标准主要…

歌曲爬虫下载

本次编写一个程序要爬取歌曲音乐榜https://www.onenzb.com/ 里面歌曲。有帮到铁子的可以收藏和关注起来&#xff01;&#xff01;&#xff01;废话不多说直接上代码。 1 必要的包 import requests from lxml import html,etree from bs4 import BeautifulSoup import re impo…

【人工智能】使用NLP进行语音到文本的转换和主题的提取项目实践及案例分析一

一、项目概述 本项目旨在构建一个完整的语音到文本转换系统&#xff0c;并进一步从转换后的文本中提取主题。这涉及到自然语言处理&#xff08;NLP&#xff09;的多个关键技术&#xff0c;包括语音识别&#xff08;ASR, Automatic Speech Recognition&#xff09;、文本处理、…

【算法】马踏棋盘(骑士周游)问题回溯算法实现以及使用贪心算法优化

目录 1.游戏规则 2.算法分析 3.解决步骤和思路 4.马踏棋盘算法的代码实现 4.1计算马儿还能走哪些位置 4.2马踏棋盘的核心代码 4.3马踏棋盘算法完整代码 4.4使用贪心算法进行优化 4.4.1思路 4.4.2代码实现 1.游戏规则 将马儿随机放在国际象棋的 8*8 棋盘的某个方格中…

Java OkHttp使用(二)

文章目录 引言使用 OkHttp 发送回调其他 引言 记录一下 OkHttp 的使用&#xff1b;OkHttp 异步发送回调请求&#xff0c;增加回调失败重试。 使用 OkHttp 发送回调 /*** 回调重试类*/ Data public class CallBackRetryData {/*** 回调信息JSON*/private JSONObject bodyRequ…

设计模式反模式及UML图示常见误用案例分析

设计模式反模式及UML图示常见误用案例分析是一个深入探讨软件设计过程中常见问题及其解决方案的重要话题。在软件设计中&#xff0c;设计模式是用来解决常见问题的最佳实践&#xff0c;然而&#xff0c;当设计模式被错误地应用或误解时&#xff0c;就可能导致反模式的出现&…

edge浏览器可以,chrome浏览器看不到接口数据

chrome 谷歌浏览器&#xff0c;可以看到页面&#xff0c;F12的开发者工具看不到返回数据 无法加载响应数据: No data found for resource with given identifier Chrome 将显示 ERR_INTERNET_DISCONNECTED 错误 edge浏览器是正常的。 哈哈哈哈哈哈&#xff0c;这里误点了&a…

【通信基础】欧拉公式

复数至极坐标的变换 任何复数皆可记为 模 相位

掌握Objective-C文本对齐:NSTextTab与NSTextTable的高级应用

标题&#xff1a;掌握Objective-C文本对齐&#xff1a;NSTextTab与NSTextTable的高级应用 在Objective-C中&#xff0c;NSTextTab和NSTextTable提供了强大的文本制表和表格布局功能&#xff0c;它们是文本排版中不可或缺的工具。本文将深入探讨这两个API如何在实际开发中处理文…