入门Oier们如何自己在C++编写游戏

· · 科技·工程

对于一个常常 摸鱼 放松自己且受到机房各方面限制的Oier,玩玩自制或他人制作的C++小游戏也是很 OK 的!

\Large{那么我们怎么制作游戏呢?}

制作游戏的前提

游戏嘛,肯定是不能一成不变的,比如:抽奖。这样能使游戏具有不确定性,增加游玩乐趣。

如何让游戏具有不确定性?

答案很简单,运用随机数

随机数需要用到<algorithm>头文件里的rand()函数。但是这个函数的返回值 肥肠 非常大,所以通常我们要配合“%”使用。具体一点:

int a;
a=rand()%15+5;

以上代码就是在5到19之间随机取一个数

“%15”后,a的值应该是在0 ~ 14之间(为什么只到14?因为到达15后能再次被15整除,所以得0)再加上5,左、右的范围都向右移5(就是+5),所以范围就是5 ~ 19

.

其实以上代码还可以进行简化,如:

#include<cstdio>
#include<algorithm> //记得引用这个头文件,如果你用万能头,那当我没说
int R(int a,int b) {
  while(1) {
    int sj=rand()%(b+1);
    if(sj>=a&&sj<=b)  break; //如果随机出的数符合给出的范围才能返回,否则重新取随机数。
  }
  return sj;
}
int main() {
  printf("%d",R(5,20));
  return 0;
}

有了以上代码,我们就不用花太多时间思考随机数的范围了

.

当然,以上代码还可以简化。如下:

#include<cstdio>
#include<algorithm> //记得引用这个头文件,如果你用万能头,那当我没说
#define R(a,b) rand()%((b)-(a)+1)+a //你用typedef也可以
int main() {
  printf("%d",R(5,20));
  return 0;
}

============================不怎么华丽的分界线============================

请带入一下情景:你开心地玩了一上午,中午吃饭前不小心把exe文件关掉了!一上午的心血没了!

.
所以,存档系统也 肥肠 非常重要。

如何制作存档系统?

学过非专业C++知识的同学们都知道C++有个叫文件读写的东西,存档就运用了这个。存档操作就是把所有游戏参数写到一个指定的文档里;读档操作就是把指定文件的游戏参数读出来。

很简单,对吧?用freopen就可以了。

.
但是!请注意!freopen开启以后就没法关闭了,就无法完成在控制台输出了。

.

所以,只用freopen是不行的!

.
于是我们需要用到些新东西:fileIn和fileOut。

.
具体的,格式如下:

#include<bits/stdc++.h>
using namespace std;
int nengyuan,cailiao;//能源、材料
int main(){
  std::ifstream fileIn("result.txt");//开启文件读写,“result”可以改为其他名字,后缀名也可以该,但双引号里一定要有 文件名+后缀名!
  fileIn>>cailiao>>nengyuan; //把文件内容按顺序读入
  fileIn.close(); //关闭文件读写
//以上为读档程序
//一下为存档程序
  std::ofstream fileOut("result.txt");//同上
  fileOut<<nengyuan<<" "<<cailiao;//一定要加空格!不然后续的读档会出问题!
  fileOut.close();//同上
  return 0;
}

这样一来,存档就不是问题了

.
不过这又出现问题了,玩家篡改游戏数据成了数值怪怎么办?

.
简单!加密!具体流程放在文章最后(因为这不是必备的)

.
============================不怎么华丽的分界线============================

杂项

①在一些机房里,输出中文不能用printf,必须用cout并且在双引号内的内容前面应该加\b或者 空格,注意!\b会吃掉前面一个字符!
文字游戏中,输出提示语以后记得加一个换行(冷知识:\nendl快了将近0.8倍)
③交互时建议定义一个string类型数组,如果你定义int类型也可以,但当输入了一个非int类型的东西,就会核爆(重复输出某个语句,一直刷屏,无法停止,无法输入,除非关了重开)

============================不怎么华丽的分界线============================

.

\LARGE{实例:}

由于篇幅原因,以下只介绍三种适合机房制作与游玩的游戏

.

No .1 文字游戏

什么是文字游戏

文字游戏莫过于最简单的游戏了。顾名思义,文字游戏就是由文字提示代替图像玩家当前状态、操作、事件等各种信息的游戏,说白了就是大模拟。如果不能理解,可以这么想象:

在MC的RPG类游戏里,作者在提示剧情时通常会通过发聊天框的方式,你就单独把聊天框截出来,在不断出现的提示语中添加交互语句。

.
光听这可能很难理解,不妨看看我编写的 小小 小×10^n 游戏,

.

\Large{link}

.

现在好理解了吧?可能有一些人会觉得这很 . . . . . . 中二?

但是,你要相信这句话:真当你饿坏了的时候,你连 \color{brown}{shi} 都抢着吃。

.

如何制作文字游戏?

首先,影响游戏的各种参数都得写成变量。(废话)

.
然后一个\huge{大大的}while放在主函数(保证游戏能循环进行)

.
接着往while里放判断语句、提示语句输出、交互语句输入以及数据处理,一个热乎的游戏就新鲜出炉了!!!

.
这些其实没什么好说的,全靠自己的想象力和创造力

No .2 国家管理类游戏

其实这些游戏具体叫啥我也不太清楚,但都是作为一个管理者,治理某个国家之类的什么。

.
这种游戏主要是对地图的显示和处理。比如:建造一个建筑,就在地图上出现某个图字符代替原来的字符......

这种游戏一般是开一个二维char类型数组,将一些字符定义为特殊的东西,例如:定义“#”为墙,“.”为空地......

但这就有个问题:二维数组开个5k × 5k就很极限了,那么更大的地图怎么处理呢?

.
我有一个绝妙的解决方法,可惜这里空白太少,我写不下。

详见这里

.

如何制作这类游戏?

同上,不过多了地图的输出而已。

No .3 杂类小游戏

扫雷

简单!只要遵循以下流程:

  1. 生成地图
  2. 输出地图 <--while的开头
  3. 输入交互语句
  4. 处理交互语句
  5. 若达成胜利或失败条件,跳出循环
  6. 返回流程2 <--while的结尾

生成地图就是重复10次,在10 × 10的地图上选出一个点作为“雷”
然后遍历其他的点,将他们设为自身八方向的雷的总数的数

处理交互语句就是输入要交互的格子的x值和y值,输入一个指定字符,以判定处理方法,如:打开格子、标记格子......
如果是打开格子,就用泛洪算法,把符合条件的格子一起打开;
如果是标记格子,就把二维char类型数组的[x][y]改为特殊字符(这个由你定)。

完成!

迷宫

简单!只要遵循以下流程:

  1. 生成地图
  2. 输出地图 <--while的开头
  3. 输入交互语句
  4. 处理交互语句
  5. 若达成胜利或失败条件,跳出循环
  6. 返回流程2 <--while的结尾

生成地图就是一直循环,然后一直随机取一个格子,看它是否满足成为“墙”(不是玩家、不是终点、是空地、距离出生点有一定距离......)如果满足,就用泛洪算法(又是泛洪^\/^),确定放下这个“墙”以后终点和起点是否相通。如果相通,就继续取一个格子,判定......;如果不相通,就把这个格子变回空地,跳出循环,完成地图生成。

.
但如果你觉得生成的地图总是很简单,你可以加一个计数器,记录一共放下了几个“墙”,直到“墙”的数量达到指定数量才跳出循环。

.
接着是移动。就输入一个字符,判定这个字符:如果是“W”就往上走;如果是“S”,就往下走;如果是......

.
完成!

总结

总而言之,自己写游戏还是得靠想象力和创造力,勇敢迈出第一步才是最重要的,希望以上的内容对于一些游戏制作小白有用处!

回填前文的坑

说道文件内容加密,也挺好理解。具体的:

  1. 把变量顺序打乱(用随机数)
  2. 把变量转换为16进制(手写转换代码,字母用大写)
  3. 把变量名拆开(相对位置绝对不能换!一定要用小写的),随机插到变量值转成的16进制的字符串中,生成一个新的字符串
  4. (选做)将字符串的每个字符加上一个数(如:“a”加上2变成“c”)
  5. 把新字符串输出到文件里,末尾补一个空格

这样一来,玩家打开文件一看:小写字母、大写字母和数字混合的“乱码”,换谁谁不迷糊?

那怎么读出来呢?

简单!具体的:

  1. (选做,上面有向这里就有)将每一段“乱码”的每一个字符减去一个数(如:“c”减去2变成“a”)
  2. 一位一位地读每个字符
  3. 判定,如果是大写或数字,放在数据预处理处;如果是小写字母,就放在变量名预处理处。
  4. 将变量名预处理处的字符串进行判定,确认数据要加在哪个变量
  5. 把数据预处理处的16进制码转回10进制,加到对应变量里。