寻宝游戏
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
typedef struct
{
char name[20];//姓名
}Player;//玩家
typedef struct
{
char name[20];//奖品
float price;//价格
}Price;//奖品
typedef struct
{
Player a;//获奖的玩家
Price b[3];//获奖的三件奖品
}Record;//奖品
int LoadPlayer(Player a[])//加载玩家信息
{
int i=0;
FILE* fp;//文件指针
fp=fopen("player.txt","r+");//打开文件
if(fp==NULL)return 0;//打开失败返回0
while(!feof(fp))//读取信息到文件结束
{
fscanf(fp,"%s\n",a[i].name);
i++;
}
fclose(fp);//关闭文件
return i;//返回读取到的玩家数量
}
void SavePlayer(Player a[],int n)//保存玩家信息
{
int i;
FILE* fp;
fp=fopen("player.txt","w+");//打开文件
if(fp==NULL)return ;
for(i=0;i<n;i++)//根据玩家数量 循环写入文件
{
fprintf(fp,"%s\n",a[i].name);
}
fclose(fp);//关闭文件
}
int LoadPrice(Price a[])
{
int i=0;
FILE* fp;
fp=fopen("price.txt","r+");
if(fp==NULL)return 0;
while(!feof(fp))
{
fscanf(fp,"%s %f\n",a[i].name,&a[i].price);
i++;
}
fclose(fp);
return i;
}
void SavePrice(Price a[],int n)
{
int i;
FILE* fp;
fp=fopen("price.txt","w+");
if(fp==NULL)return;
for(i=0;i<n;i++)
{
fprintf(fp,"%s %f\n",a[i].name,a[i].price);
}
fclose(fp);
}
int LoadRecord(Record a[])
{
int i=0;
FILE* fp;
fp=fopen("record.txt","r+");
if(fp==NULL)return 0;
while(!feof(fp))
{
fscanf(fp,"%s %s %f %s %f %s %f\n",a[i].a.name,a[i].b[0].name,&a[i].b[0].price,a[i].b[1].name,&a[i].b[1].price,a[i].b[2].name,&a[i].b[2].price);
i++;
}
fclose(fp);
return i;
}
void SaveRecord(Record a[],int n)
{
int i;
FILE* fp;
fp=fopen("record.txt","w+");
if(fp==NULL)return;
for(i=0;i<n;i++)
{
fprintf(fp,"%s %s %f %s %f %s %f\n",a[i].a.name,a[i].b[0].name,a[i].b[0].price,a[i].b[1].name,a[i].b[1].price,a[i].b[2].name,a[i].b[2].price);
}
fclose(fp);
}
int menu()//菜单
{
int choice;
system("cls");
printf("幸运之星\n");
printf("1:开始游戏\n");
printf("2:历史获奖\n");
printf("3:添加玩家\n");
printf("4:添加奖品\n");
printf("0:退出\n");
printf("请输入选择:");
scanf("%d",&choice);
return choice;
}
int AddPlayer(Player a[],int n)//增加玩家
{
system("cls");
printf("请输入新增加的玩家姓名:");
scanf("%s",a[n].name);//添加到尾部
printf("新增成功!\n");
system("pause");
return n+1;//玩家数量+1
}
int AddPrice(Price a[],int n)
{
system("cls");
printf("请输入新增加的奖品名称:");
scanf("%s",a[n].name);
printf("请输入新增加的奖品价格:");
scanf("%f",&a[n].price);
printf("新增成功!\n");
system("pause");
return n+1;
}
int StartGame(Player a[],int an,Price b[],int bn,Record r[],int rn)//开始游戏
{
int i,k,now,j;
int no[3];//奖品编号
int arr[100]={0};
srand(time(NULL));//设置随机数
system("cls");
if(an==0)//玩家数量为0
{
printf("本轮没有玩家!\n");
system("pause");
return rn;
}
if(bn==0)//奖品数量为0
{
printf("本轮没有奖品!\n");
system("pause");
return rn;
}
printf("本轮奖品为:\n");
for(i=0;i<3;i++)//随机选择3个奖品
{
no[i]=rand()%bn;
printf("奖品:%s\t价格:%.2f\n",b[no[i]].name,b[no[i]].price);
strcpy(r[rn].b[i].name,b[no[i]].name);
r[rn].b[i].price=b[no[i]].price;
}
for(i=0,now=0;i<an-1;i++)//循环人数-1次
{
do
{
k=rand()%6+1;//随机生成1-6
}while(k>=an/2);
for(j=0;j<k;)//走k步
{
if(arr[now]==0)//如果当前这个没有被淘汰
{
j++;//走一步
now++;//到下一个人
}
else
{
now++;//不走 到下一个人
}
if(now>=an)now-=an;//超出最大范围 从0重新开始
}
arr[(now+an-1)%an]=1;//找到要淘汰的人
printf("本轮色子为:%d\n",k);
printf("本轮编号为%d的%s被淘汰!\n",(now+an-1)%an+1,a[(now+an-1)%an].name);
}
for(i=0;i<an;i++)//寻找最后一个没被淘汰的人 并且记录下来
{
if(arr[i]==0)
{
printf("恭喜编号为:%d的%s获得所有奖品!\n",i+1,a[i].name);
strcpy(r[rn].a.name,a[i].name);
}
}
system("pause");
return rn+1;
}
void History(Record r[],int n)//显示获奖记录
{
int i;
system("cls");
if(n==0)
{
printf("无获奖记录!\n");
system("pause");
return;
}
printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n","获奖人","奖品1","价格","奖品2","价格","奖品3","价格");
for(i=0;i<n;i++)
{
printf("%-10s%-10s%-10.2f%-10s%-10.2f%-10s%-10.2f\n",r[i].a.name,r[i].b[0].name,r[i].b[0].price,r[i].b[1].name,r[i].b[1].price,r[i].b[2].name,r[i].b[2].price);
}
system("pause");
}
int main()
{
int choice;
Player p[100];
int pn=LoadPlayer(p);//加载文件
Price p2[100];
int p2n=LoadPrice(p2);
Record r[100];
int rn=LoadRecord(r);
do
{
choice=menu();
switch(choice)
{
case 1:
rn=StartGame(p,pn,p2,p2n,r,rn);
break;
case 2:
History(r,rn);
break;
case 3:
pn=AddPlayer(p,pn);
break;
case 4:
p2n=AddPrice(p2,p2n);
break;
}
}while(choice!=0);
SavePlayer(p,pn);
SavePrice(p2,p2n);
SaveRecord(r,rn);//保存文件
return 0;
}