标题:学了差不多两个月的C,自己写了一个猜数字的游戏,大家提提意见
只看楼主
snailqiu
Rank: 2
等 级:论坛游民
帖 子:59
专家分:45
注 册:2007-9-26
结帖率:100%
已结贴  问题点数:10 回复次数:3 
学了差不多两个月的C,自己写了一个猜数字的游戏,大家提提意见
#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 //开始生成3个不相同的随机数的循环
    {
        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';
}
搜索更多相关主题的帖子: include 计数器 游戏 记录 用户 
2013-07-09 22:24
jy331516126
Rank: 1
等 级:新手上路
帖 子:10
专家分:4
注 册:2013-7-4
得分:4 
我是个新手,粘贴进来,怎么运行不了啊
2013-07-09 22:43
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
得分:4 
如果代码没有error的话,还好吧,只是主函数体太大了,别人想修改很麻烦,如果能把这些代码的功能模板化,或者使用多个函数来实现功能,那样就显得简练一些

思考赐予新生,时间在于定义
2013-07-10 00:15
蔡梓锋
Rank: 4
等 级:业余侠客
帖 子:106
专家分:202
注 册:2013-4-20
得分:4 
回复 2楼 jy331516126
软件不一样,可能有些不同,我的也不可以,不过,适当修改后还是可以的,你试下
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include "time.h"
#include "string.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 c,t ;
        char st[]="***|猜数字|***";
    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 //开始生成3个不相同的随机数的循环
    {
        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]);//如果其中有相同的数,重新生成
   


    t=strlen(st);
    for(c=0;c<(80-t)/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';
}

加油加油!
2013-07-10 01:55



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-417010-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.811560 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved