前言
刚开始学C++的你,是不是看别的大佬制作的游戏,十分羡慕,希望自己设计一个游戏而无从下手呢?
如果正是如此,那这篇文章或许会给你启发。
正文
1:编译配置
如果你已经下载了一款C++编译器,请跳过
个人比较推荐DEVC++,虽然版本较低,但简单易上手,下载后就能用。
安装教程
当然,VS,VSCode也可以,但是需要配置什么的,很麻烦
2:知识储备
需要储备如下知识:
- 数据结构
- 顺序结构
- 分支结构
- 循环结构
- 数组
- 字符串
- 结构体
- 函数与递归
什么类啊,多线程啊,各种容器啊,其实对于一个小程序并没那么重要。那些算法也用不上,就别管那么多,先把框架搭建起来再说。
3:代码创作过程
必备框架
头文件
在DevC++中,头文件只需要添加一个:
#include<bits/stdc++.h>
它包括了绝大多数的头文件,如
#include<string>
#include<fstream>
#include<cstring>
#include<iostream>
#include<vector>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<stdexcept>
#include<exception>
...
这样你就没必要因找不到头文件而干着急了。
不过也有一个缺点:因为包含了无数头文件,所以有很多词语都变成了敏感词,在创建变量的时候要小心!
如果程序比较大,可能会因为变量名冲突导致程序崩溃。
例:
#include<bits/stdc++.h>
using namespace std;
int x1,y1//危险!!!!这种变量名称有可能导致程序崩溃
...
但是,如果你用的不是DevC++,那还是好好地一个一个列出来吧~
全局变量
设定全局变量,和数据结构体是必须的.
全局变量可以让任何函数调用,这样就不需要每次调用函数都要传导很多变量了。
结构体可以封装各种类型的变量,还是很有帮助的。
例如,写一个打怪游戏,每个敌人都有自己的血量,攻击力等,虽然数值不同,但总体也就那几个变量,可以都用一个结构体概括。
struct guai{
int blood;
int miss;
bool isboss;
string name;
}teacher,
homework,
...;
在创建全局变量时尽量别偷懒,因为当程序更大时,变量也越来越多,可能有重名的情况
函数
一个游戏,实际上只需要两个函数(主函数不算):
void GAME(); // 游戏页面
void MAIN(); // 主页面
也许你认为函数没什么用,但等到代码多了,如果没有函数来分装代码,就会很难维护,找一个Bug要花无数的精力。
一个简易的迷宫游戏,就需要不少函数了!
void paint(); // 地图渲染引擎
void winnerprint(); // 胜利动画
void randrestart(); // 随机地图生成器
void KO(Die way); // 死亡处理及动画
void GAME(); // 游戏主逻辑
int Suiji(int many); // 封装随机数生成
void Changelog(); // 更新日志
void Settings(); // 设置
void Notice(); // 公告
void Howplay(); // 玩法详解
void MAIN(); // 主界面
还有一点:建议在主函数和其他所有函数之前,把除主函数外的函数都声明一遍。
因为在编译的时候是从上到下编译的,如果一个函数调用了另一个在他之后声明的函数,会报错!
例:
#include<bits/stdc++.h>
using namespace std;
int a(int x){
int y=1;
y=b(x); //会报错
return y;
}
int b(int m){
return m*2;
}
int main(){
int c;
cin>>c;
cout<<a(c);
return 0;
}
正确方法:
#include<bits/stdc++.h>
using namespace std;
//先把函数声明一遍
int a(int x);
int b(int m);
//接着再编辑函数
int a(int x){
int y=1;
y=b(x);
return y;
}
int b(int m){
return m*2;
}
int main(){
int c;
cin>>c;
cout<<a(c);
return 0;
}
功能进阶
代码框架搭建好后,如果你觉得不满意,还可以加更多的功能。
当然,头文件也需要升级。
这俩就很GOOD
#include <windows.h> // 控制台大大大升级!!!(黑客必备 )
#include <conio.h> // 非阻塞式键盘输入(有getch函数,输入的消息自动接收,不需要按回车)
其他的库你也可以自行下载
字体颜色
绚丽的颜色可以为你的代码添砖加瓦。
设置字体颜色
设置标题
在各种界面设定不同的标题,能让界面更美观。
奉上自创代码
// 获取终端列数(Windows 实现)
int GetTerminalColumns() {
CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
return csbi.srWindow.Right - csbi.srWindow.Left + 1;
}
// 打印自适应标题
void printtitle(string title) {
system("cls");
int cols = GetTerminalColumns();
// 生成自适应分隔线(全屏横线)
cout << setfill('-') // 设置填充字符为 -
<< setw(cols) << "" // 输出宽度为终屏列数的空字符串(自动填充-)
<< "\n\n"; // 换两行
// 计算标题居中位置(带冒号)
title += ":"; // 添加标题后的冒号
int title_len = title.length();
int left_pad = max(0, (cols - title_len) / 2); // 防止负数
// 输出居中标题
cout << setfill(' ') // 重置填充为空格
<< setw(left_pad) << "" // 左侧填充空格
<< title // 输出标题(已包含冒号)
<< "\n\n"; // 换两行
// 再次输出分隔线
cout << setfill('-')
<< setw(cols) << ""
<< "\n\n";
}
文件保存
进度保存到本地,不需要每次都重新练级。
(这个代码因人而异,不过因为文件保存较为复杂,有很多保存方式,你可以把你代码发给AI,让他帮你写一个)
不能用freopen,因为fclose之后就啥事儿也干不了了,建议用C++风格
兼容性问题
这个问题很重要。因为如果你想让你的代码在VS,VSCode什么的上面也能跑起来,需要更改代码!
所以,需要在所有代码前面写东西:
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#define NOMINMAX
#endif
如果你用了getch(),应改为GETCH(),并再写一个函数:
int GETCH(void) {
#ifdef _MSC_VER
return _getch();
#elif defined(__MINGW32__) || defined(__MINGW64__)
return getch();
#endif
}
具体原因不用管,加上就是了
其他
因为每一次打开终端,都会自动将输入法改成中文,但getch需要接受的是英文字母,所以还得再按一次shift,很麻烦,所以可以加上一个这函数:
// 切换输入法
void toggleIME() {
// 模拟按下Shift键切换中英文(适用于微软拼音)
keybd_event(VK_SHIFT, 0, 0, 0); // 按下Shift
keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0); // 释放Shift
}
//在主函数开头调用这个函数
int main(){
toggleIME();
//其它代码
...
}
后记
之所以写这篇文章,一是因为流量券快过期了,二是因为发现,在 CSDN中的游戏开发教程,要么是太专业(好吧我承认是我太蒟蒻看不懂),要么是比较笼统,都没有细致的介绍游戏代码的创作过程,而我的这篇文章刚好填补了新手独立创作C++游戏区域的空白。
希望这篇文章能给你一些帮助!
(求点赞,关注)