#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#include<windows.h>
//游戏规则
//1:电脑随机生成一个1-100之间的数字
//2:玩家进行猜数字 电脑会提示猜大了或者猜小了直到玩家猜对游戏结束
//3:游戏可以重复玩,即玩家玩完一把后可选择再玩一把或者是直接退出
void menu()
{
int input = 0;
printf("欢迎来到猜数字游戏\n");
printf("1:进入游戏\n");
printf("0:退出游戏\n");
printf("\n");
}
void game()
{int counter;
//1:实现1-100之间的随机数的生成
int random_num = rand()%100+1;//rand()是随机数生成函数需要搭配srand((unsigned)time(NULL))使用
//2:进入玩家猜数字环节
counter=0;
while (counter<10)
{
int guess = 0;//guess中储存的是玩家猜测的数字
printf("请输入猜测的数字:");
scanf("%d", &guess);
counter++;
if (guess < random_num)
{printf("猜小了\n");}
else if (guess > random_num)
{printf("猜大了\n");}
else if(guess==random_num)
{
printf("恭喜你猜对了\n");
break;//为了防止死循环,若猜对了应打破循环
}
}
}
typedef struct The_users //typedef 可以定义结构体别名
{
char id[11]; //账号
char pwd[20]; //密码
char name[15];//姓名为字符串
char sex; //性别为单个字符
long phone; //电话号码为长整型
}users;
/创建储存用户账号密码的文件/
void Create_File()
{
FILE *fp;
if ((fp = fopen("users.txt","rb"))==NULL) /如果此文件不存在/
{
if ((fp = fopen("users.txt","wb+"))==NULL)
{
printf("无法建立文件!\n");
exit(0);
}
}
}
/注册账号/
void registers() //按结构体的大小,一次写入或者读入1个结构体大小
{
users a,b;//结构体 The_users 重命名定义
FILE *fp;
char temp[20];
int count = 0;
printf("欢迎来到注册界面!\n");
Sleep(1000);
fp = fopen("users.txt","r");
fread(&b, sizeof(struct The_users), 1, fp); //读入一个结构体字符块 到b
printf("请输入账号\n");
scanf("%s",&a.id);
while (1)
{
if (strcmp(a.id, b.id)) /*如果两串不相等*/
{
if (!feof(fp)) /*如果未到文件尾*/
{
fread(&b, sizeof(struct The_users), 1, fp);
}
else
break;
}
else
{
printf("此用户名已存在!请重新注册!\n");
Sleep(1000);
fclose(fp);
return;
}
}
printf("请输入姓名:\n");
scanf("%s",&a.name);
printf("请输入性别(f(女)/m(男)):\n");
scanf(" %c",&a.sex);
do{
if(a.sex != 'f' && a.sex != 'm'){
printf("性别输入错误!请重新输入!\n");
scanf("%c",&a.sex);
}
}while(a.sex != 'f' && a.sex != 'm');
getchar();
printf("请输入电话号码:\n");
scanf("%ld",&a.phone);
printf("请输入密码\n");
scanf(" %s",&a.pwd);
printf("请确认密码\n");
scanf(" %s",&temp);
do{
if(!strcmp(a.pwd,temp)){
fp = fopen("users.txt","a");
fwrite(&a, sizeof(struct The_users), 1, fp);
printf("账号注册成功,请登录!\n");
Sleep(500);
fclose(fp);
return;
}else{
printf("两次密码不匹配!请重新输入!\n");
scanf("%s",&a.pwd);
printf("请确认密码\n");
scanf("%s",&temp);
}
}while(1);
}
/登录系统/
void Input_login()
{
users a,b;//定义结构体The_users别名
FILE *fp;
printf("欢迎来到登录界面!\n");
Sleep(1000);
fp = fopen("users.txt","r");
fread(&b, sizeof(struct The_users), 1, fp); //读入一个结构体字符块 写入b
printf("请输入账号\n");
scanf("%s",&a.id);
while (1)
{
if (strcmp(a.id, b.id)==0) //如果有此用户名
{
break;
}
else
{
if (!feof(fp)) //如果文件没有读完
{
fread(&b, sizeof(struct The_users), 1, fp);
}
else
{
printf("此用户名不存在,请重新输入!\n");
Sleep(500);
fclose(fp);
return;
}
}
}
printf("请输入密码\n");
scanf("%s",&a.pwd);
do{
if (strcmp(a.pwd, b.pwd)==0) /*如果密码匹配*/
{
fclose(fp);
printf("登录成功,欢迎使用!");
Sleep(500);
return;
}
else
{ printf("密码不正确!请重新输入密码\n");
scanf("%s",&a.pwd);
}
}while(strcmp(a.pwd, b.pwd)==0);
}
//如果把此函数写在main函数后面,记得在main函数前面某行处,加上函数声明!
void getHighScore(int * highscore)
{
FILE * fp = NULL; //文件指针,指向成功打开的文件
//打开文件,以只读的方式r
fp = fopen("highscore.txt","r");
//如果文件不存在,打开文件,以写入的方式w
if (fp == NULL)
{
fp = fopen("highscore.txt","w");
fprintf(fp, "%-10d", *highscore);
}
else
fscanf(fp, "%10d", highscore);
//关闭文件
fclose(fp);
}
//如果把此函数写在main函数后面,记得在main函数前面某行处,加上函数声明!
void storeHighScore(int highscore)
{
FILE * fp = NULL;
fp = fopen("highscore.txt","w");
fprintf(fp, "%-10d", highscore);
fclose(fp);
}
int main()
{
srand((unsigned)time(NULL));
int input = 0;
do
{
menu();
printf("请输入你的选择:");
scanf("%d",&input);
if (input == 1)
{printf("玩家一\n");
printf(" 注册账号\n");
Create_File();
registers();
printf(" 登录游戏\n");
Input_login ();
printf("仅允许猜十次\n");
game();
printf("玩家二\n");
printf(" 注册账号\n");
Create_File();
registers();
printf(" 登录游戏\n");
Input_login ();
printf("仅允许猜十次\n");
game();}
else if (input == 0)
{
printf("游戏已经退出");
break;
}
else
{
printf("您输入的是无效指令,请重新输入\n");
}
} while (input != 0);
int highscore = 0; //存储最高分
int score = 0; //当前次,游戏得分
//获取历史最高分
getHighScore(&highscore);
printf("Original high score: %d\n", highscore);
//假装:游戏中,追踪最高分
printf("->Start game!\n");
score = 99;
if (score > highscore)
highscore = score;
printf("->SJL, you win!\n");
//存入当前最高分
printf("New high score: %d\n", highscore);
storeHighScore(highscore);
return 0;
}