c语言编写一个猜价格游戏,答案满意再加50分!!!!
游戏规则如下:游戏软件随机产生四位的数字(必须是整数[1000,9999])的价格,但不显示,给用户提供输入提示符,让用户猜测这个价格的大小。如果价格正确,则猜价格成功。...
游戏规则如下:
游戏软件随机产生四位的数字(必须是整数[1000,9999])的价格,但不显示,给用户提供输入提示符,让用户猜测这个价格的大小。如果价格正确,则猜价格成功。
玩家有10次猜价格的机会,如果在10次之内仍末猜出正确的价格,则提示用户游戏失败。
一旦玩家在10次的次数限制内猜出正确的价格,则赢得游戏。
当玩家赢得游戏后,会与排行榜中的前五名玩家的游戏记录比较,如果排名能够进入前五名,则更新排行榜,使当前玩家成为入榜选手。
记分规则:猜价格所用次数即为分数,所以分数越少证明玩家水平越高,排行榜中也是排列分数最少的前五名选手。
(2) 本游戏软件需要实现以下一些基本功能。
在猜价格的过程中,如果玩家所给价格不是正确价格,软件需给出其提供价格大于正确价格或小于正确价格的提示
刷新排行榜:当玩家成功完成一轮猜价格游戏后,可通过和排行榜中相应记录的比较判断玩家是否可以进入排行榜,进入排行榜的资格游戏成绩在前五名的玩家。
查看排行榜:玩家可以查看当前排行榜中的排名顺序,从而确定自己的游戏目标。排行榜的查看按一定顺序显示给用户,便于查看。
清除排行榜:玩家可以选择清除排行榜功能,使得排行榜上的玩家姓名和玩家游戏记录从系统中清除,只留下系统默认的玩家名(player)和系统默认记录10次。 展开
游戏软件随机产生四位的数字(必须是整数[1000,9999])的价格,但不显示,给用户提供输入提示符,让用户猜测这个价格的大小。如果价格正确,则猜价格成功。
玩家有10次猜价格的机会,如果在10次之内仍末猜出正确的价格,则提示用户游戏失败。
一旦玩家在10次的次数限制内猜出正确的价格,则赢得游戏。
当玩家赢得游戏后,会与排行榜中的前五名玩家的游戏记录比较,如果排名能够进入前五名,则更新排行榜,使当前玩家成为入榜选手。
记分规则:猜价格所用次数即为分数,所以分数越少证明玩家水平越高,排行榜中也是排列分数最少的前五名选手。
(2) 本游戏软件需要实现以下一些基本功能。
在猜价格的过程中,如果玩家所给价格不是正确价格,软件需给出其提供价格大于正确价格或小于正确价格的提示
刷新排行榜:当玩家成功完成一轮猜价格游戏后,可通过和排行榜中相应记录的比较判断玩家是否可以进入排行榜,进入排行榜的资格游戏成绩在前五名的玩家。
查看排行榜:玩家可以查看当前排行榜中的排名顺序,从而确定自己的游戏目标。排行榜的查看按一定顺序显示给用户,便于查看。
清除排行榜:玩家可以选择清除排行榜功能,使得排行榜上的玩家姓名和玩家游戏记录从系统中清除,只留下系统默认的玩家名(player)和系统默认记录10次。 展开
8个回答
展开全部
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
/*不做错误处理,
不做程序结构考虑
只是一个破烂儿程序而已
VC2008和Dev C++应该能通过
VC6估计需要改改*/
int main()
{
typedef struct {char name[100]; int score;}Node, *PNode;
Node List[5] = {0};
Node node = {0};
while(1)
{
printf("输入名字:");
scanf("%s", node.name);
srand((unsigned int)time(NULL));
int num= rand()%8999 + 1000;
int guess = 0, guessed = 0;
while (guess<10)
{
guess++;
printf("你猜是:");
scanf("%d", &guessed);
if (guessed==num)
{
printf("中了\n");
node.score = guess;
for (int i=0; i<5; i++)
{
if (!List[i].score)
{
memcpy(&List[i], &node, sizeof(node));
break;
}
if (List[i].score>guess)
{
for (int j=4; j>i; j--)
{
memcpy(&List[j], &List[j-1], sizeof(node));
}
memcpy(&List[i], &node, sizeof(node));
break;
}
}
break;
}
if (guessed>num)
{
printf("大了\n");
}
else
{
printf("小了\n");
}
}
for (int i=0; i<5; i++)
{
printf("%s->得分<-%d\n", List[i].name, List[i].score);
}
printf("清空排行榜?(输入0清空):");
int clearit = 1;
scanf("%d", &clearit);
if (!clearit)
{
memset(&List[0], 0, sizeof(node)*5);
}
}
return 0;
}
#include <stdlib.h>
#include <time.h>
#include <string.h>
/*不做错误处理,
不做程序结构考虑
只是一个破烂儿程序而已
VC2008和Dev C++应该能通过
VC6估计需要改改*/
int main()
{
typedef struct {char name[100]; int score;}Node, *PNode;
Node List[5] = {0};
Node node = {0};
while(1)
{
printf("输入名字:");
scanf("%s", node.name);
srand((unsigned int)time(NULL));
int num= rand()%8999 + 1000;
int guess = 0, guessed = 0;
while (guess<10)
{
guess++;
printf("你猜是:");
scanf("%d", &guessed);
if (guessed==num)
{
printf("中了\n");
node.score = guess;
for (int i=0; i<5; i++)
{
if (!List[i].score)
{
memcpy(&List[i], &node, sizeof(node));
break;
}
if (List[i].score>guess)
{
for (int j=4; j>i; j--)
{
memcpy(&List[j], &List[j-1], sizeof(node));
}
memcpy(&List[i], &node, sizeof(node));
break;
}
}
break;
}
if (guessed>num)
{
printf("大了\n");
}
else
{
printf("小了\n");
}
}
for (int i=0; i<5; i++)
{
printf("%s->得分<-%d\n", List[i].name, List[i].score);
}
printf("清空排行榜?(输入0清空):");
int clearit = 1;
scanf("%d", &clearit);
if (!clearit)
{
memset(&List[0], 0, sizeof(node)*5);
}
}
return 0;
}
追问
这个我去试试,有用就给分
追答
晕...楼下的真有时间
就是实现复杂了点儿
再说了 都构造函数了
既然 C++
还那么麻烦自己构造什么数据结构
直接 vector sort find 不就解决了么....晕...
展开全部
你好
我觉得这个游戏本身不是什么难题,但是我现在不会有那么多时间耗在这上面来帮你写游戏,那样我的一小半天又没有了。百度的知道平台是用来大家相互交流问题的,你有难题如果我能解决我会很乐意帮你解决的,但不是像你这样自己什么都不管,直接把你的要求发上来,然后等别人帮你解答,这不就完全的伸手党一个吗?要是你在解决这个游戏的过程中有什么问题我会很乐意帮你的,但是对于完全的伸手党,还是自己劝你自己多动脑吧!
我觉得这个游戏本身不是什么难题,但是我现在不会有那么多时间耗在这上面来帮你写游戏,那样我的一小半天又没有了。百度的知道平台是用来大家相互交流问题的,你有难题如果我能解决我会很乐意帮你解决的,但不是像你这样自己什么都不管,直接把你的要求发上来,然后等别人帮你解答,这不就完全的伸手党一个吗?要是你在解决这个游戏的过程中有什么问题我会很乐意帮你的,但是对于完全的伸手党,还是自己劝你自己多动脑吧!
追问
这个游戏的前半部分不难,我关键是不知道关于排行榜的保存,更新,清除以及查看和两部分之间怎么连接
追答
c语言中的fopen()和fwrite()函数 你可以用来存储数据 之后还可以用来读出存储的数据,既然能写出程序的前半部分那么看下这两个文件操作的函数应该是能很快应用出来的,你可以试试!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
/*
实现了题目的所有功能。
将猜价格游戏中的【玩家信息】保存在文件:player.txt 中(开始这个文件可以不存在)
内存中用【链表】的形式保存【玩家信息】
将猜价格游戏中的【游戏信息】保存在文件:game.txt 中(开始这个文件可以不存在)
内存中用【链表】的形式保存【游戏信息】
有简单的【菜单界面】。
有基本的【错误处理】。
有友好的【错误提示】。
完善了【排名法则】(见 sortGame 函数)
所有猜价格游戏【相关的参数】(比如价格范围,显示前多少名等)都被定义成全局的常量,便于修改
开始玩猜价格游戏需要【注册一个账号】,见主菜单的[3]。
账号是唯一的,不能被多次注册。
注册以后,【每次程序关闭后重新打开程序,账号依然有效】(player.txt 文件不能被破坏)。
所有玩家【玩猜价格游戏的全过程】都会被记录,
包括
1)开始时间,
2)结束时间,
3)要猜中的价格,
4)玩家猜的次数,
5)每次猜的价格,
6)最终猜的结果(猜出或未猜出)。
以后,【每次程序关闭后重新打开程序,猜价格记录依然有效】(game.txt 文件不能被破坏)
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
// 格式化时间函数
char __format_time__[40];
char* getFormatTime(long t)
{
strftime(__format_time__,sizeof(__format_time__)/sizeof(char),"%Y.%m.%d %H:%M:%S",gmtime(&t));
return __format_time__;
}
// 保存玩家信息的文件
char PLAYER_DATA_FILE_NAME[] = "player.txt";
// 系统默认的用户名
const char PALYER_DEFAULT_SYSTEM_NAME[] = "player";
// 用户名最大长度
const int PLAYER_MAX_NAME_LENGTH = 20;
// 密码最大长度
const int PLAYER_MAX_PASS_LENGTH = 20;
// 玩家信息
struct Player
{
// 唯一的账号名称
char name[PLAYER_MAX_NAME_LENGTH+1];
// 登陆密码
char pass[PLAYER_MAX_PASS_LENGTH+1];
struct Player *next;
Player()
{
strcpy(name,"");
strcpy(pass,"");
next = NULL;
}
};
// 全局变量:游戏玩家链表
struct Player* _players = NULL;
// 全局变量:当前登陆的游戏玩家
struct Player _loginPlayer;
// 保存游戏信息的文件
char GAME_DATA_FILE_NAME[] = "game.txt";
// 排行榜上记录保存个数
const int GAME_MAX_TOP_PLAYERS = 5;
// 猜价格最多尝试次数
const int GAME_MAX_TRY_TIME = 3;
// 猜价格的最小值
const int GAME_MIN_PRICE = 1000;
// 猜价格的最大值
const int GAME_MAX_PRICE = 9999;
// 一局游戏的信息
struct Game
{
// 游戏开始时间
long startTime;
// 游戏结束时间
long endTime;
// 玩家账号
char playerName[PLAYER_MAX_NAME_LENGTH+1];
// 真实价格
int realPrice;
// 是否成功猜出
int isSuccess;
// 玩家一共猜的次数
int guessTime;
// 玩家猜了 guessTime 次,每次才的价格
int guessPrice[GAME_MAX_TRY_TIME];
struct Game *next;
Game()
{
startTime = time(NULL);
strcpy(playerName,"");
srand(time(NULL));
isSuccess = 0;
realPrice = rand()%(GAME_MAX_PRICE-GAME_MIN_PRICE)+GAME_MIN_PRICE;
guessTime = 0;
next = NULL;
}
};
// 全局变量:猜价格游戏链表
struct Game* _games = NULL;
// 初始化 游戏玩家链表
void initPlayer()
{
FILE * playerFile = fopen(PLAYER_DATA_FILE_NAME,"r");
struct Player *p,tempPlayer;
if(playerFile)
{
while(fscanf(playerFile,"%s%s",tempPlayer.name,tempPlayer.pass)!=EOF)
{
if(_players == NULL)
{
_players = (struct Player*)malloc(sizeof(struct Player));
*_players = tempPlayer;
p = _players;
}
else
{
p->next = (struct Player*)malloc(sizeof(struct Player));
*p->next = tempPlayer;
p = p->next;
}
}
fclose(playerFile);
}
}
// 保存 游戏玩家链表
void savePlayer()
{
FILE * playerFile = fopen(PLAYER_DATA_FILE_NAME,"w");
struct Player *p;
if(playerFile)
{
p = _players;
while(p)
{
fprintf(playerFile,"%s %s\n",p->name,p->pass);
p = p->next;
}
fclose(playerFile);
}
}
// 初始化 猜价格游戏链表
void initGame()
{
FILE * gameFile = fopen(GAME_DATA_FILE_NAME,"r");
struct Game *p,tempGame;
int i;
if(gameFile)
{
while(
fscanf(gameFile,"%ld%ld%s%d%d%d",
&tempGame.startTime,
&tempGame.endTime,
&tempGame.playerName,
&tempGame.realPrice,
&tempGame.isSuccess,
&tempGame.guessTime
)!=EOF)
{
for(i=0;i<tempGame.guessTime;i++)
{
fscanf(gameFile,"%d",&tempGame.guessPrice[i]);
}
if(_games == NULL)
{
_games = (struct Game*)malloc(sizeof(struct Game));
*_games = tempGame;
p = _games;
}
else
{
p->next = (struct Game*)malloc(sizeof(struct Game));
*p->next = tempGame;
p = p->next;
}
}
fclose(gameFile);
}
}
// 保存 猜价格游戏链表
void saveGame()
{
FILE * gameFile = fopen(GAME_DATA_FILE_NAME,"w");
struct Game *p;
int i;
if(gameFile)
{
p = _games;
while(p)
{
fprintf(gameFile,"%ld %ld %s %d %d %d",
p->startTime,
p->endTime,
p->playerName,
p->realPrice,
p->isSuccess,
p->guessTime
);
for(i=0;i<p->guessTime;i++)
{
fprintf(gameFile," %d",p->guessPrice[i]);
}
fprintf(gameFile,"\n");
p = p->next;
}
fclose(gameFile);
}
}
// 猜价格游戏主菜单
int printMainMenu()
{
char strChoice[100];
int intChoice;
do
{
printf("\n*******************************************\n");
printf("****主菜单\n");
printf("*******************************************\n");
printf("****1)查看排行榜\n");
printf("****2)清除排行榜\n");
printf("****3)登录账号开始游戏\n");
printf("****4)申请账号开始游戏\n");
printf("****5)退出游戏\n");
printf("*******************************************\n");
scanf("%s",strChoice);
intChoice = atoi(strChoice);
if(intChoice<1 || intChoice >5)
{
printf("****命令错误!请重新输入命令!");
}
}
while(intChoice<1 || intChoice >5);
return intChoice;
}
/*
对已有的游戏记录根据【猜价格的次数】递增排序
如果【猜价格的次数】相等,
根据【使用的时间】递增排序,
如果【使用的时间】相等,
根据【开始的时间】递增排序,
*/
void sortGames()
{
struct Game *p , *q , tempGame1,tempGame2;
p = _games;
while(p)
{
q = p->next;
while(q)
{
if
(
p->guessTime > q->guessTime ||
(p->guessTime == q->guessTime && (p->endTime - p->startTime) > (q->endTime - q->startTime)) ||
(p->guessTime == q->guessTime && (p->endTime - p->startTime) == (q->endTime - q->startTime) && p->startTime > q->startTime)
)
{
tempGame1 = *p;
tempGame2 = *q;
// 注意交换的时候,next 指针不能交换
*p = tempGame2;
p->next = tempGame1.next;
// 注意交换的时候,next 指针不能交换
*q = tempGame1;
q->next = tempGame2.next;
}
q = q->next;
}
p = p->next;
}
}
// 查看排行榜
void printRankList()
{
int counter = 0;
struct Game *p;
printf("\n*******************************************\n");
printf("****玩家排名\n");
printf("*******************************************\n");
// 没有记录
if(!_games)
{
printf("****排名:%4d 用户:%10s(default) 用了%4d次\n",1,PALYER_DEFAULT_SYSTEM_NAME,GAME_MAX_TRY_TIME);
}
else
{
// 排序
sortGames();
p = _games;
counter = 0;
// 查看前 GAME_MAX_TOP_PLAYERS 名(如果有那么多),并且成功猜出价格的
while(p && counter < GAME_MAX_TOP_PLAYERS && p->isSuccess)
{
counter ++;
printf("****排名:%4d 用户:%10s 用了%4d次\n",counter,p->playerName,p->guessTime);
printf(" 开始时间:%s\n",getFormatTime(p->startTime));
printf(" 结束时间:%s\n\n",getFormatTime(p->endTime));
p = p->next;
}
}
printf("*******************************************\n");
}
// 清除排行榜
void clearRankList()
{
struct Game *p = _games , *q;
while(p)
{
q = p->next;
free(p);
p=q;
}
_games = NULL;
printf("\n*******************************************\n");
printf("****清空排名榜\n");
printf("*******************************************\n");
printf("****排名榜已经清空!\n");
printf("*******************************************\n");
}
// 猜价格游戏用户登陆菜单
int printLoginMenu()
{
struct Player *p;
char name[PLAYER_MAX_NAME_LENGTH+1];
char pass[PLAYER_MAX_PASS_LENGTH+1];
int i;
char ch;
printf("\n*******************************************\n");
printf("****登录菜单\n");
printf("*******************************************\n");
printf("****输入用户名称:");
scanf("%s",name);
printf("****输入用户密码:");
scanf("%s",pass);
/*
i=0;
while((ch=getch())!='\n')
{
pass[i++]=ch;
}
pass[i]='\n';
*/
p=_players;
while(p)
{
if(strcmp(p->name,name) == 0 && strcmp(p->pass,pass) == 0)
{
break;
}
else
{
p = p->next;
}
}
if(p)
{
printf("****登陆成功!\n");
printf("*******************************************\n");
strcpy(_loginPlayer.name,name);
strcpy(_loginPlayer.pass,pass);
return 1;
}
else
{
printf("****登陆失败!用户名不存在或者密码错误!\n");
printf("*******************************************\n");
return 0;
}
}
// 猜价格游戏用户注册菜单
int printRegisterMenu()
{
struct Player *p;
char name[PLAYER_MAX_NAME_LENGTH+1];
char pass[PLAYER_MAX_PASS_LENGTH+1];
int i;
char ch;
printf("\n*******************************************\n");
printf("****注册菜单\n");
printf("*******************************************\n");
do
{
printf("****输入要注册的用户名称:");
scanf("%s",name);
if(strcmp(PALYER_DEFAULT_SYSTEM_NAME,name) == 0)
{
printf("****%s 是系统默认的用户名,不能被注册!\n",PALYER_DEFAULT_SYSTEM_NAME);
}
else if(strlen(name)==0)
{
printf("****用户名不能为空!\n");
}
}
while(strlen(name)==0 || strcmp(PALYER_DEFAULT_SYSTEM_NAME,name)== 0 );
printf("****输入要注册的用户密码:");
scanf("%s",pass);
/*
i=0;
while((ch=getch())!='\n')
{
pass[i++]=ch;
}
pass[i]='\n';
*/
p=_players;
while(p)
{
if(strcmp(p->name,name) == 0 && strcmp(p->pass,pass) == 0)
{
break;
}
else
{
p = p->next;
}
}
if(!p)
{
printf("****注册成功!\n");
printf("*******************************************\n");
// 更新当前登陆的用户
strcpy(_loginPlayer.name,name);
strcpy(_loginPlayer.pass,pass);
// 添加一个新的玩家到玩家列表
p = (struct Player*)malloc(sizeof(struct Player));
*p = _loginPlayer;
p->next = _players;
_players = p;
return 1;
}
else
{
printf("****注册失败!该用户名已经被注册!\n");
printf("*******************************************\n");
return 0;
}
}
void play()
{
struct Game newGame, *p;
char strChoice[100];
int intChoice;
int guessPrice;
// 当前游戏的玩家为当前登陆的玩家
strcpy(newGame.playerName,_loginPlayer.name);
printf("\n*******************************************\n");
printf("****猜价格菜单\n");
printf("*******************************************\n");
printf("****您好:%s\n",_loginPlayer.name);
// 下面这句 printf 可以根据需要注释掉
printf("****真实价格为:%d\n",newGame.realPrice);
printf("*******************************************\n");
while(newGame.guessTime < GAME_MAX_TRY_TIME)
{
printf("[第%2d次]输入您猜的价格:",newGame.guessTime+1);
scanf("%d",&guessPrice);
newGame.guessPrice[newGame.guessTime++] = guessPrice;
if(guessPrice == newGame.realPrice)
{
newGame.isSuccess = 1;
break;
}
else if(guessPrice < newGame.realPrice)
{
printf("****低了!\n");
}
else
{
printf("****高了!\n");
}
}
// 记录猜价格游戏结束时间
newGame.endTime = time(NULL);
// 判断猜价格结果
if(newGame.isSuccess == 1)
{
printf("****恭喜你猜出了真实价格!\n");
}
else
{
printf("****很遗憾,您没有猜出真实价格!真实价格为:%6d!\n",newGame.realPrice);
}
// 记录将本轮猜价格游戏
p = (struct Game*)malloc(sizeof(struct Game));
*p = newGame;
p->next = _games;
_games = p;
printf("*******************************************\n");
do
{
printf("****1)继续\n");
printf("****2)返回\n");
printf("*******************************************\n");
scanf("%s",&strChoice);
intChoice = atoi(strChoice);
if(intChoice<1 || intChoice>2)
{
printf("****命令错误!请重新输入命令!\n");
}
}
while(intChoice<1 || intChoice>2);
// 继续下一轮
if(intChoice==1)
{
play();
}
// 返回之前注销登录的账号
else if(intChoice==2)
{
strcpy(_loginPlayer.name,"");
strcpy(_loginPlayer.pass,"");
}
}
void startGame()
{
int choice ;
initPlayer();
initGame();
while(1)
{
choice = printMainMenu();
switch(choice)
{
// 打印排行榜
case 1:
{
printRankList();
break;
}
// 清空排行榜
case 2:
{
clearRankList();
break;
}
// 用户登陆并开始游戏
case 3:
{
if(printLoginMenu())
{
play();
}
break;
}
// 用户注册并开始游戏
case 4:
{
if(printRegisterMenu())
{
play();
}
break;
}
// 用户退出游戏
case 5:
{
savePlayer();
saveGame();
exit(0);
break;
}
default:
{
printf("****命令错误!请重新输入命令!\n");
break;
}
}
}
}
int main(int argc, char *argv[])
{
startGame();
return 0;
}
实现了题目的所有功能。
将猜价格游戏中的【玩家信息】保存在文件:player.txt 中(开始这个文件可以不存在)
内存中用【链表】的形式保存【玩家信息】
将猜价格游戏中的【游戏信息】保存在文件:game.txt 中(开始这个文件可以不存在)
内存中用【链表】的形式保存【游戏信息】
有简单的【菜单界面】。
有基本的【错误处理】。
有友好的【错误提示】。
完善了【排名法则】(见 sortGame 函数)
所有猜价格游戏【相关的参数】(比如价格范围,显示前多少名等)都被定义成全局的常量,便于修改
开始玩猜价格游戏需要【注册一个账号】,见主菜单的[3]。
账号是唯一的,不能被多次注册。
注册以后,【每次程序关闭后重新打开程序,账号依然有效】(player.txt 文件不能被破坏)。
所有玩家【玩猜价格游戏的全过程】都会被记录,
包括
1)开始时间,
2)结束时间,
3)要猜中的价格,
4)玩家猜的次数,
5)每次猜的价格,
6)最终猜的结果(猜出或未猜出)。
以后,【每次程序关闭后重新打开程序,猜价格记录依然有效】(game.txt 文件不能被破坏)
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
// 格式化时间函数
char __format_time__[40];
char* getFormatTime(long t)
{
strftime(__format_time__,sizeof(__format_time__)/sizeof(char),"%Y.%m.%d %H:%M:%S",gmtime(&t));
return __format_time__;
}
// 保存玩家信息的文件
char PLAYER_DATA_FILE_NAME[] = "player.txt";
// 系统默认的用户名
const char PALYER_DEFAULT_SYSTEM_NAME[] = "player";
// 用户名最大长度
const int PLAYER_MAX_NAME_LENGTH = 20;
// 密码最大长度
const int PLAYER_MAX_PASS_LENGTH = 20;
// 玩家信息
struct Player
{
// 唯一的账号名称
char name[PLAYER_MAX_NAME_LENGTH+1];
// 登陆密码
char pass[PLAYER_MAX_PASS_LENGTH+1];
struct Player *next;
Player()
{
strcpy(name,"");
strcpy(pass,"");
next = NULL;
}
};
// 全局变量:游戏玩家链表
struct Player* _players = NULL;
// 全局变量:当前登陆的游戏玩家
struct Player _loginPlayer;
// 保存游戏信息的文件
char GAME_DATA_FILE_NAME[] = "game.txt";
// 排行榜上记录保存个数
const int GAME_MAX_TOP_PLAYERS = 5;
// 猜价格最多尝试次数
const int GAME_MAX_TRY_TIME = 3;
// 猜价格的最小值
const int GAME_MIN_PRICE = 1000;
// 猜价格的最大值
const int GAME_MAX_PRICE = 9999;
// 一局游戏的信息
struct Game
{
// 游戏开始时间
long startTime;
// 游戏结束时间
long endTime;
// 玩家账号
char playerName[PLAYER_MAX_NAME_LENGTH+1];
// 真实价格
int realPrice;
// 是否成功猜出
int isSuccess;
// 玩家一共猜的次数
int guessTime;
// 玩家猜了 guessTime 次,每次才的价格
int guessPrice[GAME_MAX_TRY_TIME];
struct Game *next;
Game()
{
startTime = time(NULL);
strcpy(playerName,"");
srand(time(NULL));
isSuccess = 0;
realPrice = rand()%(GAME_MAX_PRICE-GAME_MIN_PRICE)+GAME_MIN_PRICE;
guessTime = 0;
next = NULL;
}
};
// 全局变量:猜价格游戏链表
struct Game* _games = NULL;
// 初始化 游戏玩家链表
void initPlayer()
{
FILE * playerFile = fopen(PLAYER_DATA_FILE_NAME,"r");
struct Player *p,tempPlayer;
if(playerFile)
{
while(fscanf(playerFile,"%s%s",tempPlayer.name,tempPlayer.pass)!=EOF)
{
if(_players == NULL)
{
_players = (struct Player*)malloc(sizeof(struct Player));
*_players = tempPlayer;
p = _players;
}
else
{
p->next = (struct Player*)malloc(sizeof(struct Player));
*p->next = tempPlayer;
p = p->next;
}
}
fclose(playerFile);
}
}
// 保存 游戏玩家链表
void savePlayer()
{
FILE * playerFile = fopen(PLAYER_DATA_FILE_NAME,"w");
struct Player *p;
if(playerFile)
{
p = _players;
while(p)
{
fprintf(playerFile,"%s %s\n",p->name,p->pass);
p = p->next;
}
fclose(playerFile);
}
}
// 初始化 猜价格游戏链表
void initGame()
{
FILE * gameFile = fopen(GAME_DATA_FILE_NAME,"r");
struct Game *p,tempGame;
int i;
if(gameFile)
{
while(
fscanf(gameFile,"%ld%ld%s%d%d%d",
&tempGame.startTime,
&tempGame.endTime,
&tempGame.playerName,
&tempGame.realPrice,
&tempGame.isSuccess,
&tempGame.guessTime
)!=EOF)
{
for(i=0;i<tempGame.guessTime;i++)
{
fscanf(gameFile,"%d",&tempGame.guessPrice[i]);
}
if(_games == NULL)
{
_games = (struct Game*)malloc(sizeof(struct Game));
*_games = tempGame;
p = _games;
}
else
{
p->next = (struct Game*)malloc(sizeof(struct Game));
*p->next = tempGame;
p = p->next;
}
}
fclose(gameFile);
}
}
// 保存 猜价格游戏链表
void saveGame()
{
FILE * gameFile = fopen(GAME_DATA_FILE_NAME,"w");
struct Game *p;
int i;
if(gameFile)
{
p = _games;
while(p)
{
fprintf(gameFile,"%ld %ld %s %d %d %d",
p->startTime,
p->endTime,
p->playerName,
p->realPrice,
p->isSuccess,
p->guessTime
);
for(i=0;i<p->guessTime;i++)
{
fprintf(gameFile," %d",p->guessPrice[i]);
}
fprintf(gameFile,"\n");
p = p->next;
}
fclose(gameFile);
}
}
// 猜价格游戏主菜单
int printMainMenu()
{
char strChoice[100];
int intChoice;
do
{
printf("\n*******************************************\n");
printf("****主菜单\n");
printf("*******************************************\n");
printf("****1)查看排行榜\n");
printf("****2)清除排行榜\n");
printf("****3)登录账号开始游戏\n");
printf("****4)申请账号开始游戏\n");
printf("****5)退出游戏\n");
printf("*******************************************\n");
scanf("%s",strChoice);
intChoice = atoi(strChoice);
if(intChoice<1 || intChoice >5)
{
printf("****命令错误!请重新输入命令!");
}
}
while(intChoice<1 || intChoice >5);
return intChoice;
}
/*
对已有的游戏记录根据【猜价格的次数】递增排序
如果【猜价格的次数】相等,
根据【使用的时间】递增排序,
如果【使用的时间】相等,
根据【开始的时间】递增排序,
*/
void sortGames()
{
struct Game *p , *q , tempGame1,tempGame2;
p = _games;
while(p)
{
q = p->next;
while(q)
{
if
(
p->guessTime > q->guessTime ||
(p->guessTime == q->guessTime && (p->endTime - p->startTime) > (q->endTime - q->startTime)) ||
(p->guessTime == q->guessTime && (p->endTime - p->startTime) == (q->endTime - q->startTime) && p->startTime > q->startTime)
)
{
tempGame1 = *p;
tempGame2 = *q;
// 注意交换的时候,next 指针不能交换
*p = tempGame2;
p->next = tempGame1.next;
// 注意交换的时候,next 指针不能交换
*q = tempGame1;
q->next = tempGame2.next;
}
q = q->next;
}
p = p->next;
}
}
// 查看排行榜
void printRankList()
{
int counter = 0;
struct Game *p;
printf("\n*******************************************\n");
printf("****玩家排名\n");
printf("*******************************************\n");
// 没有记录
if(!_games)
{
printf("****排名:%4d 用户:%10s(default) 用了%4d次\n",1,PALYER_DEFAULT_SYSTEM_NAME,GAME_MAX_TRY_TIME);
}
else
{
// 排序
sortGames();
p = _games;
counter = 0;
// 查看前 GAME_MAX_TOP_PLAYERS 名(如果有那么多),并且成功猜出价格的
while(p && counter < GAME_MAX_TOP_PLAYERS && p->isSuccess)
{
counter ++;
printf("****排名:%4d 用户:%10s 用了%4d次\n",counter,p->playerName,p->guessTime);
printf(" 开始时间:%s\n",getFormatTime(p->startTime));
printf(" 结束时间:%s\n\n",getFormatTime(p->endTime));
p = p->next;
}
}
printf("*******************************************\n");
}
// 清除排行榜
void clearRankList()
{
struct Game *p = _games , *q;
while(p)
{
q = p->next;
free(p);
p=q;
}
_games = NULL;
printf("\n*******************************************\n");
printf("****清空排名榜\n");
printf("*******************************************\n");
printf("****排名榜已经清空!\n");
printf("*******************************************\n");
}
// 猜价格游戏用户登陆菜单
int printLoginMenu()
{
struct Player *p;
char name[PLAYER_MAX_NAME_LENGTH+1];
char pass[PLAYER_MAX_PASS_LENGTH+1];
int i;
char ch;
printf("\n*******************************************\n");
printf("****登录菜单\n");
printf("*******************************************\n");
printf("****输入用户名称:");
scanf("%s",name);
printf("****输入用户密码:");
scanf("%s",pass);
/*
i=0;
while((ch=getch())!='\n')
{
pass[i++]=ch;
}
pass[i]='\n';
*/
p=_players;
while(p)
{
if(strcmp(p->name,name) == 0 && strcmp(p->pass,pass) == 0)
{
break;
}
else
{
p = p->next;
}
}
if(p)
{
printf("****登陆成功!\n");
printf("*******************************************\n");
strcpy(_loginPlayer.name,name);
strcpy(_loginPlayer.pass,pass);
return 1;
}
else
{
printf("****登陆失败!用户名不存在或者密码错误!\n");
printf("*******************************************\n");
return 0;
}
}
// 猜价格游戏用户注册菜单
int printRegisterMenu()
{
struct Player *p;
char name[PLAYER_MAX_NAME_LENGTH+1];
char pass[PLAYER_MAX_PASS_LENGTH+1];
int i;
char ch;
printf("\n*******************************************\n");
printf("****注册菜单\n");
printf("*******************************************\n");
do
{
printf("****输入要注册的用户名称:");
scanf("%s",name);
if(strcmp(PALYER_DEFAULT_SYSTEM_NAME,name) == 0)
{
printf("****%s 是系统默认的用户名,不能被注册!\n",PALYER_DEFAULT_SYSTEM_NAME);
}
else if(strlen(name)==0)
{
printf("****用户名不能为空!\n");
}
}
while(strlen(name)==0 || strcmp(PALYER_DEFAULT_SYSTEM_NAME,name)== 0 );
printf("****输入要注册的用户密码:");
scanf("%s",pass);
/*
i=0;
while((ch=getch())!='\n')
{
pass[i++]=ch;
}
pass[i]='\n';
*/
p=_players;
while(p)
{
if(strcmp(p->name,name) == 0 && strcmp(p->pass,pass) == 0)
{
break;
}
else
{
p = p->next;
}
}
if(!p)
{
printf("****注册成功!\n");
printf("*******************************************\n");
// 更新当前登陆的用户
strcpy(_loginPlayer.name,name);
strcpy(_loginPlayer.pass,pass);
// 添加一个新的玩家到玩家列表
p = (struct Player*)malloc(sizeof(struct Player));
*p = _loginPlayer;
p->next = _players;
_players = p;
return 1;
}
else
{
printf("****注册失败!该用户名已经被注册!\n");
printf("*******************************************\n");
return 0;
}
}
void play()
{
struct Game newGame, *p;
char strChoice[100];
int intChoice;
int guessPrice;
// 当前游戏的玩家为当前登陆的玩家
strcpy(newGame.playerName,_loginPlayer.name);
printf("\n*******************************************\n");
printf("****猜价格菜单\n");
printf("*******************************************\n");
printf("****您好:%s\n",_loginPlayer.name);
// 下面这句 printf 可以根据需要注释掉
printf("****真实价格为:%d\n",newGame.realPrice);
printf("*******************************************\n");
while(newGame.guessTime < GAME_MAX_TRY_TIME)
{
printf("[第%2d次]输入您猜的价格:",newGame.guessTime+1);
scanf("%d",&guessPrice);
newGame.guessPrice[newGame.guessTime++] = guessPrice;
if(guessPrice == newGame.realPrice)
{
newGame.isSuccess = 1;
break;
}
else if(guessPrice < newGame.realPrice)
{
printf("****低了!\n");
}
else
{
printf("****高了!\n");
}
}
// 记录猜价格游戏结束时间
newGame.endTime = time(NULL);
// 判断猜价格结果
if(newGame.isSuccess == 1)
{
printf("****恭喜你猜出了真实价格!\n");
}
else
{
printf("****很遗憾,您没有猜出真实价格!真实价格为:%6d!\n",newGame.realPrice);
}
// 记录将本轮猜价格游戏
p = (struct Game*)malloc(sizeof(struct Game));
*p = newGame;
p->next = _games;
_games = p;
printf("*******************************************\n");
do
{
printf("****1)继续\n");
printf("****2)返回\n");
printf("*******************************************\n");
scanf("%s",&strChoice);
intChoice = atoi(strChoice);
if(intChoice<1 || intChoice>2)
{
printf("****命令错误!请重新输入命令!\n");
}
}
while(intChoice<1 || intChoice>2);
// 继续下一轮
if(intChoice==1)
{
play();
}
// 返回之前注销登录的账号
else if(intChoice==2)
{
strcpy(_loginPlayer.name,"");
strcpy(_loginPlayer.pass,"");
}
}
void startGame()
{
int choice ;
initPlayer();
initGame();
while(1)
{
choice = printMainMenu();
switch(choice)
{
// 打印排行榜
case 1:
{
printRankList();
break;
}
// 清空排行榜
case 2:
{
clearRankList();
break;
}
// 用户登陆并开始游戏
case 3:
{
if(printLoginMenu())
{
play();
}
break;
}
// 用户注册并开始游戏
case 4:
{
if(printRegisterMenu())
{
play();
}
break;
}
// 用户退出游戏
case 5:
{
savePlayer();
saveGame();
exit(0);
break;
}
default:
{
printf("****命令错误!请重新输入命令!\n");
break;
}
}
}
}
int main(int argc, char *argv[])
{
startGame();
return 0;
}
更多追问追答
追问
这么牛?请问你花了多久?
追答
3个小时。。。题目有点意思,就写了
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
排行榜的保存可以用文件实现,需要比较排名的时候将其读入特定的数据结构中再比较。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我知道你是江师傅,对不。
追问
是的。。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询