c语言入门指南(6)(用文本模拟精灵宝可梦游戏对战)

欢迎来到C语言入门指南专栏的最后一章,前面已经带领大家了解了程序结构,输入输出函数等C语言入门必须了解的内容,本专栏的最后两篇文章则是通过这些简单的案例让大家对前面的内容更好的掌握。(如果觉得有用还请期待博主的下一个专栏哦~)。

我们前面已经了解过了如何用简单的输入输出函数来实现简单的文本内容游戏,这里我们来看一下如何用输入输出函数来模拟一下游戏《精灵宝可梦》的对战系统

首先我们得先搭建一个简单的战斗平台。

void scream(int hp1,int hp2)
{
	printf("炎兔儿             HP:%d\n",hp1);
	printf("\n");
	printf("\n");
	printf("\n");
	printf("掘掘兔     HP:%d\n",hp2);
	printf("\n");
	printf("\n");
	printf("\n");
	printf("1.撞击    2.火花\n");
	printf("3.电光一闪   4.二连踢\n");
}

接下来,我们需要完善战斗系统,我们需要构思一个完善的对战模拟过程,比如我的对战模拟过程如下:玩家1先行动,随后是玩家2,其次是检测系统,我们需要在某个宝可梦的回合结束后评估一下宝可梦的状态,避免出现宝可梦hp等于0的时候还未死亡的情况出现。

ps(system(“cls”)的作用是清除屏幕,在本代码中的作用是为了更新宝可梦们的体力值状态,因为博主不会用实时更新血条的方法,所以用了很原始的方式。sleep()函数的作用是让程序在这里暂停,具体暂停的时间由参数决定,比如我这里设置的是3000毫秒,即三秒,这里是为了避免状态更新过快导致玩家不能完整的接收到对战信息,毕竟程序的运行速度是很快的,对吧--+)。

void play()
{
	int hp1 = 35, hp2 = 32;
	scream(hp1, hp2);
	do
	{
		system("cls");
		scream(hp1, hp2);//更新状态
		fight1(&hp2);//玩家回合
		Sleep(3000);
		cheat(hp1,hp2);//状态评估
		if (hp2 == 0)//如果生命值低于0,立即结束战斗
			break;
		fight2(&hp1);//对手回合
		Sleep(3000);
		cheat(hp1, hp2);//状态评估
	} while (hp1 && hp2);//如果某一方hp等于0,结束战斗
}

接下来则是模拟玩家回合的宝可梦的攻击方式。我的构思是设置4个技能供玩家使用,每个技能的状态效果都写上。

if (input > 0 && input <= 4);
	{
		switch (input)
		{
		case 1:
			*hp2 -= 10;
			printf("炎兔儿使用了撞击,对掘掘兔造成了%d点伤害\n",10);
			break;
		case 2:
			*hp2 -= 5;
			printf("炎兔儿使用了火花,效果不佳,对掘掘兔造成了%d点伤害\n",5);
			break;
		case 3:
			*hp2 -= 12;
			printf("炎兔儿使用了电光一闪,对掘掘兔造成了%d点伤害\n",12);
			break;
		case 4:
			*hp2 -= 20;
			printf("炎兔儿使用了二连踢,效果绝佳,对掘掘兔造成%d点伤害\n",20);
			break;
		default:
			printf("炎兔儿还没有学习此技能哦,请重新指挥\n");
		}
		Sleep(1000);
		if (*hp2 <= 0)
			*hp2 = 0;
	}
}

制作对手的攻击回合时,我们又要使用到上一期讲到的随机数生成了,因为对手当然不能由玩家来操作了。除此之外和玩家的攻击回合的逻辑类似。

void fight2(int*hp1)
{
	int input = rand() % 3 + 1;
	switch (input)
	{
	case 1:
		*hp1 -= 14;
		printf("掘掘兔使用了掷泥,效果绝佳,对炎兔儿造成了%d点伤害\n",14);
		break;
	case 2:
		*hp1 -= 9;
		printf("掘掘兔使用了撞击,对炎兔儿造成了%d点伤害\n",9);
		break;
	case 3:
		*hp1 -= 9;
		printf("掘掘兔使用了电光一闪,对炎兔儿造成了%d点伤害\n",9);
		break;
	case 4:
		*hp1 -= 20;
		printf("掘掘兔使用了泥巴射击,效果绝佳,对炎兔儿造成了%d点伤害\n",20);
		break;
	}
	if (*hp1 <= 0)
		*hp1 = 0;
}

《精灵宝可梦》游戏在对战之前都会先进行一次对话,我们顺便也把这个给模拟一下

