模拟猜单词游戏

模拟实现猜单词游戏,纯模拟,不涉及图形界面,注释很详细,虽然本人代码写得丑,但是希望可以给大家提供帮助

#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

模拟猜单词游戏的相关文章

编程成长日记————猜数字游戏

模拟猜数字游戏,提示用户每次应输入的数字范围. #include <stdio.h> #include <stdlib.h> //猜数字游戏 int main() { int i=0; int num =0,ret=0,choose=0; int min=1,max=100; flag: srand((unsigned)time(NULL));  ret=rand()%100+1; while(1) { printf("请输入%d~%d之间的数字:\n",min

模拟算法_掷骰子游戏&amp;&amp;猜数游戏

模拟算法是用随机函数来模拟自然界中发生的不可预测的情况,C语言中是用srand()和rand()函数来生成随机数. 先来介绍一下随机数的生成: 1.产生不定范围的随机数 函数原型:int rand() 产生一个介于0~RAD_MAX间的整数,其具体值与系统有关系.Linux下为2147483647.我们可以在include文件夹中的stdlib.h中可以看到(Linux在usr目录下,Windows在安装目录下) 1 #include<stdio.h> 2 #include<stdlib

【C++探索之旅】第一部分第十一课:小游戏,猜单词

内容简介 1.第一部分第十一课:小游戏,猜单词 2.第一部分第十二课预告:指针一出,谁与争锋 小练习 上一课<[C++探索之旅]第一部分第十课:文件读写,海阔凭鱼跃>中我们学习了读写文件的知识. 第一部分的课程也快接近尾声了,下一课我们会学习很重要的指针的知识.之后,我们就进入第二部分:面向对象编程了.哈哈哈,激动不? 目前为止,我们也学了不少内容:编译基本原理,IDE,变量,函数,条件语句,循环语句,引用,数组,文件读写,等等.你应该为自己感到自豪. 俗语说得好:实践是最好的老师.我们学了那

从一个猜单词的小程序开始---征服OOP的思维方式01

记得刚开始学Java的时候看到MOOC上有个老师写了一个猜数字的游戏,出于兴趣,小风就写了一个猜单词的小游戏来描述 OOP编程的思维方式.PS:OOP(Object Oriented Programing,面向对象程序设计)可以理解为计算机编程的一种架构. 好了,不BB了.开始了! 首先我们按照常规的面向过程的思维方式来分析这个程序.仅仅定义Demo一个类,该类中存放所有的逻辑代码 由于便于理解,程序先成员的位置上定义两个字符串数组english和chinese.即一个用来存储英文单词,一个用来

JAVA编程思想导论(猜字谜游戏1.0)

一. 引言 本章将借用一个简易的猜字谜游戏,向读者简单介绍JAVA面向对象的部分知识以及实现思路. 二. 面向对象思想导论 为了了解什么是面向对象,我们需要解决以下几点问题(如图2.1所示): 面向对象是什么? 面向对象的特征(或者说表现形式). 为什么要面向对象(它与面向过程的区别). 面向对象该怎么做? 众所周知,计算机的编程语言是始于对机器的模仿,即以代码的形式控制机器完成人们希望所能达到的任务或者效果,故而所有编程语言都提供了抽象机制. 而这种抽象机制实际上可以这么认为——人们所能够解决

猜字游戏源码

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Threading; namespace 制作

JavaScript一个猜数字游戏

效果图: 代码: <body> <script type="text/javascript"> window.onload = newgame; //页面载入的时候就开始一个新的游戏 window.onpopstate = popState; //处理历史记录相关事件 var state,ui; //全局变量,在newgame()方法中会对其初始化 function newgame( playagin ){ //开始一个新的猜数字游戏 //初始化一个包含需要的文

简单猜数游戏2

/*简单猜数游戏,magic number#2,版本*/#include<stdio.h>#include<stdlib.h> int main(void){ int magic; /*magic number*/ int guess; /*user's guess*/ printf("\nWelcome to the magic number game\n"); magic=rand(); /*产生随机数*/ printf("\nGuess the

简单猜数游戏1

/*简单猜数游戏,magic number#1,版本*/#include<stdio.h>#include<stdlib.h> int main(void){ int magic; /*magic number*/ int guess; /*user's guess*/ printf("\nWelcome to the magic number game\n"); magic=rand(); /*产生随机数*/ printf("\nGuess the