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

news/2024/11/27 22:24:46/

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

 自己也把代码实现一遍。

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

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++只是简单地找到语法,这是简单地应用,还是学到很多的,有收获。

 


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

相关文章

原装世嘉土星手柄(Sega Saturn)转USB小板,软硬件全开源

上次用模块制作了一个SS手柄转USB的控制器&#xff0c;使用良好&#xff0c;但是模块大&#xff0c;不美观&#xff0c;成本还高&#xff0c;这次用STM32F103制作了一块小板&#xff0c;软硬件全开源。 首先上成品图 PCB上有1-9个焊盘 SS手柄有9根线&#xff0c;根据下面图的定…

为了开发世嘉MD游戏我写了个Tile地图编辑器

去年写过几个小游戏&#xff0c;都是很小的地图&#xff0c;当需要地图大一点的时候&#xff0c;我觉得必须有个地图编辑器了&#xff0c;于是。。。 我是2019年年底接触到世嘉MD游戏开发&#xff08;我在CSDN也有写过MD游戏开发系列的博客&#xff09;&#xff0c;半个月时间我…

世嘉MD游戏开发【十四】:SRAM存档和读档

很久没更新了&#xff0c;今天简单讲一下用SRAM存档和读档的功能&#xff0c;有了这个功能就可以做一些RPG角色扮演游戏了&#xff0c;保存角色的数据都挺方便的。 原理跟C语言文件读写差不多&#xff0c;流程都是打开读写权限&#xff0c;读写内容&#xff0c;关闭读写权限。…

世嘉MD游戏开发【十三】:音乐和音效

要是能为自己的游戏添加上动人的背景音乐和音效&#xff0c;无疑能提升不少游戏体验&#xff0c;不至于让玩家感觉毫无代入感。 今天我来讲一下世嘉MD游戏开发怎么运用音乐和音效。 我自己也是慢慢摸索的&#xff0c;说的不全面也是情理之中的&#xff0c;但是能满足最基本的…

世嘉MD游戏开发【一】:win10环境下配置SGDK

SGDK是一个小巧的开源免费的世嘉MD&#xff08;Genesis或者MegaDrive&#xff09;游戏开发包&#xff0c;用这个开发包你可以用C语言快速的制作MD游戏而不用去学晦涩难懂的汇编语言。 零、配置java环境变量&#xff08;不做讲解&#xff09; 一、下载SGDK开发包&#xff0c;解…

世嘉酒店预订管理系统

世嘉酒店预订管理系统功能结构图 转载于:https://www.cnblogs.com/11qq-/p/9045008.html

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

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

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

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