世嘉新人培训教材学习_第一章 (推箱子代码)
第一章 第一个游戏--“推箱子”
自己也把代码实现一遍。
游戏程序,就是获取输入,将输入反映到游戏世界,显示结果这三项 的无限循环。这个过程称为游戏循环或者主循环。
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++只是简单地找到语法,这是简单地应用,还是学到很多的,有收获。
世嘉新人培训教材学习_第一章 (推箱子代码)相关推荐
- 世嘉新人培训教材学习_第一章 _C++知识点复习
因为第一章为基础的C实现了推箱子的简单游戏,后面要使用到许多C++的知识,之前学习过,但是因为用的较少,这里在简单复习一下.加深理解,同时也知道了在学校学的知识点只是停留在基础的语法部分,要真的去理解 ...
- 世嘉新人培训教材_游戏开发
世嘉新人培训教材_游戏开发 第一章 第一个游戏 开发环境搭建 Windows 二级目录 三级目录 第一章 第一个游戏 开发环境搭建 1.在微信公众号下载vs2017 2.快速安装程序包含有Window ...
- 世嘉新人培训教材 demo环境配置
前言 在书的p4页,运行NonFree项目时出现了一系列环境问题的bug.记得第一次在另一台电脑跑的很顺畅,第二次换台电脑戴上痛苦面具.由于网上资料甚少,对于刚学习的萌新来说还是十分有必要讲解一下来避 ...
- 《世嘉新人培训教材——游戏开发》踩到的坑2、读取图片文件
问题定位在62页,开始使用DDS图片转化插件前需要安装DirectX才能成功转化.(有好兄弟推荐个下载链接吗?网上的版本不是太老了就是捆绑安装了不想要的程序.) 但是如果想要显示自己在网上下载的图片却 ...
- 《世嘉新人培训教材——游戏开发》踩到的坑1、LNK2019问题的解决
问题详述:P54页2.3节在设置完Visual Studio2019的项目(包括引用.外部依赖库.附加依赖项.debug)后,录入代码进行调试后报错: 错误 LNK2019 无法 ...
- 《Go语言圣经》学习笔记 第一章 Go语言入门
Go语言圣经学习笔记 第一章 Go语言入门 目录 Hello, World 命令行参数 查找重复的行 GIF动画 获取URL 并发获取多个URL Web服务 本章要点 注:学习<Go语言圣经&g ...
- c++语言编程,一个电灯两个开关控制,[理学]四川大学计算机学院精品课程_面向对象程序设计C++课件_游洪越_第一章绪论.ppt...
[理学]四川大学计算机学院精品课程_面向对象程序设计C课件_游洪越_第一章绪论 主讲教师: 游洪跃 个人主页: /~youhongyue 邮件地址: youhongyao@ 教材:<C++面向对 ...
- 王道考研计算机网络学习心得——第一章-计算机网络体系结构
前言 本文主要是我学习计网的心得,用王道考研的原因主要是因为,又有老师教又有直接的资料书,个人觉得方便一点,不用到处找网课,也不用想到底看哪本书好,等这一轮学完了再看别的书,想必也能得心应手一 ...
- ArcGIS for Desktop入门教程_第一章_引言 - ArcGIS知乎-新一代ArcGIS问答社区
原文:ArcGIS for Desktop入门教程_第一章_引言 - ArcGIS知乎-新一代ArcGIS问答社区 1 引言 1.1 读者定位 我们假设用户在阅读本指南前应已具备以下知识: · 熟悉W ...
最新文章
- 【 FPGA 】序列检测器的Mealy状态机实现
- 处事22计、心态24条、伤心50句、礼仪73、学会长大20
- 游戏框架View以及简单的运用
- Linux文件实时同步--inotify + rsync + pyinotify
- Scala _07trait特性
- mysql 多进程配置_基于mysql_multi实现MySQL多实例多进程配置
- 为什么setTimeout(fn,0)有时有用?
- JUC并发编程中的集合不安全问题源码解析
- 去掉Tomcat的管理页面
- paip.c3p0 nullpointexcept 配置文件根路径读取bug 解决
- 机器学习(四)神经网络
- PM之数据分析与逻辑能力
- Win10专业版开机自动拨号
- 苹果公司开发者账号申请——Apple Developer Program
- HTML使用样式格式化文档
- 浅谈电弧光保护在10kV变电站高压室的应用方案
- 地图配色及网络地图比较
- 网线连接网络有黄色感叹号
- ​治理 V20 领导应如何支持
- React Native性能优化总结