本文难度:★☆☆☆☆
题图:控制台RPG游戏——诛仙剑 by 呆呆的码农
一、前言
在我大知乎,有以下基本日常问题:如何学习C语言?
如何学习C++?
如何学习Python?
如何学习XXXX语言?
用一句话形容这类问题——高默新泪。高手因为不想反复回答这类问题而沉默……新手因为苦苦找不到入门的路而流泪。
本文想要给苦恼的新手们指明一个前进的方向。
二、控制台游戏简介
所谓控制台,在Windows下就是开始——运行——cmd。也叫“命令行窗口”、“Console”、“Terminal”都是同一个东西。
这个黑漆漆的东西有什么好玩的呢?看看下面这个游戏:(这游戏还可以,我就只打穿了两遍而已。)
和Flash原版魔塔基本一样:
在控制台里,我们可以通过彩色的文字、背景、空格,来表现出比较抽象的场景。掌握了这个方法,我们就可以尽情发挥想象,做出各种各样的游戏了。而且麻雀虽小五脏俱全,制作控制台游戏有助于我们对游戏整个流程有完整的掌控,自己设计逻辑、渲染循环,让我们对真正引擎的理解能更上一层楼。
虽然画面过于简单是个缺点,但是胜在制作也很简单,最重要的是,在学习阶段让我们能迅速开发自己的小游戏~~
三、控制台游戏鉴赏
其实知乎上有一些非常厉害的控制台游戏的例子,但是那些作品主要是用到了一些字符渲染技术,将复杂图形转化为字符表示……其实复杂的东西都有一个简单的内核,如果咱们把基本的控制台操作搞定了,就离大佬们近了一大步。毕竟游戏是用来玩的,不是用来膜拜的。
所以这里我们展示一些皮皮关学员作品,供大家学习参考。
1、魔塔
(有点闪烁是因为录屏软件正好录到了屏幕刷新的时刻,游戏本身闪烁并不明显)
本游戏采用了把关卡地图放在txt文本里的方法,而且后期有跳关、查看怪物等功能,麻雀虽小,五脏俱全。最难能可贵的是工程代码比较平铺直叙,萌新也可以看懂。
2、回合制战斗模拟器
这个作品在技能动画上的处理非常厉害,箭头移动比较流畅(动图看不出来。这是用一边擦除、一边画箭头的方法实现的)
3、雾之迷宫
开脑洞,实现带有迷雾的地图。
4、战棋游戏Demo(火焰纹章)
这个Demo不完整,只是展示了《火焰纹章》游戏中的移动、攻击等细节。彩色背景的效果棒极了,文字一个一个冒出来的感觉也很帅。
5、扫雷、俄罗斯方块、2048、贪食蛇等等
一些经典的小游戏都可以在控制台上实现,我就不再贴图了,有兴趣可以在文末的地址中下载。
四、用各种语言编写控制台游戏
不同的语言开发控制台游戏的方法略有不同,主要原因是某些语言缺乏好用的控制台输出库。我们最需要的是控制字符输出、窗口刷新的函数。
1、C#
在windows下,C#语言是最好用的控制台游戏开发语言,微软爸爸给我们提供了丰富的显示相关函数,下面举个例子,彩色动态的Hello world:
高级用法:可以用Console.SetCursorPosition(int left, int top)来把光标定位在某个位置,这样就可以做到只修改某个位置的字符,而不用反复调用Console.Clear() 让屏幕整体闪烁。前面的“回合制战斗模拟器”就用这种技术实现了极其流畅的动画效果。
2、C++ / C
C++操作控制台方案很多,比如利用system("color 03"); 但是用起来有一些问题。
如图:直接只用DOS命令color即可改变文字和背景颜色。
相对好一些的方案是使用Windows提供的SetConsoleTextAttribute等函数来实现设置颜色。但是Windows提供的清屏我没有找到靠谱的方法,只能暂时用system("cls")来做,效果还可以,以下代码提供了清屏和打印彩色字符两个函数供参考:
#include "stdafx.h"
#include
#include
#include
#include
using namespace std;
void PrintfColor(char* str, WORD color, ...) {
WORD colorOld;
HANDLE handle = ::GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo(handle, &csbi);
colorOld = csbi.wAttributes;
SetConsoleTextAttribute(handle, color);
cout << str;
SetConsoleTextAttribute(handle, colorOld);
}
void Clear() {
system("cls");
}
int main() {
while (true)
{
PrintfColor("H", 10);
PrintfColor("e", 9);
PrintfColor("l", 12);
PrintfColor("l", 11);
PrintfColor("o", 13);
PrintfColor("!", 4);
}
system("PAUSE");
return 0;
}
由于C和C++在不同平台、不同系统下套路不太一样。网上有些方法无法直接应用,主要是因为VisualStudio版本以及WinSDK版本不同造成的。建议试验确定一种方案,然后以该方案为准即可。
3、Python
在控制台操作方面,Python有功能强大的curses模块,但是必须要用linux系统,可以考虑用Linux虚拟机来学习。
(Python的Windows版本缺少一些好用的库……非常遗憾,刚才我又搜了一下,还是没找到适合Windows下开发控制台游戏的方案。希望朋友们在评论里补充。(或者咱们直接用Pygame来做小游戏更简单 :D))
五、游戏主循环
其实,有了打印字符和清空屏幕这两个工具,就已经可以制作各种各样的控制台游戏了,简单说下思路:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// C#控制台游戏架构namespace ConsoleApp1
{
class Program
{
static void Init() {
// 初始化游戏 }
static void Logic() {
ConsoleKeyInfo key = Console.ReadKey();
// 针对输入进行处理 }
static void RealTimeLogic()
{
// 另一种输入不卡住游戏的方案,适用于贪食蛇、俄罗斯方块等游戏 ConsoleKeyInfo key;
// 如果没有按键输入,就不会执行ReadKey,游戏就不会卡住 if (Console.KeyAvailable)
{
key = Console.ReadKey();
}
// 针对输入进行处理 }
private static void Refresh() {
// 清屏 Console.Clear();
// 将内容打印到屏幕上 }
static void Main(string[] args)
{
Init();
// 游戏主循环 while (true)
{
Logic();
Refresh();
}
}
}
}
所有文章中提到的游戏,我都开放了源码下载。而这些工程万变不离其宗,都用到了以上基本的游戏逻辑循环,只要看懂了一个项目,其它都迎刃而解了。建议从《魔塔》项目开始学习,比较符合新手的理解力。
建议从简单的回合制游戏、贪食蛇、2048开始尝试吧!
工程地址: