C语言小游戏相关问题,猜测两次后查询成绩排行榜,然后继续猜测并查询成绩排行榜,则排行榜显示为空

来源:互联网 发布:直接进入知乎 编辑:程序博客网 时间:2024/04/30 06:27
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<windows.h>
#define MAX 5
#define randDom(x)  (rand()%x) 
//先进行菜单设置,再对菜单内的方法进行实现 


//定义玩家结构 
typedef struct user{
char *name;    //玩家用户名 
double score;      //游戏所用时间 
}User;
 
static int countMax=10;


void shuru();//输入用户名 
void menu();  //主菜单 
void menu2();  //游戏记录菜单
void menu3();   //帮助菜单 
void rule();  //规则详情
void explain(); //说明详情 
void login();   //输入用户名 
void liulan();   //浏览排行榜
void paihangbang();  //排行榜菜单
void phbmenu();   //浏览排行榜菜单
void setRecord(char*,double);   //写入文件记录
void sortByName();    //储存到文件,排序后输出
int checkOK(int i); //检测用户输入的数和随机产生的数字是非符合标准 
int ready();   //产生随机数 
int startIn();  //用户输入数字 
int checkRight(int i,int n);//判断成功或失败
int setCountMax();  //设置猜测最大次数,默认为10 
double getTime(time_t ,time_t );   // 读取运行时间 
void endMenu();  //退出界面显示
void exitGame();   //退出游戏 
void choose();   //游戏结束后的选择
void startGame();   //开始游戏  
int startInFirst();   //第一次输入 
int repetition(int,int);
//#include"start.h"
//#include<stdio.h>


int ab=24;
 
int repetition(int i,int n){
int re=0;
int j=0;
int k=0;
int a[4];
int b[4];
a[0]=i/1000;
b[0]=n/1000;
a[1]=i%1000/100;
b[1]=n%1000/100;
a[2]=i%100/10;
b[2]=n%100/10;
a[3]=i%10;
b[3]=n%10;
for(j=0;j<3;j++){
for(k=0;k<3;k++){

if(a[k]==b[j])re++;
}
}
return re;
}


void login()   //输入用户名 
{
char a[20],*p=a;

printf("please input your ID:\n");
gets(p);
   //use.name=p;
 
}


void menu(){
system("cls");
char i;
printf(" -------1. 开始游戏-------\n\n");
printf(" -------2. 游戏记录-------\n\n");
printf(" -------3. 规则帮助-------\n\n");
printf(" -------4. 设置最大次数---\n\n");
printf(" -------5. 退出游戏-------\n\n");
printf(" (请按键选择,不需要回车确定)   \n\n");
//scanf("%c",&i);
i=getch();
switch(i){
case '1':startGame();
break;
case '2':menu2();
break;
case '3':menu3();
break;
case '4':countMax=setCountMax();
menu();
   break;
case '5':exitGame();
break;
default:printf("输入不规范\n"); 
Sleep(1000);  //延时1秒 
menu();
break;
};
}


void menu2()    //游戏记录菜单
{

int i;
system("cls");      //清屏
printf("****************************************\n");
printf("\t\t\t  1.成绩排行榜\n\n");
printf("\t\t\t  2.返回主菜单\n\n");
printf("\t\t\t   请按键选择,回车确定\n");
printf("****************************************\n");
scanf("%d",&i);
switch(i)    //功能函数选择
{
case 1:sortByName();break;
case 2:menu();break;    
default:printf("\tError!\n请重新输入:");
Sleep(2000);  //延时2秒 
menu2();
}
}


void menu3()
{ //system("cls");
    
char k;
system("cls");
printf("\t--------------------------------------------------------\n");
printf("\t--------------------------------------------------------\n");
printf("\t\t\t   1. 游戏规则\n\n");
printf("\t\t\t   2. 游戏说明\n\n");
printf("\t\t\t   3. 返回主菜单(任意键)\n\n");
//printf("\t\t\t   4. 重置排行榜\n\n");
printf("\t\t\t  请按键选择,不需要回车确定。\n\n");
printf("\t--------------------------------------------------------\n");
printf("\t--------------------------------------------------------\n");
//scanf("%c",&k);
k=getch();
switch(k){
case '1':rule();
break;
case '2':explain();
break;
case '3':menu();
break;
default:menu();
break;
}
//return;
}
void rule()
{ //system("cls");
char k;
system("cls");      
printf("游戏规则:\n");
printf("\t------------------------------------------------------------\n");
printf("\t------------------------------------------------------------\n");
printf("\t(1):游戏开始,系统随机产生一位4位数字。\n");
putchar('\n');
printf("\t(2):玩家输入所猜的数字,并按回车键提交。可以用空格隔开。\n");
putchar('\n');
printf("\t(3):系统将提交的数与其自动产生的数进行比较,输出结果。\n");
printf("  ");
putchar('\n');
printf("\t(4):游戏者有有限的X次数的猜测机会,在规定次数内完成,则游戏\n");
printf("\t    成功。否则,游戏失败。");
putchar('\n');
putchar('\n');
printf("\t(5):游戏排行榜中的名次,与玩家游戏成功所用时间有关。\n");
putchar('\n');
printf("\t------------------------------------------------------------\n");
printf("\t------------------------------------------------------------\n");
putchar('\n');
printf("\t返回主菜单,请按1(任意键)\t退出游戏,请按2\n");

k=getch();
switch(k)
{
case '1':menu();
break;
case '2':exitGame();
break;
default:menu();
break;
}
}


void explain()
{

char i;
system("cls");
printf("游戏说明:\n");
printf("\t-------------------------------------------------------------\n");
printf("\t-------------------------------------------------------------\n");
printf("\t(1):此游戏有计时功能。进入游戏后开始计时,猜正确后结束计时。\n");
printf("\t    游戏过程中不显示时间,只有成功猜出数字后才会提示所用时间。\n");
putchar('\n');
putchar('\n');
printf("\t(3):游戏中有浏览排行榜功能。\n");
printf("\t    可以按照所用时间的长短顺序来查看排行榜。\n");
printf("\t    其中只显示前五名玩家的成绩记录。\n");
putchar('\n');
printf("\t-------------------------------------------------------------\n");
printf("\t-------------------------------------------------------------\n");
printf("\n");
printf("\t返回主菜单,请按1(任意键)\t退出游戏,请按2\n");
//scanf("%d",&i);
i=getch();
switch(i)
{
case 1:menu();break;
case 2:exitGame();break;
default:menu();break; 
}
return;                     
}






void startGame()   //开始游戏 
{ char a[20],*p=a;
    int tag;
double t;
int input;   //C语言必须在开头定义变量 
time_t first;
time_t second;

int num;
//游戏准备,生成随机待猜测数
do{
num=ready();

}while(checkOK(num)==0);

//游戏开始,玩家开始输入 
input=startInFirst();//玩家输入数 

first=time(NULL);//计时开始 
while(checkOK(input)==0){
input=startIn();

};
tag=checkRight(input,ab);//判断成功或失败,并返回提示
second=time(NULL);//计时结束 
t=getTime(first,second);
printf("please input your ID:\n");
scanf("%s",p);

printf("用时:\n%lf秒",t);
//use.score=t;
if(tag){

setRecord(p,t);//将记录保存到文件 
}
//printf("用时:\n\t%lf秒",t);
  choose();//游戏结束后的选择
    
}
void choose()   //游戏结束后的选择
{
int i; 
printf("\n\n");
printf("   -------1. 再来一局-------\n\n");
printf(" -------2. 返回主菜单-------\n\n");
printf(" -------3. 退出游戏-------\n\n");
printf(" (请按键选择,回车确定)   \n\n");
scanf("%d",&i);
switch(i){
case 1:startGame();
break;
case 2:menu();
break;
case 3:exitGame();
break;
default:printf("输入不规范\n"); 
system("cls");
Sleep(2000);  //延时2秒 
choose();
break;
};
}


void exitGame()   //退出游戏 
{
char ch;
system("cls");
printf("是否退出游戏, yes(y)  or  no(n)\n");
//scanf("%c",&ch);
ch=getch();
if(ch=='y'){
endMenu();
exit(0);
}
else
menu();
}
void endMenu()  //退出界面显示 
{
system("cls");
printf("\n\n\n");
printf("\t-------------------------------------------------------------\n");
printf("\t-------------------------------------------------------------\n");
putchar('\n');
printf("\t******** **                         **                   **   \n");
printf("\t   **    **                         **                   **   \n");
printf("\t   **    **                         **                   **   \n");
printf("\t   **    ** ***      ***     ***    ** **     *****      **   \n");
printf("\t   **    ***    ** *     *  *    *  ***   *  *                \n");
printf("\t   **    **     ** *     *  *    *  ** ***    *****      *    \n");
printf("\t   **    **     ** *     *  *    *  ** *            *  *****  \n");
printf("\t   **    **     **   *** ** *    *  **   *    *****      *    \n");
putchar('\n');
    printf("\t-------------------------------------------------------------\n");
printf("\t-------------------------------------------------------------\n");
printf("\n\n\n");
getchar();
return;
}
double getTime(time_t first,time_t second)   // 读取运行时间 
{
double a;
a=(double)difftime(second,first);
return a;
}
int setCountMax()  //设置猜测最大次数,默认为10 
{
int m;
printf("输入最大次数\n");
scanf("%d",&m);
return m;
}
int checkRight(int i,int n){//判断玩家是否胜利 
int j=0;//为循环做准备变量 
int k=0;
int time;
int r=0;

int rightNum=0;
  int worryNum=0;
int a[4];
int b[4];
    for(time=1;time<countMax;time++){


if(i==n){
printf("恭喜获胜!\n");
return 1;
}
else{
a[0]=i/1000;
b[0]=n/1000;
a[1]=i%1000/100;
b[1]=n%1000/100;
a[2]=i%100/10;
b[2]=n%100/10;
a[3]=i%10;
b[3]=n%10;
for(j=0;j<4;j++){
if(a[j]==b[j])rightNum++;
for(k=0;k<4;k++){
if(a[j]==b[k])worryNum++;
   }
   }
   r=repetition(i,n);
worryNum=(worryNum-r);
printf("%d个数字正确,%d个数字位置不对\t你还有%d次机会!\n",rightNum,worryNum,countMax-time);
rightNum=0;
worryNum=0;
   printf("\n第%d次:\n",time+1);
scanf("%d",&i);
}
    // return 0;
}
    return 0;
}
int startInFirst()   //第一次输入 
{
int i;
printf("输入0~9999间的四位数\n");
printf("\n第1次:\n");
scanf("%d",&i);
return i;
}
int startIn()  //其余几次输入数字 
{
int i;
printf("输入0~9999间没有重复数字的四位数\n");
scanf("%d",&i);
return i;
}


