汉诺塔游戏设计(C++控制台版)

汉诺塔游戏设计(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、退出游戏

        设置一个退出功能,帮助玩家更好的游戏,如图所示:

这次的汉诺塔游戏分享就结束了,感谢家仁们的阅读,如有错误之处,还请家仁们指出,小生一定会尽力改正。

  • 12
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值