bint游戏排名榜 排行游戏
一、猜数字游戏
这本是给度娘上的兄弟写的,是我的原创
现在发上来看下好用么。
只是用于进修,也许不是很实用,请大家见谅。觉得好上大家论坛支持一下。
猜数字游戏
游戏制度:①游戏软件随机产生四个数字,但不显示,给用户提供输入提示符,让用户猜4个数字的值和位置顺序。如果数字值和位置顺序均正确,则猜数字成功。②用户有10次猜数字机会,如果在10次之内仍未猜出正确的数字值和顺序,则提示用户游戏失败,并给用户显示出原始数字的值和顺序。一旦用户在10次内猜数出正确的数字值和顺序,则提示用户赢得游戏。③当用户赢得游戏后,会和排行榜中的前五名用户的游戏记录相对,根据相对结局更新排行榜。④记分制度:猜数字所用的次数即为分数,分数越少越好
功能标准:
游戏区功能:①随机产生原始数字、②游戏提示(提示用户当前猜数字的匹配情况,提示方式自主设计)、③原始数字显示
排行榜浏览和清除功能:①按用户成绩顺序浏览②按用户姓名浏览③排行榜清除
排行榜记录添加和更新功能:①判断用户可否入榜②记录更新③显示当前排行榜
游戏记录读取功能:①判断有误游戏记录②初始化排行榜③获取最好记录并在游戏开始时显示最好记录
帮助功能:给用户提供游戏制度和游戏相关提示的注释。
QQ 898114195
我是用 wintc编译的,在中文DOS下才能正确显示。
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#include<process.h>
#define MAX 5
typedef struct{
char name[21];
int score;
unsigned char sernum;
}PLAYER;
void getnum(int answer[]){
int i,j;
for(i=0;i<=3;i++)
{
randomize();
answer=rand()%10;
for(j=0;j<i;j++)
{
while(answer==answer[j])
{
answer=rand()%10;
j=-1;
}
}
}
}/*get number for answer*/
void structcpy(PLAYER*play1,PLAYER play2){
strcpy(play1->name,play2.name);
play1->score=play2.score;
play1->sernum=play2.sernum;
}
int menu(){
clrscr();
printf("\n******************猜数字游戏******************\n\n");
printf("********由Ryw12403编译********\n\n");
printf("菜单\n");
printf("\n\n1.帮助");
printf("\n\n2.显示排行榜");
printf("\n\n3.清除排行榜");
printf("\n\n4.开始游戏");
printf("\n\n5.退出游戏");
printf("\n\n请选择(1->5):");
return getche();
}/*choose to play*/
void initrecord(){
int i;
FILE*fp;
char ch;
PLAYER record[MAX];
clrscr();
if((fp=fopen("guess.dat","rb"))==NULL){
printf("\n第一次玩这个游戏,要继续吗?");
ch=getche();
printf("\n");
if(ch=='y'||ch=='Y'){
if((fp=fopen("guess.dat","wb+"))==NULL){
printf("无法建立文件,请检查磁盘!");
exit(1);
}
for(i=0;i<MAX;i++){
strcpy(record.name,"\0");
record.score=100;
record.sernum=i+1;
fwrite(&record,sizeof(PLAYER),1,fp);
}
}
else return;
}
fclose(fp);
}
void help(){
clrscr();
printf(" Help\n");
printf("输入四位0--9不重复的数字,按字母键退出。\n");
printf("制度:A表示猜的数字和位置都对,B表示猜的数字对,位置不对\n");
printf("字母前面的数字表示对的个数。\n");
printf("如要猜的数字是2943,你猜2893,那就提示2A1B\n\n");
printf("按任意键继续.");
}/*display help information*/
void displayrecord(){
char i;
FILE*fp;
PLAYER record[MAX];
clrscr();
if((fp=fopen("guess.dat","rb"))==NULL){
printf("无法打开文件,请确认文件己存在。");
return;
}
for(i=0;i<MAX;i++){
fread(&record,sizeof(PLAYER),1,fp);
}
if(record[0].score==100){
printf("文件中没有记录.");
}
printf("第 1名到第 5名的排行:\n");
printf("姓名:分数:名次:\n");
for(i=0;i<MAX;i++){
if(record.score==100)
printf("\n%d:%-20s%-20d%-10d",i+1, record.name,0,record.sernum);
else
printf("\n%d:%-20s%-20d%-10d",i+1, record.name,record.score,record.sernum);
}
printf("\n\n按任意键继续.");
fclose(fp);
}/*排行榜浏览*/
void deleterecord(){
int i;
FILE*fp;
PLAYER temp;
if((fp=fopen("guess.dat","rb+"))==NULL){
printf("\n文件不存在!\n");
return;
}
else{
strcpy(temp.name,"\0");
temp.score=100;
for(i=0;i<MAX;i++){
temp.sernum=i+1;
fwrite(&temp,sizeof(PLAYER),1,fp);
}
fclose(fp);
printf("\n记录己清除!");
}
}/*排行榜清除*/
int play(PLAYER*temp){
int answer[4],guess,a,b,times,i,j;
char flag,ch;
clrscr();
guess=0;
times=0;
getnum(answer);
printf("\n输入姓名:");
scanf("%s",temp->name);
printf("\n开始猜数,(最大四位数)或输入字母退出。\n");
a=0;
while(a!=4)
{
a=0;
b=0;
times++;
if(times>10)
break;
do
{
printf("\n%d",times);
scanf("%d",&guess);
if(guess==0)
return NULL;
}while(guess<0||guess>9999);
for(i=3;i>-1;i--)
{
for(j=0;j<4;j++)
{
if((int)(guess/pow10(i))==answer[j])
{
if(i+j==3)
a=a+1;
else
b=b+1;
}
}
guess=guess-(int)(guess/pow10(i))*pow10(i);
}
printf("%dA%dB\n",a,b);
}
printf("\nanswer is%d%d%d%d",answer[0],answer[1],answer[2],answer[3]);
if(times>10){
printf("\n你输了!");
printf("\n没有上排行榜!");
getch();
return NULL;
}
else{
printf("\n你赢了!");
temp->score=times;
return 1;
}
}
int insertrecord(PLAYER temp){
int flag,i,j;
FILE*fp;
PLAYER temp1,record[MAX];
flag=0;
if((fp=fopen("guess.dat","rb+"))==NULL){
printf("\n文件不存在,没有更新排行榜!");
return;
}
for(i=0;i<MAX;i++){
fread(&record,sizeof(PLAYER),1,fp);
record.sernum=i+1;
}
for(i=0;i<MAX;i++){
if(strcmp(temp.name,record.name)==0){
if(temp.score>=record.score){
printf("\n你己有的记录比此次好。");
fclose(fp);
return NULL;
}
else
printf("你的记录更新!");
flag=i;
break;
}
}
if(flag==0){
for(i=0;i<MAX;i++){
if(temp.score>=record.score)
continue;
else{
temp.sernum=i+1;
structcpy(&temp1,record);
structcpy(&record,temp);
structcpy(&temp,temp1);
}
}
}
else{
record[flag].score=temp.score;
for(i=0;i<MAX-1;i++){
for(j=i+1;j<MAX;j++){
if(record.score<=record[j].score)
continue;
else{
structcpy(&temp,record);
structcpy(&record,record[j]);
structcpy(&record[j],temp);
}
}
}
}
rewind(fp);
for(i=0;i<MAX;i++){
record.sernum=i+1;
fwrite(&record,sizeof(PLAYER),1,fp);
}
fclose(fp);
return flag+1;
}
main(){
int i,choose;
PLAYER temp;
do{
strcpy(temp.name,"\0");
temp.score=100;
temp.sernum=0;
initrecord();
choose=menu();
printf("\n");
switch(choose){
case'1':
help();
break;
case'2':
displayrecord();
break;
case'3':
deleterecord();
break;
case'4':
if(play(&temp))
insertrecord(temp);
break;
case'5':
exit(0);
default:
return;
}
getch();
}while(choose!=5);
return;
}
二、求用C++补充壹个小游戏的排行榜
简单说一下思路,具体实现自己弄吧,其实不难
照你所说:
你可以定义壹个数组,就10个元素就行,
接着设定壹个标志flag,如果是在9次以内就把它加入排行榜,
这可以用壹个排序实现,先将数组全初始化为0,
查找第壹个<flag的元素,在讲这个flag放在这个数的前壹个位置就行啦,之后的元素后移,最后壹个舍弃。如果超过10个后,flag均小于数组元素,就不用改了。
希望对你有用。