美文网首页
C-猜数字游戏

C-猜数字游戏

作者: 小石头呢 | 来源:发表于2019-08-08 14:41 被阅读0次

    目的

    通过实现猜数字小游戏,达到掌握随机数的产生,去除重复数据,排序的作用

    技术

    随机数的产生,去除重复数据,排序

    如何使用

    1. 随机数的产生

    • 计算机并不能产生真正的随机数,而是已经编写好的一些无规则排列的数字存储在电脑里。

    • 把这些数字划分为若干相等的N份,并为每份加上一个编号用srand()函数获取这个编号。

    • 然后rand()就按顺序获取这些数字,当srand()的参数值固定的时候,rand()获得的数也是固定的。

    • 一般srand的参数用time(NULL),因为系统的时间一直在变,所以rand()获得的数也就一直在变,相当于是随机数了。

    //提前设置种子
    srand((unsigned)time(NULL));
    
    //循环产生随机数
    for (int i = 0; i < 4; i++){
        //产生一个随机数
        int temp = rand() % 9 + 1;
    }
    

    上面的例子就是用来产生随机数,rand()获得的随机数对9取余得到的范围是 0 - 8 范围,加上 1 就是1 - 9 的范围。

    2. 去除重复数据

    //提前设置种子
    srand((unsigned)time(NULL));
    
    //产生四个随机数
    for (int i = 0; i < 4; i++){
    
        //暂时保存产生的随机数
        int temp = 0;
    
        //产生四个不重复并且排序的随机数
        while (1){
    
            //产生一个随机数
            temp = rand() % 9 + 1;
    
            //判断是否已经存在
            int j = 0;
            for (; j < i; j++){
    
                if (temp == originalArray[j]){
                    //重复了,继续产生新的
                    break;
                }
            }
    
            //产生第一个数字过来
            //重复了,break过来
            //比完了,都没有重复
            if (i == j){
    
                //没有重复情况下,跳出循环
                break;
            }
    
        }
    
        originalArray[i] = temp;
    }
    

    上面的代码,重点在于来到最后一个 if 语句,判断 i 和 j 是否相等之前,有三种情况:

    1. i = 0 和 j = 0时,第一次不需要比较是否重复,直接进入 if 语句,跳出循环,添加到数组中。

    2. 经过比较发现有重复的,此时没有全部比完,i 和 j 的值必定不等,继续产生新的随机数。

    3. 全部比较完了,都没有重复的,此时 i 和 j 必定相等,并且产生的数字必定不重复,所以跳出循环,加入到数组中。

    3. 排序

    //提前设置种子
    srand((unsigned)time(NULL));
    
    //产生四个随机数
    for (int i = 0; i < 4; i++){
    
        //暂时保存产生的随机数
        int temp = 0;
    
        //产生四个不重复并且排序的随机数
        while (1){
    
            //产生一个随机数
            temp = rand() % 9 + 1;
    
            //判断是否已经存在
            int j = 0;
            for (; j < i; j++){
    
                if (temp == originalArray[j]){
                    //重复了,继续产生新的
                    break;
                }
            }
    
            //产生第一个数字过来
            //重复了,break过来
            //比完了,都没有重复
            if (i == j){
    
                //没有重复情况下,跳出循环,用于排序
                break;
            }
    
        }
    
        //插入排序
        int j = 0;
        for (; j < i; j++){
    
            //产生的数字和j对应的数字比较
            if (temp < originalArray[j]){
    
                //j后面的内容往后移动
                for (int k = i; k > j; k--){
                    originalArray[k] = originalArray[k-1];
                }
    
                //不需要再和后面的数字继续比较了
                break;
            }
        }
    
        //运行出来,j=i,就是我们要插入的位置
        //break出来,for循环找到了一个位置j
        originalArray[j] = temp;
    }
    

    流程:

    1.通过一个循环for (int j = 0; j < i; j++)依次和已经排好顺序的数字比较。比较插入的temp = 2 和 originalArray[ j ],找到插入的位置,找到插入的位置后,后面的就可以不用比较了,直接break开始插入下一个数据。


    2.通过一个循环for (int k = i; k > j; k--)将位置腾出来,先将本该存放第三个数据的位置( i = 2 )放入前一个数据,前一个位置也是这样,直到插入的位置前( j = 0 )。

    具体使用

    系统自动产生一组不重复的有序的四个数据,供用户猜测。变量A记录用户猜测的数字中,位置和数值都对的个数,变量B用来记录用户猜测的数字中,数值对了数字没有对的个数。

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int main(){
    
        //保存原始数字
        int originalArray[4] = {};
    
        //保存猜测数字
        int guessArray[4] = {};
    
        //记录数字相同位置也相同的个数
        int countA = 0;
    
        //记录数字相同位置不相同的个数
        int countB = 0;
    
        //提前设置种子
        srand((unsigned)time(NULL));
    
        //产生四个随机数
        for (int i = 0; i < 4; i++){
    
            //暂时保存产生的随机数
            int temp = 0;
    
            //产生四个不重复并且排序的随机数
            while (1){
    
                //产生一个随机数
                temp = rand() % 9 + 1;
    
                //判断是否已经存在
                int j = 0;
                for (; j < i; j++){
    
                    if (temp == originalArray[j]){
                        //重复了,继续产生新的
                        break;
                    }
                }
    
                //产生第一个数字过来
                //重复了,break过来
                //比完了,都没有重复
                if (i == j){
    
                    //没有重复情况下,跳出循环,用于排序
                    break;
                }
    
            }
    
            //插入排序
            int j = 0;
            for (; j < i; j++){
    
                //产生的数字和j对应的数字比较
                if (temp < originalArray[j]){
    
                    //j后面的内容往后移动
                    for (int k = i; k > j; k--){
                        originalArray[k] = originalArray[k-1];
                    }
    
                    //不需要再和后面的数字继续比较了
                    break;
                }
            }
    
            //运行出来,j=i,就是我们要插入的位置
            //break出来,for循环找到了一个位置j
            originalArray[j] = temp;
        }
    
        //正确的数字
        printf("正确的数字: ");
        for (int i = 0; i  < 4; i ++){
    
            printf("%d ",originalArray[i]);
        }
        printf("\n");
    
        //开始游戏
        while (1){
    
            //输入数字
            printf("请输入猜测的数子:");
            for (int i = 0; i < 4; i++){
    
                scanf_s("%d",&guessArray[i]);
            }
    
            //判断用户输入
            for (int i = 0; i < 4; i++){
    
                //用原始数字依次和输入的四个数字比较
                for (int j = 0; j < 4; j++){
    
                    if (originalArray[i] == guessArray[j]){
    
                        //判断两个的位置是否相同
                        if (i == j){
    
                            countA++;
                        }else{
    
                            countB++;
                        }
                    }
                }
            }
    
            //判断结果
            if (countA == 4){
    
                //全对
                printf("恭喜你,答对了!\n");
    
                //游戏结束
                break;
            }else{
    
                //提示错误
                printf("%dA%dB\n",countA,countB);
    
                //还原数据
                countA = 0;
                countB = 0;
            }
    
        }
    
        return 0;
    }
    

    运行结果:

    相关文章

      网友评论

          本文标题:C-猜数字游戏

          本文链接:https://www.haomeiwen.com/subject/bfvkdctx.html