目的
通过实现猜数字小游戏,达到掌握随机数的产生,去除重复数据,排序的作用
技术
随机数的产生,去除重复数据,排序
如何使用
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 是否相等之前,有三种情况:
-
i = 0 和 j = 0时,第一次不需要比较是否重复,直接进入 if 语句,跳出循环,添加到数组中。
-
经过比较发现有重复的,此时没有全部比完,i 和 j 的值必定不等,继续产生新的随机数。
-
全部比较完了,都没有重复的,此时 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;
}
运行结果:
网友评论