C++ Among Us 太空狼人杀(上半部分)

出于字数原因,暂时无法在一个文章里写完,所以分了上下两半部分

目录

基础设施

主函数

void Load()

void ScreenUpdate()

函数主体

试运行

运行结果

void MobUpdate()

打酱油?!

只是你打酱油而已,我才不打

void TryMove

初级回顾


基础设施

首先,是最普通的头文件,分别是:

#include
//万能头文件

//注意:剩下的两个头文件不是在万能头文件里的!
#include
//检测键盘输入
#include
//主要为了Sleep(int dilliseconds)函数

接下来,我们需要一个叫world的二维数组,来储存地图(建议开到world[20][40],出于字符长是宽的两倍的原因,所以第二个下标最好是第一个下标的2倍)

然后为了方便需要一个叫PlayerCnt的常量,来寄存一共有多少个人(因为后续可能会做调整)

定义完PlayerCnt之后,就可以分别定义:

int PlayerCnt=10;//推荐10个人
bool Alive[PlayerCnt];//
bool Imposter[Playercnt];//
char Source[PlayerCnt];//分别记录每个玩家的形象,后面会说
int MobX[PlayerCnt];//X坐标
int MobY[PlayerCnt];//Y坐标
bool Killing;//后面有用
int CrewLeft,ImposterLeft;//分别代表剩余船员、剩余内鬼
bool Restart=0,Reported;//在后面有用
string str;//在后面有用

注意:没提到const的数据千万别作死在前面加个const

主函数

主函数也是很简单的,先上代码:

