第一章 第一个游戏--“推箱子”

自己也把代码实现一遍。

游戏程序,就是获取输入,将输入反映到游戏世界,显示结果这三项 的无限循环。这个过程称为游戏循环或者主循环。

while(ture){getInput();updateGame();draw();
}

推箱子代码:

#include <iostream>
using namespace std;//#墙 _空白区 .终点 o砖块 p人
const char gStageData[] = "\
########\n\
# .. p #\n\
# oo   #\n\
#      #\n\
########";
const int gStageWidth = 8;
const int gStageHeight = 5;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, const 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);int main() {Object* state = new Object[gStageWidth * gStageHeight]; //分配状态数组空间initialize(state, gStageWidth, gStageHeight, gStageData); //舞台初始化//主循环while (true) {system("cls");//清屏操作//首先绘制draw(state, gStageWidth, gStageHeight);//通关检测if (checkClear(state, gStageWidth, gStageHeight)) {break; //通关检测}//提示如何操作cout << "a:left d:right w:up s:down. command?" << endl; //操作说明char input;cin >> input;//更新update(state, input, gStageWidth, gStageHeight);}//通关祝贺信息cout << "Congratulation's! you won." << endl;//析构delete[] state;state = 0;return 0;
}
//---------------------下面是函数定义--------------
void initialize(Object* state, int width, int height, const char* stageData) {const char* d = stageData;//读取位置int x = 0, y = 0;while (*d != NULL) {Object t;switch (*d){case '#': t = OBJ_WALL; break;case ' ': t = OBJ_SPACE; break;case 'o': t = OBJ_BLOCK; break;case 'O': t = OBJ_BLOCK_ON_GOAL; break;case '.': t = OBJ_GOAL; break;case 'p': t = OBJ_MAN; break;case 'P': 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) {const char font[] = { ' ', '#', '.', 'o', 'O', 'p', 'P' }; //需要与Object 对应。for (int y = 0; y < height; ++y) {for (int x = 0; x < width; ++x) {Object temp = state[y * width + x];cout << font[temp];//使用枚举类型作为下标,因为枚举本质上是int}cout << endl;}
}
//判断是否通关
bool checkClear(const Object* state, int width, int height) {int len = width * height;for (int i = 0; i < len; ++i) {if (state[i] == OBJ_BLOCK)return false;}return true;
}
//玩家输入移动指令后,更新操作。
void update(Object* state, char input, int width, int height) {int dx = 0, dy = 0;switch (input){case 'a': dx = -1; break;case 'd': dx = 1; break;case 'w': dy = -1; break;case 's': dy = 1; break;default: break;}int x = 0, y = 0,len = width * height;//查询小人的坐标for (int i = 0; i < len; ++i) {if (state[i] == OBJ_MAN || state[i] == OBJ_MAN_ON_GOAL) {x = i % width;y = i / width;break;}}//移动后的坐标int tx = dx + x;int ty = dy + y;if (tx < 0 || ty < 0 || tx >= width || ty >= height) {return;}int player = x + y * width; //玩家位置int tp = ty * width + tx; //目标位置 TargetPosition//A.该方向上是空白或者终点。小人则移动if (state[tp] == OBJ_SPACE || state[tp] == OBJ_GOAL) {//如果该位置是终点,则将该位置值变为“终点上站着人”state[tp] = (state[tp] == OBJ_GOAL) ? OBJ_MAN_ON_GOAL : OBJ_MAN;//如果该位置已经是“终点上站着人”,则变为“终点”state[player] = (state[player] == OBJ_GOAL) ? OBJ_GOAL : OBJ_SPACE;}//B.如果该方向上是箱子。并且该方向的下下个格子是空白或者终点,则允许移动else if (state[tp] == OBJ_BLOCK || state[tp] == OBJ_BLOCK_ON_GOAL) {int tx2 = tx + dx;int ty2 = ty + dy; if (tx2 < 0 || ty2 < 0 || tx2 >= width || ty2 >= height) {return;}int tp2 = tx2 + ty2 * width;//这是箱子的移动目的地if (state[tp2] == OBJ_SPACE || state[tp2] == OBJ_GOAL) {state[tp2] = (state[tp2] == OBJ_GOAL) ? OBJ_BLOCK_ON_GOAL : OBJ_BLOCK;state[tp] = (state[tp] == OBJ_BLOCK_ON_GOAL) ? OBJ_MAN_ON_GOAL : OBJ_MAN;state[player] = (state[player] == OBJ_MAN_ON_GOAL) ? OBJ_GOAL : OBJ_SPACE;}}
}

运行效果如下: p(小写的)为玩家位置, '  .  ' 为箱子的目的地,o(小写)为箱子。

下一篇,写一下学到的知识点。虽然只有150行代码,学的东西还是很多的。之前学的C++只是简单地找到语法,这是简单地应用,还是学到很多的,有收获。

