回复 2楼 给我毅刀
真巧。我也是初学者,前不久也写了一个猜数字的小游戏。参考一下吧。(共同切磋)
程序代码:
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#define Output_red SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED)//设置字体颜色的,和程序没太大关系,可以不管
#define Output_normal SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE)//设置字体颜色的,和程序没太大关系,可以不管
int IsNum(void);
int main()
{
int a[3],s ;//a[3]为存储自动生成的3个不相同的随机数的数组,s为计数器
int b[3];//b[3]为存储用户手动输入的用于猜数的数组
int sum=0 ;//sum用于记录用户用户试猜的次数
int i,j ;
int SA=0 ;//SA记录位置与数值和电脑给出的数都相符合的数的个数
int SB=0 ;//SB记录数值与电脑给出的数相符但位置不相符的数的个数
int n=1 ;//控制游戏重新执行或退出的变量
do
{
srand(time(NULL)); //以当前时间作为种子
for(s=0;s<=2;s++)
a[s]=rand()%10 ;//生成3个随机数,rand()生成一个随机数,再对10取余则把这个数控制在0-9之间
}
while(a[0]==a[1]||a[1]==a[2]||a[2]==a[0]);//如果其中有相同的数,重新生成
char st[]="***|猜数字|***" ;
int c ;
for(c=0;c<(80-strlen(st))/2;c++)
printf(" ");// 打空白,个数等于(屏幕宽度-字符串长度)/2,此语句让标题居中
Output_red;//设置输出红色字符
printf("%s\n",st);
Output_normal;//设置输出正常字符
printf("\n");
printf("程序已经生成了一个各位数字不相同的3位数(从0到9)");
printf("来猜猜看这是个什么数吧!\n");
printf("计算机会将你提交的数与它生成的数作比较,产生如*A*B的提示。\n");
printf("如1A1B表示你有一个数数值正确且位置正确,有一个数数值正确但位置不正确.\n");
printf("你总共有10次机会。\n");
printf("\n");
printf("请依次输入你所猜的3位数的每一位(各位上的数字不相同)\n");
while(n!=0)
{
fflush(stdin);//清空一次输入缓冲区,以避免游戏第二次运行时接受上一次游戏中多余的输入
Output_normal;//设置输出正常字符
do
{
printf("请输入第1位数字(从0到9):");
b[0]=IsNum();
printf("请输入第2位数字(从0到9),");
do
{
printf("不能与第1位相同:");
b[1]=IsNum();
}while(b[1]==b[0]);
printf("请输入第3位数字(从0到9),");
do
{
printf("不能与第1位或第2位相同:");
b[2]=IsNum();
}while(b[2]==b[1] || b[2]==b[0]);
for(i=0;i<=2;i++)//用一个循环逐位对各数进行比较
{
for(j=0;j<=2;j++)
{
if(b[i]==a[j]&&(i==j))//如果数值相同并且位置也相同
SA++;
if(b[i]==a[j]&&i!=j) //如果数值相同但位置不同
SB++;
}
}
sum++; //每猜一次,sum加上1
printf("\n");
Output_red;//设置输出红色字符
printf("您所猜的3位数是:%d%d%d",b[0],b[1],b[2]);
printf(" 状态:%dA%dB ",SA,SB);
printf(" 您已经猜了:%d次,还剩:%d次\n",sum,10-sum);
Output_normal; //设置输出正常字符
printf("\n");
if(SA==3)//SA等于3代表你所猜的数与计算机生成的数吻合
{
Output_red;//设置输出红色字符
printf("^_^恭喜你,猜对了。正确答案是:");
for(s=0;s<=2;s++)
printf("%3d",a[s]);//输出正确答案
break ;//退出循环,游戏结束
}
else
{
SA=0 ; //重新初始化SA
SB=0 ; //重新初始化SB
}
}
while(sum!=10);//当猜到10次时结束
if(SA!=3)//如果与正确答案不完全一致
{
Output_red;//设置输出红色字符
printf("╯﹏╰很遗憾,你没有猜对。正确答案是: ");
for(s=0;s<=2;s++)
printf("%3d",a[s]);
}
printf("\n");
printf("\n");
printf("还想再玩一次吗?(1:再玩一次 0:退出游戏)\n");
scanf("%d",&n);
sum=0;//重新初始化sum
system("cls");//清屏
}
}
int IsNum(void)
{
int a ;
while(a=getchar())//循环条件
{
fflush(stdin);//清空输入缓冲区,避免游戏重复执行时接受上一次游戏中的遗留数据
if(isdigit(a)==0) // 用isdigi判断,为0表示不是数字
{
fflush(stdin);//清空输入缓冲区,以免输入一个字符后按回车时把回车认为是下一个输入
printf("错误!这不是一个数字,请重新输入。");
}
else //如果不为0,则表示是数字
break ;//退出循环
}
return a - '0';
}
这段程序的缺点是main函数有点大。应该再细分一下就好了。
[
本帖最后由 艺术的生活 于 2013-8-4 23:01 编辑 ]