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++ 简化 推箱子 小游戏 完整代码 参考网络资料 命令行运行 仅供初学者参考交流相关推荐

  1. [新手必备]Unity推箱子小游戏C#代码详解(第一篇-代码部分)

    完整项目请参考博客:https://blog.csdn.net/qq_41676090/article/details/96300302 本文为推箱子小游戏C#代码详解第一篇的代码部分,主要讲解 Sy ...

  2. win32GDI函数编程实现推箱子小游戏

    利用GDI绘图函数实现推箱子小游戏,代码源于上一篇博客 C语言控制台推箱子. 实现方法很简单,把字符用绘图函数绘出的图形替换即可. 从字符控制台到win32界面编程,更加形象化. 代码量大增,主程序就 ...

  3. 【Java】推箱子小游戏(带背景音乐)完整代码

    Java实现推箱子小游戏 一.整体框架 二.游戏效果图 三.推箱子四大类 1. GameFrame类 2. Map类 3. MapFactory类 4. Sound类 四.游戏分析 1.游戏操作 2. ...

  4. c#推箱子小游戏代码_推箱子小游戏V1.0制作

    小游戏实践 推箱子简易版 大家好,我是努力学习争取成为优秀的Game Producer的路人猿,今天来一起做一个推箱子的简易版本V1.0!下面跟我一起做吧~ 我们用到的软件如下: 编辑类 Visual ...

  5. 手把手教你使用Python实现推箱子小游戏(附完整源码)

    文章目录 项目介绍 项目规则 项目接口文档 项目实现过程 前置方法编写 move核心方法编写 项目收尾 项目完善 项目整体源码 项目缺陷分析 项目收获与反思 项目介绍 我们这个项目是一个基于Pytho ...

  6. [原创]jQuery推箱子小游戏(100关且可扩展可选关),休闲,对战,娱乐,小游戏,下载即用,兼容iPad移动端,代码注释全(附源码)

    Sokoban 介绍 [原创]jQuery推箱子小游戏(100关且可扩展可选关),休闲,对战,娱乐,小游戏,下载即用,兼容iPad移动端,代码注释全(附源码) 游戏说明 经典的推箱子是一个来自日本的古 ...

  7. 简单的c语言推箱子程序,完整版本的推箱子小游戏,最简单的纯C语言打造

    /*推箱子小游戏 1.定义绘制样式 用二维数组的方式 2.绘制图像 3.找出当前位置 4.逻辑判断,制造动作 根据数学xy轴的规律,这里使用ij 上移,行轴上升,行数减少 下移,行数下降,函数增加 左 ...

  8. android开发--推箱子小游戏(二)

    一.前言 迎来第二章的更新啦:使用ListView实现关卡的选择. 本章的内容有点小复杂,毕竟涉及使用了安卓开发中最难用也是最常用的控件之一:ListView 本章可以说是复杂但是单一吧.主要是想大家 ...

  9. Python【小游戏合集】之自己做一个简单又好玩的推箱子小游戏

    导语:哈喽铁汁们~今日游戏之旅开始! 想领取完整源码跟python学习资料可私信我或点击这行字体 这期就是带大家使用当前主流且易用的Python语言做一个简单的推箱子小游戏 现在小编的快乐源泉就是玩自 ...

最新文章

  1. 使用Hystrix实现自动降级与依赖隔离[微服务]
  2. list中抽出某一个字段的值_使用LINQ获取List列表中的某个字段值
  3. epoll背后的原理
  4. Why I could not put extension fields done on CUSTOMER_H to WebUI
  5. [Qt] 利用QtWebKit完成JavaScript访问C++对象
  6. 为了给女朋友独特的七夕惊喜,我学会了人像美肤算法!
  7. java 选中指定文件_Java如何打开一个文件夹并选中指定文件
  8. 微信小程序源码:淘宝客外卖返利优惠券、头像 壁纸 朋友圈文案查询、古诗词技术文章查询
  9. 全面质量管理体系方案
  10. eclipse中Ctrl+Alt+↓向下复制快捷键与系统中翻转屏幕快捷键冲突问题(已解决)
  11. 利用scrapy爬取句子迷网站优美句子存储到本地(喜欢摘抄的人有福了!)
  12. ireasoning mib browser license expired
  13. Linux内核调试方法总结
  14. php整型的最大值,php整型(Integer)
  15. 什么是推挽输出,开漏输出?
  16. 设计模式 | 建造者模式及典型应用
  17. Perfetto工具集之traced_perf
  18. python画图x轴文字斜着
  19. 名悦集团:新能源汽车保养做好这三步,用车无忧
  20. win7网络找不到服务器,Win7找不到服务器或DNS错误的解决方法

热门文章

  1. 基于内容的图片检索CBIR简介
  2. 惠普gk100好不好_「商家透露」惠普gk100和gk400区别比较 哪款好?这样选不盲目...
  3. DMA PL330相关总结
  4. 上顿号符号_标点符号的用法一一顿号
  5. DIV常用的几种边框样式!(转)
  6. L2-013 红色警报 (25 分)
  7. el vue 手机号_Vue 正则表达式验证邮箱和手机号码
  8. pycharm定义空的二维数组_数组与面向对象
  9. Pandas学习-Day3
  10. 服务器光盘拷贝文件夹,如何光盘path中的两个点的文件夹