世嘉新人培训教材学习_第一章 (推箱子代码)相关推荐

  1. 世嘉新人培训教材学习_第一章 _C++知识点复习

    因为第一章为基础的C实现了推箱子的简单游戏,后面要使用到许多C++的知识,之前学习过,但是因为用的较少,这里在简单复习一下.加深理解,同时也知道了在学校学的知识点只是停留在基础的语法部分,要真的去理解 ...

  2. 世嘉新人培训教材_游戏开发

    世嘉新人培训教材_游戏开发 第一章 第一个游戏 开发环境搭建 Windows 二级目录 三级目录 第一章 第一个游戏 开发环境搭建 1.在微信公众号下载vs2017 2.快速安装程序包含有Window ...

  3. 世嘉新人培训教材 demo环境配置

    前言 在书的p4页,运行NonFree项目时出现了一系列环境问题的bug.记得第一次在另一台电脑跑的很顺畅,第二次换台电脑戴上痛苦面具.由于网上资料甚少,对于刚学习的萌新来说还是十分有必要讲解一下来避 ...

  4. 《世嘉新人培训教材——游戏开发》踩到的坑2、读取图片文件

    问题定位在62页,开始使用DDS图片转化插件前需要安装DirectX才能成功转化.(有好兄弟推荐个下载链接吗?网上的版本不是太老了就是捆绑安装了不想要的程序.) 但是如果想要显示自己在网上下载的图片却 ...

  5. 《世嘉新人培训教材——游戏开发》踩到的坑1、LNK2019问题的解决

    问题详述:P54页2.3节在设置完Visual Studio2019的项目(包括引用.外部依赖库.附加依赖项.debug)后,录入代码进行调试后报错:      错误    LNK2019    无法 ...

  6. 《Go语言圣经》学习笔记 第一章 Go语言入门

    Go语言圣经学习笔记 第一章 Go语言入门 目录 Hello, World 命令行参数 查找重复的行 GIF动画 获取URL 并发获取多个URL Web服务 本章要点 注:学习<Go语言圣经&g ...

  7. c++语言编程,一个电灯两个开关控制,[理学]四川大学计算机学院精品课程_面向对象程序设计C++课件_游洪越_第一章绪论.ppt...

    [理学]四川大学计算机学院精品课程_面向对象程序设计C课件_游洪越_第一章绪论 主讲教师: 游洪跃 个人主页: /~youhongyue 邮件地址: youhongyao@ 教材:<C++面向对 ...

  8. 王道考研计算机网络学习心得——第一章-计算机网络体系结构

    ​ 前言   本文主要是我学习计网的心得,用王道考研的原因主要是因为,又有老师教又有直接的资料书,个人觉得方便一点,不用到处找网课,也不用想到底看哪本书好,等这一轮学完了再看别的书,想必也能得心应手一 ...

  9. ArcGIS for Desktop入门教程_第一章_引言 - ArcGIS知乎-新一代ArcGIS问答社区

    原文:ArcGIS for Desktop入门教程_第一章_引言 - ArcGIS知乎-新一代ArcGIS问答社区 1 引言 1.1 读者定位 我们假设用户在阅读本指南前应已具备以下知识: · 熟悉W ...

最新文章

  1. 【 FPGA 】序列检测器的Mealy状态机实现
  2. 处事22计、心态24条、伤心50句、礼仪73、学会长大20
  3. 游戏框架View以及简单的运用
  4. Linux文件实时同步--inotify + rsync + pyinotify
  5. Scala _07trait特性
  6. mysql 多进程配置_基于mysql_multi实现MySQL多实例多进程配置
  7. 为什么setTimeout(fn,0)有时有用?
  8. JUC并发编程中的集合不安全问题源码解析
  9. 去掉Tomcat的管理页面
  10. paip.c3p0 nullpointexcept 配置文件根路径读取bug 解决
  11. 机器学习(四)神经网络
  12. PM之数据分析与逻辑能力
  13. Win10专业版开机自动拨号
  14. 苹果公司开发者账号申请——Apple Developer Program
  15. HTML使用样式格式化文档
  16. 浅谈电弧光保护在10kV变电站高压室的应用方案
  17. 地图配色及网络地图比较
  18. 网线连接网络有黄色感叹号
  19. ​治理 V20 领导应如何支持
  20. React Native性能优化总结

热门文章

  1. 悲情天才Walter Pitts—计算神经学,控制论和人工智能的诞生
  2. 设置单元格之间的间距
  3. 百度地图添加带有图案的多边形区域
  4. 高性能浏览器-HTTP 2.0
  5. 最通俗易懂的网络应用层协议详解
  6. 第十章 client windows程序设计王艳平版
  7. 直流无刷电机的正弦波控制
  8. 一款使用C# .NET开发的SIP网络电话客户端完整源码
  9. IV XXSC-10
  10. oracle连接中on (1=1)