创建游戏角色```
(1).功能描述
几乎所有的RPG游戏(一种源自《龙与地下城》的游戏类型)在进入游戏时都会让用户自己来创建自己喜欢的角色。本次上机要求编写一个简化的创建游戏角色的程序。
(2).游戏角色应有的属性
本题目要求的游戏角色应有以下属性:名字、性别、种族、职业、力量、敏捷、体力、智力、智慧、生命值和魔法值。
名字:不超过50个字符。
性别:可以选择男性和女性。
种族:一共可选五个种族,人类、精灵、兽人、矮人和元素。
职业:可选六种职业,狂战士、圣骑士、刺客、猎手、祭司和巫师。
其余属性均为整数。
本题目要求首先用户输入角色姓名,然后由用户选择角色性别,然后由用户选择种族,然后选择职业,然后自动分配力量、敏捷、体力、智力和智慧属性,并计算生命值和魔法值。
生命值=体力*20。
魔法值=(智力+智慧)*10。
(3).职业限制
很多职业会限制某些种族选择,例如兽人不能就职圣骑士等等,所以在要求用户选择职业时,输出信息里面只能有用户所选择种族可以就职的职业。
(4).初始属性
本题目要求力量、敏捷、体力、智力和智慧要求是随机值(利用随机数函数来取得随机数),但是五项属性的总和应该是100,并且应该和职业相关。例如狂战士的体力和力量就要比较高,而巫师需要较高的智力,而祭司则需要较高的智慧。初始属性大致满足该比例,但是应该是随机的。
然后利用属性值计算生命值和魔法值。
(5).显示信息
最后向用户显示该角色的所有信息,然后询问用户是否满意,如用户不满意则重新创建,若用户满意则程序结束,并将用户创建角色的相关信息写入文件保存。
程序实现
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
class Role//角色类
{private:
char name[50];//角色姓名
char sex[9];//角色性别
char nation[50];//角色种族
char job[50];//角色职业
int power;//力量
int agile;//敏捷
int spirit;//体力
int IQ;//智力
int wit;//智慧
int HP;//生命值
int MP;//魔法值
public:
void getname();//输入姓名
void getsex();//选择性别
void getnation();//选择种族
void getjob(Role r);//选择职业
void getattribut(Role r);//赋予角色属性
void display();//输出角色信息
void writefile();//向文件中写入角色信息
};
//输入姓名
void Role::getname()
{
printf("请输入您游戏角色的姓名:");
scanf("%s",&name);
}
//选择性别
void Role::getsex()
{
int s;
int t=1;//防止用户输入性别时出错
while(t)
{
printf("请输入您游戏角色的性别(0男性,1女性):");
scanf("%d",&s);
if(s==0) {strcpy(sex,"男性");t=0;}
else if(s==1) {strcpy(sex,"女性");t=0;}
else printf("输入错误,请输入0或1!\n");
}
}
//选择种族
void Role::getnation()
{
int n;
int t=1;//防止用户输入种族时出错
while(t)
{
printf("请输入您游戏角色的种族(0人类,1精灵,2兽人,3矮人,4元素):");
scanf("%d",&n);
if(n==0) {strcpy(nation,"人类");t=0;}
else if(n==1) {strcpy(nation,"精灵");t=0;}
else if(n==2) {strcpy(nation,"兽人");t=0;}
else if(n==3) {strcpy(nation,"矮人");t=0;}
else if(n==4) {strcpy(nation,"元素");t=0;}
else printf("输入错误,请输入0、1、2、3或4!\n");
}
}
//选择职业
void Role::getjob(Role role)
{
int j;
if(strcmp(role.nation,"人类")==0)//人类职业限制
{
printf("请选择您的职业(0狂战士,1圣骑士,2刺客,3猎手,4祭司,5巫师):");
scanf("%d",&j);
if(j==0) strcpy(job,"狂战士");
if(j==1) strcpy(job,"圣骑士");
if(j==2) strcpy(job,"刺客");
if(j==3) strcpy(job,"猎手");
if(j==4) strcpy(job,"祭司");
if(j==5) strcpy(job,"巫师");
}
if(strcmp(role.nation,"精灵")==0)//精灵职业限制
{
printf("请选择您的职业(0刺客,1猎手,2祭司,3巫师):");
scanf("%d",&j);
if(j==0) strcpy(job,"刺客");
if(j==1) strcpy(job,"猎手");
if(j==2) strcpy(job,"祭司");
if(j==3) strcpy(job,"巫师");
}
if(strcmp(role.nation,"兽人")==0)//兽人职业限制
{
printf("请选择您的职业(0狂战士,1猎手,2祭司):");
scanf("%d",&j);
if(j==0) strcpy(job,"狂战士");
if(j==1) strcpy(job,"猎手");
if(j==2) strcpy(job,"祭司");
}
if(strcmp(role.nation,"矮人")==0)//矮人职业限制
{
printf("请选择您的职业(0狂战士,1圣骑士,2祭司):");
scanf("%d",&j);
if(j==0) strcpy(job,"狂战士");
if(j==1) strcpy(job,"圣骑士");
if(j==2) strcpy(job,"祭司");
}
if(strcmp(role.nation,"元素")==0)//元素职业限制
{
printf("请选择您的职业(0祭司,1巫师):");
scanf("%d",&j);
if(j==0) strcpy(job,"祭司");
if(j==1) strcpy(job,"巫师");
}
}
//赋予角色属性
void Role::getattribut(Role role)
{
int t=1;
if(strcmp(role.job,"狂战士")==0)//狂战士属性限制
{
while(t)
{
srand((unsigned)time(NULL));
power=rand()%5+38;//力量数值在38~42中
agile=rand()%5+18;//敏捷数值在18~22中
spirit=rand()%5+28;//体力数值在28~32中
IQ=rand()%5+3;//智力数值在3~7中
wit=rand()%5+3;//智慧数值在3~7中
if(power+agile+spirit+IQ+wit==100) t=0;
}
}
if(strcmp(role.job,"圣骑士")==0)//圣骑士属性限制
{
while(t)
{
srand((unsigned)time(NULL));
power=rand()%5+23;//力量数值在23~27中
agile=rand()%5+13;//敏捷数值在13~17中
spirit=rand()%5+28;//体力数值在28~32中
IQ=rand()%5+18;//智力数值在18~22中
wit=rand()%5+8;//智慧数值在8~12中
if(power+agile+spirit+IQ+wit==100) t=0;
}
}
if(strcmp(role.job,"刺客")==0)//刺客属性限制
{
while(t)
{
srand((unsigned)time(NULL));
power=rand()%5+18;//力量数值在18~22中
agile=rand()%5+33;//敏捷数值在33~37中
spirit=rand()%5+18;//体力数值在18~22中
IQ=rand()%5+13;//智力数值在13~17中
wit=rand()%5+8;//智慧数值在8~12中
if(power+agile+spirit+IQ+wit==100) t=0;
}
}
if(strcmp(role.job,"猎手")==0)//猎手属性限制
{
while(t)
{
srand((unsigned)time(NULL));
power=rand()%5+13;//力量数值在13~17中
agile=rand()%5+38;//敏捷数值在38~42中
spirit=rand()%5+13;//体力数值在13~17中
IQ=rand()%5+8;//智力数值在8~12中
wit=rand()%5+18;//智慧数值在18~22中
if(power+agile+spirit+IQ+wit==100) t=0;
}
}
if(strcmp(role.job,"祭司")==0)//祭司属性限制
{
while(t)
{
srand((unsigned)time(NULL));
power=rand()%5+13;//力量数值在13~17中
agile=rand()%5+18;//敏捷数值在18~22中
spirit=rand()%5+13;//体力数值在13~17中
IQ=rand()%5+33;//智力数值在33~37中
wit=rand()%5+13;//智慧数值在13~17中
if(power+agile+spirit+IQ+wit==100) t=0;
}
}
if(strcmp(role.job,"巫师")==0)//巫师属性限制
{
while(t)
{
srand((unsigned)time(NULL));
power=rand()%5+8;//力量数值在8~12中
agile=rand()%5+18;//敏捷数值在18~22中
spirit=rand()%5+8;//体力数值在8~12中
IQ=rand()%5+18;//智力数值在18~22中
wit=rand()%5+38;//智慧数值在38~42中
if(power+agile+spirit+IQ+wit==100) t=0;
}
}
HP=spirit*20;
MP=(IQ+wit)*20;
}
//输出角色信息
void Role::display()
{
printf("===============================\n");
printf("姓名 %s\n",name);
printf("===============================\n");
printf("性别 %s\n",sex);
printf("===============================\n");
printf("种族 %s\n",nation);
printf("===============================\n");
printf("职业 %s\n",job);
printf("===============================\n");
printf("力量 %d\n",power);
printf("===============================\n");
printf("敏捷 %d\n",agile);
printf("===============================\n");
printf("体力 %d\n",spirit);
printf("===============================\n");
printf("智力 %d\n",IQ);
printf("===============================\n");
printf("智慧 %d\n",wit);
printf("===============================\n");
printf("生命值 %d\n",HP);
printf("===============================\n");
printf("魔法值 %d\n",MP);
printf("===============================\n");
}
//将角色信息写入文件中
void Role::writefile()
{
FILE *fp;
fp=fopen("role.txt","w");
if(!fp)
{
printf("\n打开文件role.txt失败!");
}
//向文件中读取角色信息
fprintf(fp,"角色信息:");
fprintf(fp,"\n姓名 %s",name);
fprintf(fp,"\n性别 %s",sex);
fprintf(fp,"\n种族 %s",nation);
fprintf(fp,"\n职业 %s",job);
fprintf(fp,"\n力量 %d",power);
fprintf(fp,"\n敏捷 %d",agile);
fprintf(fp,"\n体力 %d",spirit);
fprintf(fp,"\n智力 %d",IQ);
fprintf(fp,"\n智慧 %d",wit);
fprintf(fp,"\n生命值 %d",HP);
fprintf(fp,"\n魔法值 %d",MP);
printf("\n");
fclose(fp);
printf("角色信息已写入文件中\n");
}
int main()
{
Role r;
int a;//判断用户是否满意角色信息
int t=1;//判断角色是否需要重建
while(t)
{
r.getname();
r.getsex();
r.getnation();
r.getjob(r);
r.getattribut(r);
r.display();
printf("是否满意此次创建的角色(满意选0,不满意选1)?\n");
scanf("%d",&a);
if(a==0)
{
t=0;
r.writefile();
}
}
return 0;
}