美文网首页
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-猜数字游戏

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

  • 猜数字游戏

    题目:猜数字游戏(要求:用户有三次机会输入数字,当机会用完和输入正确退出,游戏结束.) 代码: # encodin...

  • 猜数字游戏

    问题 用计算机实现一个随机1~100之间的数字,然后由用户来猜这个数字,根据用户猜测的次数分别给出不同的提示。 模...

  • 猜数字游戏

    1~100之间猜数字游戏,猜错给出相应提示,猜对给出所用次数。源码如下:

  • 猜数字游戏

    // ViewController.swift // 猜数游戏 // // Created by apple...

  • 猜数字游戏

    你正在和你的朋友玩 [猜数字(Bulls and Cows)]游戏:你写下一个数字让你的朋友猜。每次他猜测后,你给...

  • 猜数字游戏

    import random # 生成一个随机数 num = random.randint(100,999) pri...

  • 猜数字游戏

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/bulls-...

  • Day6-作业

    猜数字游戏 学生系统

  • 374-猜数字大小

    猜数字大小 题目 我们正在玩一个猜数字游戏。 游戏规则如下:我从1到n选择一个数字。 你需要猜我选择了哪个数字。每...

网友评论

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

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