模拟实现猜单词游戏,纯模拟,不涉及图形界面,注释很详细,虽然本人代码写得丑,但是希望可以给大家提供帮助
#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");//清屏 } }
时间: 2024-10-08 11:48:50