C-猜数字游戏

目的

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

技术

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

如何使用

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;
}

运行结果:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。