C++ 简化 推箱子 小游戏 完整代码 参考网络资料 命令行运行 仅供初学者参考交流
C++ 简化 推箱子 小游戏 完整代码 参考网络资料 命令行运行 仅供初学者参考交流
说明:学做了4关推箱子, 仅供初学者参考可用g++ 编译,可以将内容复制到TXT文件,将后缀改为".cpp"。打开“运行”,输“CMD”,进命令行窗口,用"CD "命令切换目录到main .cpp所在处,输入"g++ main.cpp"回车,输入"a.exe"回车,进入游戏,输入"ALT + C"退出。
效果图
#墙, _空白区, _终点, $箱子, I人。
完整C++代码如下:命令行 g++ 编译 即可运行
#include <iostream>
#include <string>
using namespace std;//学做了4关推箱子,与初学者交流
//可用g++ 编译,可以将内容复制到TXT文件,将后缀改为".cpp"。
//打开“运行”,输“CMD”,进命令行窗口,用"CD "命令切换目录到main .cpp所在处
//输入"g++ main.cpp"回车
//输入"a.exe"回车,进入游戏
//输入"ALT + C"退出//公共变量
int gTimes = 1;//当前关数
int gStageWidth;
int gStageHeight;
int gN;//关卡1地图,#墙 _空白区 .终点 o砖块 p人,
char gStageData_1[] = "\
########\n\
# #\n\
# $ $__#\n\
# I #\n\
########";
int gStageWidth_1 = 8;
int gStageHeight_1 = 5;
int N_1 = 20;//游戏限定步数
//关卡2地图
char gStageData_2[] = "\
################### \n\
# I ## # # \n\
# _ $ # # \n\
# $## # # # \n\
# # # ### \n\
# _ _ \n\
## ## ##### $ _ # \n\";
int gStageWidth_2 = 20;
int gStageHeight_2 = 8;
int N_2 = 100;//游戏限定步数
//关卡3地图
char gStageData_3[] = "\
####################\n\
# ##_ # _#\n\
# _ $ # #\n\
# ## # #_ #\n\
# # # ###$ #\n\
# _ I #\n\
##_ ### ##### $ #\n\
# $ _ #\n\
# # _ #\n\
####################";
int gStageWidth_3 = 20;
int gStageHeight_3 = 10;
int N_3 = 150;//游戏限定步数//关卡4地图
char gStageData_4[] = "\
####################\n\
# ##_ # _#\n\
# _ $ ##_ # $ _#\n\
# #### # #_ #\n\
# # ###$$ #\n\
# $ _ $$ #\n\
# _ #_ $ #\n\
# # $ # ### \n\
# I ### # #_ #\n\
####################";
int gStageWidth_4 = 20;
int gStageHeight_4 = 10;
int N_4 = 150;//游戏限定步数enum Object{OBJ_SPACE,OBJ_WALL,OBJ_GOAL,OBJ_BLOCK,OBJ_BLOCK_ON_GOAL,OBJ_MAN,OBJ_MAN_ON_GOAL,OBJ_UNKNOWN,
};//函数声明
void initialize( Object* state, int w, int h, char* stageData );
void draw( const Object* state, int w, int h);
void update( Object* state, char input, int w, int h );
bool checkClear( const Object* state, int w, int h );
void part(int gStageWidth,int gStageHeight,int gN,char* gStageData);int main(){system("title 推箱子_V1.4");//标题名称system("color 0E");//颜色 背景前景cout<<"Tips:A:left D:right W:up S:down "; //操作说明//各关卡if(gTimes==1){part( gStageWidth_1, gStageHeight_1,N_1,gStageData_1);}if(gTimes==2){part( gStageWidth_2, gStageHeight_2,N_2,gStageData_2);}if(gTimes==3){part(gStageWidth_3, gStageHeight_3,N_3,gStageData_3);}if(gTimes==4){part(gStageWidth_4, gStageHeight_4,N_4,gStageData_4);}cout << "QUIT GAME , print\"ctrl + C\" quit GAME." << endl;//幕后信息system("color 0E");cout <<"欢迎继续开发改编,祥子学习制作 2022-01-01\n";//通关信息//死循环防闪现while( true ){ ; }return 0;
}//---------------------函数--------------
//关卡加载函数
void part(int gStageWidth_,int gStageHeight_,int n,char* gStageData_){cout<<gTimes <<" start";gStageWidth = gStageWidth_;gStageHeight = gStageHeight_;gN = n;Object* state = new Object[ gStageWidth * gStageHeight ]; //创建数组initialize( state, gStageWidth_, gStageHeight_, gStageData_ ); //初始化bool flag = true;while ( gN!=0 && flag ){//绘制draw( state, gStageWidth, gStageHeight);//通关检测if ( checkClear(state, gStageWidth, gStageHeight) ){cout << "Congratulation's! you won" << endl;++gTimes;//过关当前关数+1flag = false;}char input;cin >> input;//更新update( state, input, gStageWidth, gStageHeight );system("cls");//清理屏幕}//析构delete[] state;state = 0;
}
//数据加载函数
void initialize( Object* state, int width, int /* height */, char* stageData ){const char* d = stageData; //数据读取位置int x = 0;int y = 0;while ( *d != '\0' ){ //指针不等于NULL,,老手常用操作Object t; //临时变量switch ( *d ){case '#': t = OBJ_WALL; break;case ' ': t = OBJ_SPACE; break;case '$': t = OBJ_BLOCK; break;case '0': t = OBJ_BLOCK_ON_GOAL; break;case '_': t = OBJ_GOAL; break;case 'I': t = OBJ_MAN; break;case 'M': t = OBJ_MAN_ON_GOAL; break;case '\n': x = 0; ++y; t = OBJ_UNKNOWN; break; //换行处理default: t = OBJ_UNKNOWN; break;}++d;if ( t != OBJ_UNKNOWN ){ //未定义元素处理state[ y*width + x ] = t; //写入++x;}}
}void draw( const Object* state, int width, int height){cout<<" LIFE:"<<gN<<endl;cout<<endl;const char font[] = {' ', '#', '_', '$', '0', 'I', 'M'}; //Object的可能值for ( int y = 0; y < height; ++y ){for ( int x=0; x < width; ++x ){Object o = state[ y*width + x ];cout << font[ o ];}cout << endl;}gN--;//自减1,计算剩余步数cout<<endl;
}void update( Object* s, char input, int w, int h ){//移动量int dx = 0;int dy = 0;switch ( input ){case 'a': dx = -1; break; //左case 'd': dx = 1; break; //右case 'w': dy = -1; break; //上,Y朝下为+case 's': dy = 1; break; //下}//查主角坐标int i = -1;for ( i = 0; i < w * h; ++i ){if ( s[ i ] == OBJ_MAN || s[ i ] == OBJ_MAN_ON_GOAL ){break;}}int x = i % w; int y = i / w; //移动//移后坐标int tx = x + dx;int ty = y + dy;//判断坐标极值。不超出合理值if ( tx < 0 || ty < 0 || tx >= w || ty >= h ){return;}//A.该方向上是空白或者终点。主角则移动int p = y*w + x; //人员位置int tp = ty*w + tx; //目标位置(TargetPosition)if ( s[ tp ] == OBJ_SPACE || s[ tp ] == OBJ_GOAL ){s[ tp ] = ( s[ tp ] == OBJ_GOAL ) ? OBJ_MAN_ON_GOAL : OBJ_MAN; //如果该位置是终点,则将该位置值变为“终点上站着人”s[ p ] = ( s[ p ] == OBJ_MAN_ON_GOAL ) ? OBJ_GOAL : OBJ_SPACE; //如果该位置已经是“终点上站着人”,则变为“终点”//B.如果该方向上是箱子。并且该方向的下下个格子是空白或者终点,则允许移动}else if ( s[ tp ] == OBJ_BLOCK || s[ tp ] == OBJ_BLOCK_ON_GOAL ){//检测同方向上的下下个格子是否位于合理值范围int tx2 = tx + dx;int ty2 = ty + dy;if ( tx2 < 0 || ty2 < 0 || tx2 >= w || ty2 >= h ){ //按键无效return;}int tp2 = ( ty + dy )*w + ( tx + dx ); //下下个格子if ( s[ tp2 ] == OBJ_SPACE || s[ tp2 ] == OBJ_GOAL ){//按顺序替换s[ tp2 ] = ( s[ tp2 ] == OBJ_GOAL ) ? OBJ_BLOCK_ON_GOAL : OBJ_BLOCK;s[ tp ] = ( s[ tp ] == OBJ_BLOCK_ON_GOAL ) ? OBJ_MAN_ON_GOAL : OBJ_MAN;s[ p ] = ( s[ p ] == OBJ_MAN_ON_GOAL ) ? OBJ_GOAL : OBJ_SPACE;}}
}//如果没有移动目标物则判定为通关
bool checkClear( const Object* s, int width, int height ){for ( int i = 0; i < width*height; ++i ){if ( s[ i ] == OBJ_BLOCK ){return false;}}return true;
}
C++ 简化 推箱子 小游戏 完整代码 参考网络资料 命令行运行 仅供初学者参考交流相关推荐
- [新手必备]Unity推箱子小游戏C#代码详解(第一篇-代码部分)
完整项目请参考博客:https://blog.csdn.net/qq_41676090/article/details/96300302 本文为推箱子小游戏C#代码详解第一篇的代码部分,主要讲解 Sy ...
- win32GDI函数编程实现推箱子小游戏
利用GDI绘图函数实现推箱子小游戏,代码源于上一篇博客 C语言控制台推箱子. 实现方法很简单,把字符用绘图函数绘出的图形替换即可. 从字符控制台到win32界面编程,更加形象化. 代码量大增,主程序就 ...
- 【Java】推箱子小游戏(带背景音乐)完整代码
Java实现推箱子小游戏 一.整体框架 二.游戏效果图 三.推箱子四大类 1. GameFrame类 2. Map类 3. MapFactory类 4. Sound类 四.游戏分析 1.游戏操作 2. ...
- c#推箱子小游戏代码_推箱子小游戏V1.0制作
小游戏实践 推箱子简易版 大家好,我是努力学习争取成为优秀的Game Producer的路人猿,今天来一起做一个推箱子的简易版本V1.0!下面跟我一起做吧~ 我们用到的软件如下: 编辑类 Visual ...
- 手把手教你使用Python实现推箱子小游戏(附完整源码)
文章目录 项目介绍 项目规则 项目接口文档 项目实现过程 前置方法编写 move核心方法编写 项目收尾 项目完善 项目整体源码 项目缺陷分析 项目收获与反思 项目介绍 我们这个项目是一个基于Pytho ...
- [原创]jQuery推箱子小游戏(100关且可扩展可选关),休闲,对战,娱乐,小游戏,下载即用,兼容iPad移动端,代码注释全(附源码)
Sokoban 介绍 [原创]jQuery推箱子小游戏(100关且可扩展可选关),休闲,对战,娱乐,小游戏,下载即用,兼容iPad移动端,代码注释全(附源码) 游戏说明 经典的推箱子是一个来自日本的古 ...
- 简单的c语言推箱子程序,完整版本的推箱子小游戏,最简单的纯C语言打造
/*推箱子小游戏 1.定义绘制样式 用二维数组的方式 2.绘制图像 3.找出当前位置 4.逻辑判断,制造动作 根据数学xy轴的规律,这里使用ij 上移,行轴上升,行数减少 下移,行数下降,函数增加 左 ...
- android开发--推箱子小游戏(二)
一.前言 迎来第二章的更新啦:使用ListView实现关卡的选择. 本章的内容有点小复杂,毕竟涉及使用了安卓开发中最难用也是最常用的控件之一:ListView 本章可以说是复杂但是单一吧.主要是想大家 ...
- Python【小游戏合集】之自己做一个简单又好玩的推箱子小游戏
导语:哈喽铁汁们~今日游戏之旅开始! 想领取完整源码跟python学习资料可私信我或点击这行字体 这期就是带大家使用当前主流且易用的Python语言做一个简单的推箱子小游戏 现在小编的快乐源泉就是玩自 ...
最新文章
- 使用Hystrix实现自动降级与依赖隔离[微服务]
- list中抽出某一个字段的值_使用LINQ获取List列表中的某个字段值
- epoll背后的原理
- Why I could not put extension fields done on CUSTOMER_H to WebUI
- [Qt] 利用QtWebKit完成JavaScript访问C++对象
- 为了给女朋友独特的七夕惊喜,我学会了人像美肤算法!
- java 选中指定文件_Java如何打开一个文件夹并选中指定文件
- 微信小程序源码:淘宝客外卖返利优惠券、头像 壁纸 朋友圈文案查询、古诗词技术文章查询
- 全面质量管理体系方案
- eclipse中Ctrl+Alt+↓向下复制快捷键与系统中翻转屏幕快捷键冲突问题(已解决)
- 利用scrapy爬取句子迷网站优美句子存储到本地(喜欢摘抄的人有福了!)
- ireasoning mib browser license expired
- Linux内核调试方法总结
- php整型的最大值,php整型(Integer)
- 什么是推挽输出,开漏输出?
- 设计模式 | 建造者模式及典型应用
- Perfetto工具集之traced_perf
- python画图x轴文字斜着
- 名悦集团:新能源汽车保养做好这三步,用车无忧
- win7网络找不到服务器,Win7找不到服务器或DNS错误的解决方法