c语言编写一个猜价格游戏,答案满意再加50分!!!!24
发布网友
发布时间:2023-10-14 03:08
我来回答
共5个回答
热心网友
时间:2024-12-02 20:08
#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;
}追问这个我去试试,有用就给分
追答晕...楼下的真有时间
就是实现复杂了点儿
再说了 都构造函数了
既然 C++
还那么麻烦自己构造什么数据结构
直接 vector sort find 不就解决了么....晕...
热心网友
时间:2024-12-02 20:08
你好
我觉得这个游戏本身不是什么难题,但是我现在不会有那么多时间耗在这上面来帮你写游戏,那样我的一小半天又没有了。百度的知道平台是用来大家相互交流问题的,你有难题如果我能解决我会很乐意帮你解决的,但不是像你这样自己什么都不管,直接把你的要求发上来,然后等别人帮你解答,这不就完全的伸手党一个吗?要是你在解决这个游戏的过程中有什么问题我会很乐意帮你的,但是对于完全的伸手党,还是自己劝你自己多动脑吧!追问这个游戏的前半部分不难,我关键是不知道关于排行榜的保存,更新,清除以及查看和两部分之间怎么连接
追答c语言中的fopen()和fwrite()函数 你可以用来存储数据 之后还可以用来读出存储的数据,既然能写出程序的前半部分那么看下这两个文件操作的函数应该是能很快应用出来的,你可以试试!
热心网友
时间:2024-12-02 20:09
/*
实现了题目的所有功能。
将猜价格游戏中的【玩家信息】保存在文件: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;
}
热心网友
时间:2024-12-02 20:09
排行榜的保存可以用文件实现,需要比较排名的时候将其读入特定的数据结构中再比较。。。
热心网友
时间:2024-12-02 20:10
我知道你是江师傅,对不。追问是的。。。。