int main()
{
	//{'M','%','@','V','H','A','S','D','W','O'}   这个是废弃的样子
	Restart=0;
	Reported=0;
    Source[0]='1';Source[1]='2';Source[2]='3';Source[3]='4';Source[4]='5';Source[5]='6';Source[6]='7';Source[7]='8';Source[8]='9';Source[9]='O';
    //重置样子(不能忽略)
    //别把它“优化”成了for(int i=0;i

void Load()

这是一个无返回值的函数,所以别手欠在后面补上return 0;

然后这个函数的目的是初始化游戏,因为后面有个递归调用main()

代码就不写了,因为真的太太太太太太太太简单了,只是需要提醒几点:

1. X坐标及Y坐标的重置(别超出20*40)

2. Imposter数组的重置(将三个下标设为1)

3.Alive数组的重置(将所有都设为1)

4.地图要加边框

void ScreenUpdate()

终于,我们到了最重要的部分了!

函数主体

这个函数我就直接公开代码吧,因为它就是一堆别的函数的集合

void ScreenUpdate()
{
	MobUpdate();//另外一个套了很多函数的函数
	system("cls");//清屏
	bool x=0;
    //嵌套循环输出整个世界
	for(int i=0;i<20;i++)//world[  20  ][40]
	{
		for(int j=0;j<40;j++)//world[20][  40  ]
		{
			//cout<

试运行

好了,现在就差不多可以试运行了,这里提供了一个简介的代码(也就是删掉了没定义的函数避免报错)来运行:

#include
using namespace std;
char world[20][40];
const int PlayerCnt=10;
char Source[PlayerCnt]={'M','%','@','V','H','A','S','D','W','O'};
int MobX[PlayerCnt];
int MobY[PlayerCnt];
bool Alive[PlayerCnt];
bool Evil[PlayerCnt];
bool played=0,Killing;
int CrewLeft,ImposterLeft;
bool Restart=0,Reported;
string str;
void load()
{
	srand(time(0));
	for(int i=0;i<20;i++)
	{
		for(int j=0;j<40;j++)
		{
			if(i==0||i==19||j==0||j==39)
			{
				world[i][j]='#';
			}else world[i][j]=' ';
		}
	}
	for(int i=0;i

运行结果

很好!

C++ Among Us 太空狼人杀(上半部分)_第1张图片

我们可以看见已经会有一个基础的场景了,后续会对这个场景进行优化来添加很多装饰!

void MobUpdate()

注意看!这个函数也很重要,因为它的编写决定了玩家的移动

上——代——码——

void MobUpdate()
{
	TryMove();//控制玩家的移动
	srand(time(0));
    //船员报告
	if(rand()%30==0)
	{
		Report(rand()%10+1);
	}
    //拿循环来控制每个人的移动(后续会优化)
	for(int i=0;i38)MobX[i]=38;
		if(MobY[i]<1)MobY[i]=1;
		if(MobY[i]>18)MobY[i]=18;
	}
    //两个void
	Kill();
	BodyReport();
}

打酱油?!

然后如果不介意的话顺便介绍一个基本上啥用都没void CheckAlive()

这个代码我就不说了,看就能明白

void CheckAlive()
{
	CrewLeft=0;
	for(int i=0;i<10;i++)
	{
		if(Source[i]!='X')CrewLeft++;
	}
	ImposterLeft=0;
	for(int i=0;i<10;i++)
	{
		if(Evil[i]==1&&Source[i]!='X')ImposterLeft++;
	}
}

只是你打酱油而已,我才不打

介绍完“没用”的东西之后,是时候介绍“有用”得了

我们就来分解一下MobUpdate()这个东西

void TryMove

Wow!我们终于可以移动了!

还不赶紧上代码?

void TryMove()
{
	char key;//这就是为啥要
	key=0;//重置按键
	Killing=0;
	if(_kbhit()&&Alive[9]==1)//检测输入
	{
		key=getch();
		if(key=='w'&&MobY[PlayerCnt-1]<18)MobY[PlayerCnt-1]++;
		if(key=='s'&&MobY[PlayerCnt-1]>1)MobY[PlayerCnt-1]--;
		if(key=='a'&&MobX[PlayerCnt-1]>1)MobX[PlayerCnt-1]--;
		if(key=='d'&&MobX[PlayerCnt-1]<38)MobX[PlayerCnt-1]++;
		if(key=='r'&&Reported==0)Report(10);
		if(key==' '&&Alive[9]==0)Restart=1;
	}
}

R和空格键我们后面再说

初级回顾

我们来回顾一下之前的代码来重新明确每个函数的用途:

首先,我们定义了变量

其次,我们定义了ScreenUpdate来控制屏幕输出

然后我们写了MobUpdate来使角色可以移动

然后我们整了一个打酱油的函数拿来统计生还人数和内鬼剩余数量

接下来又是快乐的试运行!

#include
using namespace std;
char world[20][40];
const int PlayerCnt=10;
char Source[PlayerCnt]={'M','%','@','V','H','A','S','D','W','O'};
int MobX[PlayerCnt];
int MobY[PlayerCnt];
bool Alive[PlayerCnt];
bool Evil[PlayerCnt];
bool played=0,Killing;
int CrewLeft,ImposterLeft;
bool Restart=0,Reported;
string str;
void load()
{
	srand(time(0));
	for(int i=0;i<20;i++)
	{
		for(int j=0;j<40;j++)
		{
			if(i==0||i==19||j==0||j==39)
			{
				world[i][j]='#';
			}else world[i][j]=' ';
		}
	}
	for(int i=0;i1)MobY[PlayerCnt-1]--;
		if(key=='a'&&MobX[PlayerCnt-1]>1)MobX[PlayerCnt-1]--;
		if(key=='d'&&MobX[PlayerCnt-1]<38)MobX[PlayerCnt-1]++;
		if(key=='r'&&Reported==0)//Report(10);
		if(key==' '&&Alive[9]==0)Restart=1;
	}
}
void MobUpdate()
{
	TryMove();
	srand(time(0));
	for(int i=0;i38)MobX[i]=38;
		if(MobY[i]<1)MobY[i]=1;
		if(MobY[i]>18)MobY[i]=18;
	}
}
void CheckAlive()
{
	CrewLeft=0;
	for(int i=0;i<10;i++)
	{
		if(Source[i]!='X')CrewLeft++;
	}
	ImposterLeft=0;
	for(int i=0;i<10;i++)
	{
		if(Evil[i]==1&&Source[i]!='X')ImposterLeft++;
	}
}
void ScreenUpdate()
{
	MobUpdate();
	system("cls");
	bool x=0;
	for(int i=0;i<20;i++)
	{
		for(int j=0;j<40;j++)
		{
			//cout<3&&Evil[9]==1||ImposterLeft>0&&Evil[9]==0
	while(1)
	{
		ScreenUpdate();
		if(Restart==1)
		{
			system("cls");
			cout<<"Creating new game..."<

代码已经长起来了!

中级逻辑

这是整个游戏最难的部分,一旦搞定这个,我们剩下的就很轻松了

首先,当然是把之前MobUpdate的函数全部弄完

这里我就推荐你们自己写,别抄样例代码了,要不然后面会很难看懂的

我就告诉你们要写什么:

1.void Kill()击杀

2. void BodyReport()尸体报告

3.void Report()紧急会议


如果你真的写出来了,那么这里有一个样例代码:

#include
using namespace std;
char world[20][40];
const int PlayerCnt=10;
char Source[PlayerCnt]={'M','%','@','V','H','A','S','D','W','O'};
int MobX[PlayerCnt];
int MobY[PlayerCnt];
bool Alive[PlayerCnt];
bool Evil[PlayerCnt];
bool played=0,Killing;
int CrewLeft,ImposterLeft;
bool Restart=0,Reported;
string str;
void load()
{
	srand(time(0));
	for(int i=0;i<20;i++)
	{
		for(int j=0;j<40;j++)
		{
			if(i==0||i==19||j==0||j==39)
			{
				world[i][j]='#';
			}else world[i][j]=' ';
		}
	}
	for(int i=0;i>cnt;
	if(rand()%5==0)
	{
		cout<<"No."<1)MobY[PlayerCnt-1]--;
		if(key=='a'&&MobX[PlayerCnt-1]>1)MobX[PlayerCnt-1]--;
		if(key=='d'&&MobX[PlayerCnt-1]<38)MobX[PlayerCnt-1]++;
		if(key=='r'&&Reported==0)Report(10);
		if(key==' '&&Alive[9]==0)Restart=1;
	}
}
void Kill()
{
	srand(time(0));
	for(int i=0;i<9;i++)
	{
		for(int j=i+1;j<10;j++)
		{
			if(MobX[i]==MobX[j]&&MobY[i]==MobY[j]&&rand()%2==0)
			{
				if(Evil[i]==1&&rand()%2==0&&Alive[i]==1)
				{
					Alive[j]=0;
					Source[j]='X';
				}
				if(Evil[j]==1&&Alive[j]==1)
				{
					if(j==10&&Killing==1)
					{
						Alive[i]=0;
						Source[i]='X';
					}else if(rand()%2==0)
					{
						Alive[i]=0;
						Source[i]='X';
					}
				}
			}
		}
	}
	if(Alive[9]==0)Source[9]='X';
}
void BodyReport()
{
	srand(time(0));
	int cnt=rand()%10+3,r=rand()%20*100;
	for(int i=0;i<9;i++)
	{
		for(int j=i+1;j<10;j++)
		{
			if(MobX[j]==MobX[i]&&MobY[j]==MobY[i])
			{
				if(Source[i]=='X'&&Evil[j]==0)
				{
					Source[i]='+';
					system("cls");
					cout<<"No."<>cnt;
					if(rand()%5==0)
					{
						cout<<"No."<>cnt;
					if(rand()%5==0)
					{
						cout<<"No."<38)MobX[i]=38;
		if(MobY[i]<1)MobY[i]=1;
		if(MobY[i]>18)MobY[i]=18;
	}
	Kill();
	BodyReport();
}
void CheckAlive()
{
	CrewLeft=0;
	for(int i=0;i<10;i++)
	{
		if(Source[i]!='X')CrewLeft++;
	}
	ImposterLeft=0;
	for(int i=0;i<10;i++)
	{
		if(Evil[i]==1&&Source[i]!='X')ImposterLeft++;
	}
}
void ScreenUpdate()
{
	MobUpdate();
	system("cls");
	bool x=0;
	for(int i=0;i<20;i++)
	{
		for(int j=0;j<40;j++)
		{
			//cout<3&&Evil[9]==1||ImposterLeft>0&&Evil[9]==0
	while(1)
	{
		ScreenUpdate();
		if(Restart==1)
		{
			system("cls");
			cout<<"Creating new game..."<

恭喜我们写出了434行的代码!

但是出于本文章字数太多,现在已经打不了字了

所以欲知后事如何,且听下回分解~

注:现在我的电脑已经被这个14108个字的文档卡爆了!

你可能感兴趣的:(C++游戏,c++,游戏)