文档库 最新最全的文档下载
当前位置:文档库 › 猜价格游戏课程设计

猜价格游戏课程设计

#include
#include
#include
#include
#include

/* 格式化时间函数 */
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",https://www.wendangku.net/doc/632628581.html,,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{
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;iguessTime;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(_https://www.wendangku.net/doc/632628581.html,,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(_https://www.wendangku.net/doc/632628581.html,,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,_https://www.wendangku.net/doc/632628581.html,);

printf("\n*******************************************\n");
printf("****猜价格菜单\n");
printf("*******************************************\n");
printf("****您好:%s\n",_https://www.wendangku.net/doc/632628581.html,);
/* 下面这句 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(_https://www.wendangku.net/doc/632628581.html,,"");
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;
}

相关文档
相关文档 最新文档