汉诺塔游戏设计(C++控制台版)
Hello! 小伙伴们。这次给大家带来小生的游戏作品——汉诺塔游戏。由于这是本人第一次设计游戏,可能某些地方存在问题,希望各位大佬能够批评指正,在这里,也感谢各位家仁们阅读此文章。
游戏简介
法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。
游戏结构
1、游戏主界面
2、开始游戏
3、游戏背景
4、游戏说明
5、游戏提示
6、退出游戏
游戏结构图示
1、游戏主界面:
2、开始游戏:
3、游戏背景:
4、游戏说明:
5、游戏提示:
6、退出游戏:
游戏分析
函数分析
这里向大家介绍一下游戏设计完成后创建和利用的函数,以及它们的功能
1、主函数(main())
主函数控制着整个程序的运行,调用并使用着其他函数。本游戏的主函数主要用于控制着主界面(Home())的打开,以及刚打开程序时的效果。当本程序打开时,主函数会先输出游戏的效果,Sleep()函数会辅助这个效果的显示,然后主函数调用Home()函数,打开主界面。
2、Home()
在Home()函数中,利用一些符号、数字、文字等制成主界面,并利用switch语句使得Home()函数具备其他的功能。在Home()函数中嵌入我们想要实现功能的函数(Backgroud()、Level()、Instruction()、Guide()、Exit()),编写一个让玩家输入的端口(也就是让玩家进行功能选择的端口),经过判断后,调用相应的函数,来实现相应功能的实现。
void Home()
{
int Switch_A;
system("cls");
cout << "======================================================" << endl << endl;
cout << "|| TOWER OF FANOI ||" << endl << endl;
cout << "|| ||" << endl << endl;
cout << "|| 1 开始游戏 ||" << endl << endl;
cout << "|| 2 游戏说明 ||" << endl << endl;
cout << "|| 3 游戏提示 ||" << endl << endl;
cout << "|| 4 退 出 ||" << endl << endl;
cout << "======================================================" << endl << endl;
cout << "为了您能更好的体验本游戏,请输入以上对应的编号:";
cin >> Switch_A;
switch (Switch_A)
{
case 1:
Backgroud();
Level();
break;
case 2:Instruction();
break;
case 3:Guide();
break;
case 4:Exit();
break;
}
}
3、Space()
创建一个方便我们进行编程的的空格函数Space(),在后面的函数中进行空格的输出。可进行单个空格的输出或者多个空格的输出。
4、Print()
创建一个类似于Python的输出函数Print(),输出时,可以输出Print()内的字符或者数字。
5、Backgroud()
利用Backgroud()函数来对故事线进行打包,并将该函数放置在开始游戏之前,以此来达到丰富游戏内容的目的。在Backgroud()函数中,添加了可跳过的的设置,防止玩家因为游戏故事线反复而产生的不良影响。该函数放置在Level()函数之前。
6、Level()
定义一个Continue变量,用于玩家退出游戏时的设置。创建Plate、Pillar、Hanoi_pillar类类型,对游戏的铜柱、盘子进行定义,并在其中直接定义相应的构造函数。利用while循环对游戏进行操作。
7、Move_plate()
创建一个移动盘子的函数,该函数实现“移动盘子”的功能,实质上就是将现铜柱存在的盘子消失,然后另一铜柱出现盘子,也就是说将现铜柱上的括号【】和空格消除,然后在另一铜柱下面添加对应的括号【】和空格。在这个函数中,还实现了一个功能,就是游戏规则。在该函数中,限定了一些条件。当铜柱上没有“盘子”时,提示玩家该铜柱上没有盘子。还有就是当大盘子放在小盘子上时,提示玩家大盘子不可以放在小盘子上。这里利用的技巧是比较size的大小来比较盘子的大小以及铜柱上是不是有盘子。
void Move_plate(Pillar* a1, Pillar* a2)
{
int disappeared = 10 - a1->Number_Plates;
int appeard = 9 - a2->Number_Plates;
if (a1->Plates[disappeared].size == 0)
{
cout << "该铜柱上没有盘子!!!" << endl;
system("pause");
}
else
{
if (a2->Plates[appeard + 1].size == 0)
{
a2->Plates[appeard].size = a1->Plates[disappeared].size;
a1->Plates[disappeared].size = 0;
a1->Number_Plates--;
a2->Number_Plates++;
}
else
{
if (a1->Plates[disappeared].size > a2->Plates[appeard + 1].size)
{
cout << "大盘子不可以叠放在小盘子上面!!!" << endl;;
system("pause");
}
else
{
a2->Plates[appeard].size = a1->Plates[disappeared].size;
a1->Plates[disappeared].size = 0;
a1->Number_Plates--;
a2->Number_Plates++;
}
}
}
}
这里的盘子和柱是这样实现的:
class Plate
{
public:
Plate(int number);
Plate();
void body();
int size;
};
Plate::Plate(int number)
{
size = number;
}
Plate::Plate()
{
size = 0;
}
class Pillar
{
public:
Pillar()
{
for (int i = 0; i < 10; i++)
{
Plates[i].size = 0;
}
Number_Plates = 0;
}
Pillar(int number)
{
int temp = number;
for (int i = 9; i >= 10 - number; i--)
{
Plates[i] = temp;
temp--;
}
Number_Plates = number;
}
Plate Plates[10];
int Number_Plates;
};
定义好后,利用创建好的Print()函数和Space()函数来实现,这只是部分代码,如果有需求,我会再次提供提供一部分code。
8、Move_hanoi_plate()
在该函数中定义了铜柱的编号,以此来使玩家输入铜柱的编号,调用Move_plate()函数来进行盘子移动。
9、Pass()
该函数用于对游戏通关的判定,也就是盘子是否遵循游戏规则,从第一根铜柱上移动到第三根铜柱上。通关后,提示玩家游戏通关。
10、Instruction()
该函数用于对想了解游戏背景故事、游戏规则的玩家进行游戏说明、游戏规则。
11、Guide()
该函数利用递归算法创建了一个为玩家提供提示、提供最简游戏步骤的功能,以此来推动游戏玩家更好的游戏体验。
void Hanoi(int num, char A, char B, char C)
{
if (num == 1)
{
cout << "第" << i++ << "步:" << "把第" << num << "个盘子从" << A << "柱子---->" << C << "柱子" << endl;
}
else
{
Hanoi(num - 1, A, C, B);
cout << "第" << i++ << "步:" << "把第" << num << "个盘子从" << A << "柱子---->" << C << "柱子" << endl;
Hanoi(num - 1, B, A, C);
}
}
这里是提示的递归函数,汉诺塔游戏的原理也在其中。
12、Exit()
该函数为玩家提供退出设置,方便玩家游戏疲惫时,退出游戏。
结构分析
1、主界面
游戏主界面通过用符号“=”和“||”作为游戏边框,利用直观的语言指导玩家进行游戏,“1 开始游戏”、“2 游戏说明”、“3 游戏提示”、“4 退出”。游戏主界面如图所示:
2、开始游戏
玩家通过输入编号为‘1’的选项开始游戏,进入游戏后,你会遇到游戏的故事环节,可以选择跳过,游戏便可以开始了,输入关卡编号‘3’,如图所示:
玩家可以通过输入铜柱的编号,来对盘子进行移动,例如输入数字1 3 ,就会将铜柱为1上的盘子移动到铜柱为3上,如图所示:
最终,在不断的摆放盘子后,就可以将盘子放到正确的位置,即可完成该难度的汉诺塔游戏,如图所示:
在摆放盘子的过程中,如果遇到大盘子摆放在小盘子上面或者移动盘子的方向错误(就是在空柱子上移动盘子)时,就会报错,并提示玩家放置错误的信息。
3、多次游戏
为了让玩家能够多次进行游戏,在游戏通关后,创建了一个能够让游戏再次进行的函数Pass,可以输入数字3退出游戏,也可输入除3以外的数字,再次进行游戏,如图所示为游戏继续时的选项:
4、游戏的故事线
为了吸引玩家进行游戏,我们设置了游戏故事线,并利用Sleep函数对该环节进行时间延迟的播放操作,以达到游戏美化的目的。
5、游戏说明
为了能过让玩家更好的了解游戏,进行游戏,我们设置了游戏说明,游戏提示,如图所示:
6、游戏提示
为解决玩家游戏体验的问题,创建游戏提示来帮助玩家进行游戏,如图所示:
7、退出游戏
设置一个退出功能,帮助玩家更好的游戏,如图所示: