模拟实现猜单词游戏,纯模拟,不涉及图形界面,注释很详细,虽然本人代码写得丑,但是希望可以给大家提供帮助
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<fstream>
#include<ctime>
#include<cmath>
#include<iomanip>
#include<windows.h>
using namespace std;
int times=10;//全局变量,默认猜测次数
typedef struct save
{
char word[30];//存储单个单词
}save;
save a[100];//存储所有读入单词,最多100个
typedef struct rank
{
int mc;//名次
char name[20];//姓名
double grade;//成绩
char tmp[64];//创造纪录日期
}rank;
rank board[3];//排行榜,保存前三名
//函数声明
int readword();//从硬盘读入单词
void readrank();//读入成绩记录
void caidan();//打印菜单
void setting();//菜单1设置猜测次数限制
void toprecord();//打印排行榜
void record();//将board排行写入硬盘
void playgame(int n);//菜单0进行游戏
int main()
{
system("color f0");
int n;//存储单词总数,便于play随机选择单词编号
printf(" 欢迎进入游戏!\n");
n=readword();
readrank();//读入成绩记录
while(1)
{
int t;
system("cls");//保持界面整洁
caidan();
scanf("%d",&t);
switch(t)
{
case 0:
{
playgame(n);
break;
}
case 1:
{
setting();
break;
}
case 2:
{
system("cls");
toprecord();
printf(" ");
system("pause");//暂停
break;
}
case 3:
{
record();//退出之前将board中的数据写入硬盘
printf(" *************大侠再见*************\n ");
exit(0);
}
}
}
return 0;
}
int readword()//从硬盘读入单词
{
char character;//存储单个读入字符
int i=0,j=0;//循环变量
ifstream ifile("word.txt");//文件流
if(!ifile)
{
printf(" word.txt 不能打开!\n");
return 0;
}
while(ifile.get(character))//将文件中的字符读入save结构体中,用于playgame随机选择
{
if(character!=' ')
{
a[i].word[j]=character;
j++;
}
else
{
i++;
j=0;
}
}
ifile.close();
return i;//返回读入单词数
}
void readrank()//从硬盘读入排名
{
char character;//存储单个读入字符
char temp[100];//临时将一行排名的所有信息存入,等待处理
int i=0,j=0,k,l;//循环变量
double xiaoshu;//处理temp[100]中成绩的小数
ifstream ifile("rank.txt");//文件流
if(!ifile)
{
printf(" rank.txt 不能打开!\n");
return;
}
while(ifile.get(character))//将文件中的字符按行读入到temp字符串中
{
if(character!=10)
{
temp[i]=character;
i++;
}
else
{
board[j].mc=(temp[0]-48);//读完一行对temp进行处理,将字符串转换为纪录的信息存储到board中
for(k=2;temp[k]!=' ';k++)
{
board[j].name[k-2]=temp[k];
}
k++;
for(;k<i;k++)
{
if(temp[k]=='.')
{
for(l=k-1;temp[l]!=' ';l--)//字符串转换成小数
board[j].grade=((temp[l]-48)*pow(10,k-1-l));
xiaoshu=((temp[k+1]-48)*0.1+(temp[k+2]-48)*0.01+(temp[k+3]-48)*0.001);
board[j].grade+=xiaoshu;
break;
}
}
for(l=k+5;l<=(k+23);l++)
board[j].tmp[l-k-5]=temp[l];//日期
j++;
i=0;
}
}
ifile.close();
}
void caidan()//打印菜单
{
int i;
printf(" ");//打印图形界面
for(i=0;i<34;i++)
printf("*");
printf("\n");
printf(" * *\n");
printf(" * 菜单 *\n");
printf(" * 0 Playing Game *\n");
printf(" * 1 Setting *\n");
printf(" * 2 Top Records *\n");
printf(" * 3 Exit *\n");
printf(" * *\n");
printf(" ");
for(i=0;i<34;i++)
printf("*");
printf("\n");
printf(" ***********输入选项编号***********\n");
printf(" ");
}
void setting()//菜单1设置猜测次数限制
{
printf(" **********请设置猜测次数**********\n");
printf(" ");
scanf("%d",×);
}
void toprecord()//打印排行榜
{
int i;//循环变量
printf("\n\n ");//打印图形界面
for(i=0;i<59;i++)
printf("*");
printf("\n");
printf(" * *\n");
printf(" * 大侠榜 *\n");
for(i=0;i<3;i++)
{
if (board[i].grade==0)
{
printf(" * %d %-10s %-8.3f",board[i].mc,board[i].name,board[i].grade);
printf(" 0000/00/00 00:00:00 *\n");
}
else
{
printf(" * %d %-10s %-8.3f %s",board[i].mc,board[i].name,board[i].grade,board[i].tmp);
printf(" *\n");
}
}
printf(" * *\n");
printf(" ");
for(i=0;i<59;i++)
printf("*");
printf("\n\n\n");
}
void record()//将board排行写入硬盘
{
int i;//循环变量
ofstream ofile("rank.txt");//文件流
if(!ofile)
{
printf(" rank.txt 不能打开\n");
}
else
{
for(i=0;i<3;i++)//把board中的信息写入硬盘
{
ofile<<board[i].mc<<" "<<board[i].name<<" "<<fixed<<setprecision(3)<<board[i].grade<<" "<<board[i].tmp<<endl;
}
}
}
void playgame(int n)//菜单0进行游戏
{
int i,j;//i,j用于循环
int flag;//flag标记是否猜对字母
int temp;//存储随机单词编号
int len;//所猜单词长度
int correct,wrong;//统计对与错的次数
char ch[30];//所猜单词
char guess;//所猜字母
char tt='Y';//是否继续猜
double grade;//记录成绩
char compare[50];//和原来单词对比
while((tt=='Y')||(tt=='y'))//t为1是继续猜
{
printf(" *************游戏开始*************\n");
correct=0;
wrong=0;//每次猜之前初始化对与错的次数
srand((unsigned)time(NULL));
temp=rand()%(n+1);//取随机值
strcpy(ch,a[temp].word);
len=strlen(ch);
memset(compare,'-',sizeof(ch)+1);//初始化字符串为“-”
printf(" ");
for(j=0;j<len;j++)
printf("-");
printf("\n");
for(i=0;i<times;i++)//未达次数限制循环猜测
{
flag=0;
printf(" ");
scanf("%s",&guess);
for(j=0;j<len;j++)
{
if(guess==ch[j])
{
compare[j]=guess;
flag=1;
}
if(ch[j]==(guess+32))
{
compare[j]=(guess+32);
flag=1;
}
}
if(flag)//flag为1,猜测正确
{
printf(" 猜测正确,还有%d次机会\n",times-i-1);
printf(" ");
for(j=0;j<len;j++)//输出已猜到的位置和对应字母
printf("%c",compare[j]);
printf("\n");
for(j=0;j<len;j++)//检验字母是否全部猜出
if(compare[j]=='-')
break;
if(j==len)//字母全部猜出
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY |FOREGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE |FOREGROUND_RED);
printf(" 大侠你好厉害!\n");//输出颜色变为红色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);//输出变为原来颜色
break;
}
}
else
{
printf(" 猜测错误,还有%d次机会\n",times-i-1);
wrong++;
}
}
for(j=0;j<len;j++)//与正确答案对比
if(compare[j]=='-')
break;
if(j>=len)
correct=(i+1-wrong);//正确次数不方便直接统计,故用总数减错误次数
else
correct=(i-wrong);
printf(" 本轮结束!正确次数:%d 错误次数:%d\n",correct,wrong);
if(i==times)//只有在最后一轮猜错的情况下才会满足此判断条件
printf(" 胜败乃兵家常事,大侠请重新来过!\n");
else
{
grade=(i+1.0)/len;
printf(" 你的成绩为%.3f\n",grade);
time_t t = time( 0 ); //获取造纪录时间
char tmp[64];//存储时间
strftime( tmp, sizeof(tmp), "%Y/%m/%d %X",localtime(&t) );
if(grade<board[2].grade||board[2].grade==0)//board排行榜的更新
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY |FOREGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE |FOREGROUND_RED);
printf(" 恭喜您进入大侠榜,请输入您的姓名:\n ");//输出变为红色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);//输出还原
if(grade<board[1].grade||board[1].grade==0)//个数较少,手工更新排行榜
if(grade<board[0].grade||board[0].grade==0)
{
board[2]=board[1];
board[1]=board[0];
board[0].grade=grade;
scanf("%s",&board[0].name);
strcpy(board[0].tmp,tmp);
}
else
{
board[2]=board[1];
board[1].grade=grade;
scanf("%s",&board[1].name);
strcpy(board[1].tmp,tmp);
}
else
{
board[2].grade=grade;
scanf("%s",&board[2].name);
strcpy(board[2].tmp,tmp);
}
board[0].mc=1;
board[1].mc=2;
board[2].mc=3;
}
}
printf(" 是否继续?(Y/N)\n ");
scanf("%s",&tt);
system("cls");//清屏
}
}