void start()
{
	printf("短裤小子和树想要与你对战");
	Sleep(1000);
	system("cls");
	printf("短裤小子和树派出了掘掘兔");
	Sleep(1000);
	system("cls");
	printf("就决定是你了炎兔儿\n");
	Sleep(1000);
	system("cls");
	srand((unsigned int)time(NULL));
}

ok,《精灵宝可梦》的对战模拟我们就简单的完成了,其实如果有大佬看到博主的代码都会发现博主目前写的代码都是“面向结果的编程”。第一个问题就是冗余代码太多,在对战过程中博主将所有技能的效果都写上了,游戏中的宝可梦是不止2个的。第二个问题就是没有考虑到暴击对于战斗的影响。第三则是将数值固定住了,我们知道不同技能对于不同属性的宝可梦造成的伤害是不同的,这里需要对技能造成的伤害进行一个判断。博主想到的解决方法是写一个函数,将宝可梦的技能威力,技能属性,以及被攻击宝可梦的属性作为参数,然后将技能造成的结果返回,并根据不同的效果进行打印。

这里附上博主的所有代码(还是鼓励大家多尝试哦,如果有更好的想法或者在程序实现的问题上出现了难题,欢迎大家在评论区留言或者私聊博主~)。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<time.h>
void cheat(int hp1, int hp2)
{
	if (hp1 == 0)
	{
		printf("你被打败了\n");
	}
	else if (hp2 == 0)
	{
		printf("你打败了短裤小子和树");
	}
}
void fight1(int* hp2)
{
	int input = 0;
	scanf("%d", &input);
	if (input > 0 && input <= 4);
	{
		switch (input)
		{
		case 1:
			*hp2 -= 10;
			printf("炎兔儿使用了撞击,对掘掘兔造成了%d点伤害\n",10);
			break;
		case 2:
			*hp2 -= 5;
			printf("炎兔儿使用了火花,效果不佳,对掘掘兔造成了%d点伤害\n",5);
			break;
		case 3:
			*hp2 -= 12;
			printf("炎兔儿使用了电光一闪,对掘掘兔造成了%d点伤害\n",12);
			break;
		case 4:
			*hp2 -= 20;
			printf("炎兔儿使用了二连踢,效果绝佳,对掘掘兔造成%d点伤害\n",20);
			break;
		default:
			printf("炎兔儿还没有学习此技能哦,请重新指挥\n");
		}
		Sleep(1000);
		if (*hp2 <= 0)
			*hp2 = 0;
	}
}
void fight2(int*hp1)
{
	int input = rand() % 3 + 1;
	switch (input)
	{
	case 1:
		*hp1 -= 14;
		printf("掘掘兔使用了掷泥,效果绝佳,对炎兔儿造成了%d点伤害\n",14);
		break;
	case 2:
		*hp1 -= 9;
		printf("掘掘兔使用了撞击,对炎兔儿造成了%d点伤害\n",9);
		break;
	case 3:
		*hp1 -= 9;
		printf("掘掘兔使用了电光一闪,对炎兔儿造成了%d点伤害\n",9);
		break;
	case 4:
		*hp1 -= 20;
		printf("掘掘兔使用了泥巴射击,效果绝佳,对炎兔儿造成了%d点伤害\n",20);
		break;
	}
	if (*hp1 <= 0)
		*hp1 = 0;
}
void start()
{
	printf("短裤小子和树想要与你对战");
	Sleep(1000);
	system("cls");
	printf("短裤小子和树派出了掘掘兔");
	Sleep(1000);
	system("cls");
	printf("就决定是你了炎兔儿\n");
	Sleep(1000);
	system("cls");
	srand((unsigned int)time(NULL));
}
void scream(int hp1,int hp2)
{
	printf("炎兔儿             HP:%d\n",hp1);
	printf("\n");
	printf("\n");
	printf("\n");
	printf("掘掘兔     HP:%d\n",hp2);
	printf("\n");
	printf("\n");
	printf("\n");
	printf("1.撞击    2.火花\n");
	printf("3.电光一闪   4.二连踢\n");
}
void play()
{
	int hp1 = 35, hp2 = 32;
	scream(hp1, hp2);
	do
	{
		system("cls");
		scream(hp1, hp2);
		fight1(&hp2);
		Sleep(3000);
		cheat(hp1,hp2);
		if (hp2 == 0)
			break;
		fight2(&hp1);
		Sleep(3000);
		cheat(hp1, hp2);
	} while (hp1 && hp2);
}
int main()
{
	start();
	play();
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码小豪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值