出于字数原因,暂时无法在一个文章里写完,所以分了上下两半部分
目录
基础设施
主函数
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
这是一个无返回值的函数,所以别手欠在后面补上return 0;
然后这个函数的目的是初始化游戏,因为后面有个递归调用main()
代码就不写了,因为真的太太太太太太太太简单了,只是需要提醒几点:
1. X坐标及Y坐标的重置(别超出20*40)
2. Imposter数组的重置(将三个下标设为1)
3.Alive数组的重置(将所有都设为1)
4.地图要加边框
终于,我们到了最重要的部分了!
这个函数我就直接公开代码吧,因为它就是一堆别的函数的集合
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
很好!
我们可以看见已经会有一个基础的场景了,后续会对这个场景进行优化来添加很多装饰!
注意看!这个函数也很重要,因为它的编写决定了玩家的移动
上——代——码——
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()这个东西
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个字的文档卡爆了!