int ready()   //产生随机数 

int i;
i=randDom(10000);
return i;
}
int checkOK(int i)  //检测用户输入的数和随机产生的数字是非符合标准 
{
/*int a[4];
int j=0;
a[0]=i/1000;
a[1]=i%1000/100;
a[2]=i%100/10;
a[3]=i%10;*/
if(i<0||i>9999){
//printf("输入不规范,需输入0~9999之间的数\n");

return 0;
}
else{
if(i>=0&&i<=9999){


for(j=0;j<3;j++){
if(a[j]==a[j+1]){
//error();
return 0;
}
}
for(j=0;j<2;j++){
if(a[j]==a[j+2]){
// error();
return 0;
}
}
for(j=0;j<1;j++){
if(a[j]==a[j+3]){
// error();
return 0;
}
}
}*/
else
return 1;
}
void setRecord(char*a,double t)   //写入文件记录 
{
User use;
use.name =a;
use.score=t;
FILE *fp;
fp=fopen("D:\\timerank.dat","ab");
if(fp==0)
{
printf("写入失败\n");
exit(1); 
}
fwrite(&use,sizeof(User),1,fp);
fclose(fp);
}
void sortByName()    //储存到文件,排序后输出
{
int choose;
int i,j;
int k=1;
User TempS;/* 定义进行操作时的临时结构体变量 */
User s[10]={};
int recNumber=0;
FILE *fp=NULL;
fp=fopen("D:\\timerank.dat","rb");

/* 将文件中要排序的信息存入结构体数组 */
while(fread(&s[recNumber],sizeof(User),1,fp)!=0)
{
recNumber++;
}

fclose(fp);

for(i=0;i<recNumber-1;i++)
{
for(j=0;j<recNumber-1-i;j++)
{
if((s[j].score>s[j+1].score))
{
/*strcpy(TempS.name,s[j].name);
strcpy(s[j].name,s[j+1].name);
strcpy(s[j+1].name,TempS.name);*/
TempS.name=s[j].name;
s[j].name=s[j+1].name;
s[j+1].name=TempS.name;
TempS.score=s[j].score;
s[j].score=s[j+1].score;
s[j+1].score=TempS.score;
}

}
/* 将排序好的记录写入文件 */

fp=fopen("D:\\timerank.dat","wb");
fwrite(s,sizeof(s),1,fp);
fclose(fp);
}


/* 显示排序后的文件 */
fp=fopen("D:\\timerank.dat","rb");
if(fp==NULL)
{
printf("文件错误\n");
exit(1);
}
printf("*排名\t玩家姓名\t所用时间\n");
while(fread(&TempS,sizeof(User),1,fp)!=0)
{ if(k<6){ 
printf("%d\t%s\t\t%lf\n",k++,TempS.name,TempS.score);

}
fclose(fp);
printf("\n\n");
//printf("   -------1. 返回上一级-------\n\n");
printf(" -------1. 返回主菜单-------\n\n");
printf(" -------2. 退出游戏(任意键退出)-------\n\n");
printf(" (请按键选择,回车确定)   \n\n");
scanf("%d",&choose);
switch(choose){
//case 1:startGame();
// break;
case 1:menu();
break;
case 2:exitGame();
break;
default:exitGame(); 

break;
};
}
int main()
{
menu();
return 0;
}
请问为什么会这样






C语言小游戏相关问题,猜测两次后查询成绩排行榜,然后继续猜测并查询成绩排行榜,则排行榜显示为空