整体还是很好的。
问题在这里:
“scanf("%c,%C",&player1,&player2);”这一句,第二个%c大写了,改一下。
scanf的实质是将键盘输入字符存入声明字符变量时开辟的一段存储区域。第一局运行正常,而第二局往后你只是单纯的想覆盖输入,这是不可以的——因为你在上一次使用scanf后没有清空输入缓存,这样再次使用scanf的时候函数就会认为你已经输入过了。
改进只需要在scanf之前加上fflush(stdin)清空输入缓存。
如图:
希望帮上忙。
#include
#include
#include
int main()
{
char gamer;//玩家出拳
int computer;//电脑出拳
int result;//比赛结果
//为了避免玩一次游戏就退出程序,可以将代码放在循环中
while(1){
printf("这是一个猜拳的小游戏,请输入你要出的拳头:\n");
printf("A:剪刀\nB:石头\nC:布\nD:不玩了\n");
scanf("%c%*c",&gamer);
switch(gamer){
case 65://A
case 97://a
gamer=4;
break;
case 66://B
case 98://b
gamer=7;
break;
case 67://C
case 99://c
gamer=10;
break;
case 68://D
case 100://d
return 0;
default:
printf("你的选择为%c选择错误,退出...\n",gamer);
getchar();
system("cls");//清屏
return 0;
break;
}
srand((unsigned)time(NULL));//随机数种子
computer=rand()%3;//产生随机数并取余,得到电脑出拳
result=(int)gamer+computer;// gamer为 char类型,数学运算时要强制转换类型
printf("电脑出了");
switch(computer)
{
case 0:printf("剪刀\n");break;//4 1
case 1:printf("石头\n");break;//7 2
case 2:printf("布\n");break;//10 3
}
printf("你出了");
switch(gamer)
{
case 4:printf("剪刀\n");break;
case 7:printf("石头\n");break;
case 10:printf("布\n");break;
}
if(result==6||result==7||result==11) printf("你赢了!");
else if(result==5||result==9||result==10) printf("电脑赢了!");
else printf("平手");
system("pause>nul&&cls");//暂停并清屏
}
return 0;
}
/*至搂主:本游戏系统可支持多个用户游戏,一次只能登录一个用户,运行此程序会生成一个文件来存储用户信息,本程序允许承载的用户个数为1000个,为使游戏更有趣味,程序特意为不同的玩家分数设计了不同的等级,程序初始化时,会生成一个只含有5个系统玩家的文件。游戏过程中,文件会不断刷新,如果玩家要删除一切曾经的游戏记录,只需将存储文件删除,存储记录的文件名为'sunyi',如果搂主想与我们联系,请加QQ好友865363864。(加好友时请搂主注明身份)。
*/
#include
#include
#include
//#define NULL 0
/**************************************************************************************************************************/
struct computer//定义系统玩家结构体
{
char player[30];
int score;
int times;
int time;
}cpt[1000]={"player1",100,1,1,"player2",100,1,1,"player3",100,1,1,"player4",100,1,1,"player5",100,1,1,};
FILE*in;//生成记录玩家信息的文件的指针
int number,rool;//rool:玩家所在数组位置的角标.number:数组元素的个数.
/****************************************************************************************************************************/
int h()//生成一个随机数(1,2或3);
{
int k,n;
n=rand()%3;
return n+1;
}
/****************************************************************************************************************************/
int str_to_num(char a[])//引入函数str_to_num:使字符串(string)转化为整数数形式(int)!
{
int i=strlen(a)-1,num=0,time=1;
for(;i>=0;i--)
{
num=num+(a[i]-'0')*time;
time=time*10;
}
return(num);
}
/*****************************************************************************************************************************/
void b(int n)
{
switch((int)(n/20))
{
case(0):printf("等级:江湖渣子");break;
case(1):
case(2):printf("等级:初入江湖");break;
case(3):
case(4):
case(5):printf("等级:江湖浪子");break;
case(6):
case(7):
case(8):
case(9):printf("等级:江湖侠客");break;
case(10):
case(11):
case(12):
case(13):
case(14):
case(15):
case(16):
case(17):
case(18):
case(19):printf("等级:一派掌门");break;
default:
{
switch((int)(n/1000))
{
case(0):printf("等级:武林盟主");break;
case(1):
case(2):
case(3):
case(4):printf("等级:江湖奇侠");break;
case(5):
case(6):
case(7):
case(8):
case(9):printf("等级:孤独求败");break;
default:printf("等级:不死之身");break;
}
}
}
}
/*****************************************************************************************************************************/
int readfile(void)//读文件
{
int i,number=5;
if((in=fopen("sunyi.txt","rb"))!=NULL)
{
fread(&number,sizeof(int),1,in);
for(i=0;i { fread(&cpt[i],sizeof(struct computer),1,in); } fclose(in); } return(number); } /******************************************************************************************************************************/ void writefile()//写文件 { int i; in=fopen("sunyi.txt","wb"); fwrite(&number,sizeof(int),1,in); for(i=0;i { fwrite(&cpt[i],sizeof(struct computer),1,in); } fclose(in); } /*******************************************************************************************************************************/ void rule()//规则函数 { printf("猜拳游戏\n"); printf("规则:\n"); printf("输入“N”或“n”查看积分,第一次游戏时,会免费赠送玩家100枚金币,每局游戏都会"); printf("提示您输入押金,押金必须大于1枚金币!(含1枚),提示游戏开始后,输入一个1~3"); printf("之间的值;1表示石头,2表示剪刀,3表示布。同时,系统也将出拳,按照通俗规则,赢者"); printf("将得到押金,否则扣除,当积分小于5分时,您有五次机会得到系统免费赠送的30分,"); printf("当玩家金币数为零时(又用完5次得到30金币的机会),系统将提示玩家游戏结束。并删"); printf("除用户。\n"); printf("#本系统会自动生成5个系统玩家轮流与您游戏,游戏前,玩家需要登录来调出自己"); printf("的游戏记录,如果是第一次游戏,请输入“register”,再输入新用户名注册,如果以前"); printf("进行过游戏,请输入“entry”再输入“用户名”登录.\n(注:本系统允许存储本记录多个用户的信息。)\n\n"); } /*********************************************************************************************************************************/ int registe()//开始游戏前的登录和注册. { char ch[30]; int i; loop4: printf("\n第一次玩游戏?请输入“register”注册!\n登录?请输入“entry”登录\n"); loop3: scanf("%s",ch); if(strcmp("register",ch)==0) { loop2: printf("请输入新用户名:(长度小于30个字符)"); scanf("%s",ch); for(i=5;i { if(strcmp(cpt[i].player,ch)==0) { printf("这个用户已被注册过!注册失败!请重新注册!\n"); goto loop2; } } strcpy(cpt[number].player,ch); cpt[number].score=100; cpt[number].time=cpt[number].times=1; number+=1; writefile(); printf("注册成功!请登录并在您的用户下进行游戏!:"); goto loop4; } else if(strcmp("entry",ch)==0) { printf("请输入用户名登录:"); scanf("%s",ch); for(i=5;i { if(strcmp(cpt[i].player,ch)==0) { printf("登录成功!\n"); printf("您将在您的用户下进行游戏。!"); break; } } if(i==number) { printf("输入错误或没有注册或该用户由于输光金币已被系统删除!\n请重新输入用户名登录!"); goto loop4; } } else { printf("您输入的不是“register”也不是“entry”,系统无法执行您的命令,请重新输入:\n"); goto loop3; } return(i); } /*********************************************************************************************************************************/ void game()//游戏和查询的主体函数 { int o,p; char a[10],wether[1]; if(cpt[rool].time==1)printf("本局游戏系统将免费赠予您100枚金币。\n"); if(cpt[rool].score<5&&cpt[rool].times<=5) { if(cpt[rool].times<5) { printf("您的积分已少于5分,系统第%d次赠送你30枚金币\n",cpt[rool].times); } else { printf("您的积分已少于5分,系统最后一次赠送你30枚金币!\n"); } cpt[rool].score+=30; cpt[rool].times+=1; game(); } if(cpt[rool].score==0) { int q; printf("您不能在没有积分的状态下游戏!你的用户将被删除,如果您还想继续游戏,请重新申请用户\nGAME OVER!\n"); for(q=rool;q { strcpy(cpt[q].player,cpt[q+1].player); cpt[q].time=cpt[q+1].time; cpt[q].times=cpt[q+1].times; cpt[q].score=cpt[q+1].score; } number-=1; writefile(); return; } else { printf("是否继续游戏,输入‘y’或‘Y’继续游戏\n"); scanf("%s",wether); if(strcmp("y",wether)!=0&& strcmp("Y",wether)!=0) { printf("GAME STOP"); return; } else { loop1: printf("请输入你对本局游戏的押金或输入'N'或‘n’查询积分排名\n"); loop5: scanf("%s",a); /****************************************************************************************************************************************************/ if(a[0]=='n'||a[0]=='N')//查寻排名 { int i[5]={-1,-1,-1,-1,-1},j,k,d=0,e=0,line=-1; for(k=1;k<=5;k++) { for(d=0;d<5;d++) { if(d!=i[0]&&d!=i[1]&&d!=i[2]&&d!=i[3]&&d!=i[4])break; } for(j=0;j { if(cpt[j].score>=cpt[d].score&&j!=i[0]&&j!=i[1]&&j!=i[2]&&j!=i[3]&&j!=i[4])d=j; } i[k-1]=d; if(d==rool) { line=k; } printf("\n玩家:%10s,金币数:%4d,",cpt[d].player,cpt[d].score); b(cpt[d].score); } if(line!=-1) { printf("\n\n您目前的积分为:%d,\n排名为:%d,\n",cpt[rool].score,line); b(cpt[rool].score); printf("\n\n"); } else { printf("\n\n您目前的积分为:%d,\n没有进入前5名\n",cpt[rool].score); b(cpt[rool].score); printf("\n\n"); } game(); } /*****************************************************************************************************************************************************/ else//玩游戏 { int g=0,le=strlen(a); for(;g { if(!(a[g]>='0'&&a[g]<='9')) { printf("你输入了游戏系统无法识别的字符,请重新输入:"); break; } } if(g { goto loop5; } int money=str_to_num(a); if(money==0) { printf("押金不能为‘0’,请重新输入:"); goto loop5; } if(money<0) { printf("押金不能为负数,请重新输入:"); goto loop5; } printf("和您进行本轮游戏的是系统玩家player%d。\n",(cpt[rool].time-1)%5+1); if(cpt[(cpt[rool].time-1)%5].score<5) { cpt[(cpt[rool].time-1)%5].score+=50; printf("你的对手的金币小于5个,系统赠送你的对手50枚金币\n"); } printf("您设定的押金为%d\n",money); if(money>cpt[rool].score) { printf("抱歉,您的金币不足!请重新输入!\n"); goto loop1; } if(money>cpt[(cpt[rool].time-1)%5].score) { printf("抱歉,您的对手金币不足!请重新输入!\n"); goto loop1; } if(1>0) { printf("游戏开始,请出拳!(1表示石头,2表示剪刀,3表示布)"); scanf("%d",&o); p=h(); switch(o) { case 1: { printf("玩家出拳:石头\n"); break; } case 2: { printf("玩家出拳:剪子\n"); break; } case 3: { printf("玩家出拳:布\n"); break; } } switch(p) { case 1: { printf("系统出拳:石头\n"); break; } case 2: { printf("系统出拳:剪子\n"); break; } case 3: { printf("系统出拳:布\n"); break; } } switch(o-p) { case 0: { printf("平局!系统将不改变你的金币数量,你的余额为:%d\n",cpt[rool].score); break; } case 1: case-2: { printf("你输了,系统将扣除你%d个金币,你的余额为:%d\n",money,cpt[rool].score-money); cpt[rool].score-=money; cpt[(cpt[rool].time-1)%5].score=cpt[(cpt[rool].time-1)%5].score+money; break; } case-1: case 2: { printf("你赢了,系统将给予你%d个金币,你的余额为:%d\n",money,cpt[rool].score+money); cpt[rool].score+=money; cpt[(cpt[rool].time-1)%5].score=cpt[(cpt[rool].time-1)%5].score-money; break; } } cpt[rool].time+=1; writefile(); } game(); } } } } main()//主函数 { srand((unsigned)time(0)); number=readfile(); rule(); rool=registe(); game(); }
上一篇:c语言小游戏需要什么知识点
下一篇:C语言写小游戏需要什么知识