麻烦哪位高手给加个 游戏记录选项啊 很急啊
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <conio.h>
#define TIME 3
#define N 3
int ws;
int num[N];
int initmsg()
{
int a;
printf("\n┎───────────┓");
printf("\n│ 请输入您的选择 │");
printf("\n│ 1: 开始 │");
printf("\n│ 2: 游戏说明 │");
printf("\n│ 3: 退出 │");
printf("\n┗───────────┛");
printf("\n 你的选择:");
scanf("%d",&a);
return a;
}
void gamemsg()
{
printf("1.输入要记忆的数字 位数\n");
printf("2.输入完成后 会出现3个 相应位数的数字\n");
printf("3.这3个数字 再1秒钟后消失\n");
printf("4.输入 文字 和符号时 提示程序错误\n");
printf("5.输入刚才出现 过的 3个数字\n");
printf("6.3次输入的 机会,数字输入正确则继续游戏,3次机会全错 则提示游戏是否继续\n");
printf("7.输入Q或者q时 程序结束\n");
printf("按任一建继续");
getch();
}
void clear()
{
while(getchar() != '\n');
}
int weishu()
{
int mark;
char c;
while(1)
{
regetmark: mark= initmsg();
switch(mark)
{
case 1: goto start;
case 2: gamemsg(); system("cls");;goto regetmark;
case 3: exit(0);
}
start:printf("请输入位数(结束Q/q):");
if(scanf("%d", &ws))
{
if(ws >= 1 && ws <= 5)
break;
}
else if((c = getchar()) == 'q' || c == 'Q')
return 0;
else
printf("输入错误!请重试.\n");
clear();
}
clear();
return 1;
}
int play()
{
int i, a, b, n;
int in[N];
switch(ws)
{
case 1:a = 0, b = 10;break;
case 2:a = 10, b = 90;break;
case 3:a = 100, b =900;break;
case 4:a = 1000, b = 9000;break;
case 5:a = 10000, b = 90000;break;
}
n = 0;
for(i = 0; i < N; ++i)
n += printf("%d ", num[i] = rand()%b+a);
clock_t now = clock();
while((clock() - now) / CLOCKS_PER_SEC < TIME);
i = n;
while(i--)
putchar('\b');
printf("%*c", n, ' ');
i = n;
while(i--)
putchar('\b');
b = 3;
while(b)
{
printf("请输入:");
for(i = 0; i < N && scanf("%d", &in[i]); ++i);
if(i < N)
{
printf("输入有误!请重试.\n");
clear();
continue;
}
if(b > 0)
{
for(i = 0; i < N; ++i)
if(in[i] != num[i])
{
if(b > 1)
printf("输入错误, 你还有%d次机会:\n", b-1);
break;
}
if(i == N)
return 1;
}
b--;
}
return 0;
}
int main()
{
srand(time(0));
while(weishu())
{
if(!play())
{
clear();
printf("3次机会已用完, 是否重来?(y继续):");
if(getchar() != 'y') break;
else
clear();
}
else
printf("恭喜你!记忆正确.\n");
}
printf("Bye!");
return 0;
}
我亲爱的朋友,这个是老师让你们改的代码吧?
要培养自己学习的习惯哦。
我不帮你做这个程序。但是我想,我可以帮你导读一下,也许能抛砖引玉。
先说一下,老师写的这个程序是 虚拟程序,并不能真正的 纪律游戏,因为这个游戏本身就不能玩。要个P记录啊。而且,你们现在没有学文件流,对吗?
先看这个函数int initmsg(),如果你要是你鄙视你们老师的话,就这样做:
int initmsg()
{
int a;
char * start=(loaded == 0 && ws==0) ? "开始" : "继续游戏";
printf("\n┎───────────┓");
printf("\n│ 请输入您的选择 │");
printf("\n│ 1: %s │",start);
printf("\n│ 2: 游戏说明 │");
printf("\n│ 3: 保存 │");
printf("\n│ 4: 退出 │");
printf("\n┗───────────┛");
printf("\n 你的选择:");
scanf("%d",&a);
return a;
}
完成了,老师问你的话,你可以说,你的游戏无聊,我的保存,也是装饰品。
另外,这个老师,似乎也是新手,或者说……
在90年代的时候,有人提出过 三目运算符 ':?'很不科学。很容易出现bug,是最不推荐使用方法之一,虽然我们教材上,需要了解这个算式。
第二,goto语句,很多正规的大学,或者说先进的大学,已经把这个语句直接drop。我们度过了vb 和汇编的年代,goto本身就不安全,强制跳转,既容易产生歧义,又容易死循环。最重要的是不符合常规程序逻辑。
如果想真正意义的保存,你要知道保存的数据是啥啊?
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#define TIME 3
#define N 3
int ws=0;
int num[N];
char isSave[7];
int loaded = 0;
int initmsg()
{
int a;
char * start=(loaded == 0 && ws==0) ? "开始" : "继续游戏";
printf("\n┎───────────┓");
printf("\n│ 请输入您的选择 │");
printf("\n│ 1: %s │",start);
printf("\n│ 2: 游戏说明 │");
printf("\n│ 3: 退出 │");
printf("\n┗───────────┛");
printf("\n 你的选择:");
scanf("%d",&a);
return a;
}
void gamemsg()
{
printf("1.输入要记忆的数字 位数\n");
printf("2.输入完成后 会出现3个 相应位数的数字\n");
printf("3.这3个数字 再1秒钟后消失\n");
printf("4.输入 文字 和符号时 提示程序错误\n");
printf("5.输入刚才出现 过的 3个数字\n");
printf("6.3次输入的 机会,数字输入正确则继续游戏,3次机会全错 则提示游戏是否继续\n");
printf("7.输入Q或者q时 程序结束\n");
printf("按任一建继续");
getch();
}
void clear()
{
while(getchar() != '\n');
}
int weishu()
{
int mark;
char c;
while(1)
{
regetmark: mark= initmsg();
switch(mark)
{
case 1: {
if((ws==0 )){
goto start;
}else{
return 1;
}
};
case 2: gamemsg(); system("cls");;goto regetmark;
case 3: {
exit(0);
}
}
start:printf("请输入位数(结束Q/q):");
if(scanf("%d", &ws))
{
if(ws >= 1 && ws <= 5)
break;
}
else if((c = getchar()) == 'q' || c == 'Q')
return 0;
else
printf("输入错误!请重试.\n");
clear();
}
clear();
return 1;
}
int checkSaveFile()
{
FILE * fp = fopen("save.dat","rb+");
if(fp != NULL){
fscanf(fp,"%s %d %d %d %d",isSave,&ws,&num[0],&num[1],&num[2]);
//fscanf(fp,"%s",isSave);
}
printf("isSave=%s %d %d %d %d",isSave,ws,num[0],num[1],num[2]);
printf("strcmp(isSave,gmsave)%d",strcmp(isSave,"gmsave"));
fclose(fp);
if(ws>0)
loaded=1;
if(strcmp(isSave,"gmsave")==0){
//fprintf(fp,"%s %d %d %d %d","gmsave",0,0,0,0);
fp = fopen("save.dat","wb+");
fclose(fp);
return 1;
}
return 0;
}
int saveDat(){
FILE * fp = fopen("save.dat","wb+");
if(fp != NULL){
fprintf(fp,"%s %d %d %d %d","gmsave",ws,num[0],num[1],num[2]);
return 1;
}
fclose(fp);
return 0;
}
int play()
{
int i, a, b, n;
int in[N];
switch(ws)
{
case 1:a = 0, b = 10;break;
case 2:a = 10, b = 90;break;
case 3:a = 100, b =900;break;
case 4:a = 1000, b = 9000;break;
case 5:a = 10000, b = 90000;break;
}
n = 0;
if( ws!=0 && loaded ==1){
for(i = 0; i < N; ++i)
n += printf("%d ", num[i]);
}else{
for(i = 0; i < N; ++i)
n += printf("%d ", num[i] = rand()%b+a);
}
clock_t now = clock();
while((clock() - now) / CLOCKS_PER_SEC < TIME);
i = n;
while(i--)
putchar('\b');
printf("%*c", n, ' ');
i = n;
while(i--)
putchar('\b');
b = 3;
while(b)
{
printf("请输入(退出/保存:-1):");
for(i=0;i<N && scanf("%d", &in[i]); i++);{
if(in[0]==-1 || in[1]==-1 || in[2]==-1){
if(saveDat()==1){
printf("保存成功");
}else{
printf("保存失败");
}
clock_t now = clock();
while((clock() - now) / CLOCKS_PER_SEC < TIME);
exit(0);
}
if(i < N)
{
printf("输入有误!请重试.\n");
clear();
continue;
}
}
if(b > 0)
{
for(i = 0; i < N; ++i)
if(in[i] != num[i])
{
if(b > 1)
printf("输入错误, 你还有%d次机会:\n", b-1);
break;
}
if(i == N)
return 1;
}
b--;
}
return 0;
}
int main()
{
srand(time(0));
checkSaveFile();
while(weishu())
{
if(!play())
{
clear();
printf("3次机会已用完, 是否重来?(y继续):");
if(getchar() != 'y')
break;
else
clear();
}
else
printf("恭喜你!记忆正确.\n");
ws=0;
loaded = 0;
}
printf("Bye!");
return 0;
}