选修课1. 各种猜数字游戏

时间:2021-08-28 07:49:19

在学校里选修课选了“C语言趣味算法”这门课,老师挺牛的,就把每堂课的内容在博客上连载一下,本人是一个新了不能再新的新手,欢迎大家讨论!

第一个就是大家学C一开始接触的猜字数游戏,不废话,贴代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main(void)
{
int a, b;
srand(time(NULL));
a=rand()%51+50; //范围是50~100
printf("猜数游戏开始:\n");
printf("请猜数:\n");
scanf("%d",&b);
while(a!=b)
{
if(b>a)
printf("你猜的数大了,请从新猜:\n");
else if(b<a)
printf("你猜的数小了,请从新猜:\n");
scanf("%d",&b);
}
printf("恭喜你猜对了!\n");
}
          上面代码关键的就是一个rand()函数,包含于#include<stdlib.h>头文件中,我觉得还是要好好讲讲,刚才特地单独为这个写了一篇博客,大家可以去看看,这里就不多说了。

第二个猜字游戏,难度加大。
猜一个四位数,电脑只会告诉你猜对了第几个位置上的游戏
【分析:重点就是被猜的数a和猜的数b逐个放入到两个数组当中,再进行 比较,若某个位置相同,则输出提示,若4个位置相同,则猜对,跳出循环】

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void main(void)
{
int a, b, c[4],d[4], n;
int i, j;
srand(time(NULL));
a=rand()%9000+1000; //范围是1000~9999
for(i=0;i<4;i++) //将被猜数逐个放入数组中
{
c[i]=a%10;
a=a/10;
}
printf("请猜一个四位数:\n");
scanf("%d",&b);
for(i=0;i<4;i++) //将玩家猜数逐个放入数组中
{
d[i]=b%10;
b=b/10;
}
n=0;
for(i=0;i<4;i++)
if(d[i]==c[i]) //判断有几个位置相同
n++;
while(n!=4) //若没猜对,则一直循环猜数
{
printf("猜对了%d个位置上的数字\n", n);
printf("请你再猜:\n");
scanf("%d",&b);
for(i=0;i<4;i++) //将玩家猜的数逐个放入数组中
{
d[i]=b%10;
b=b/10;
}
n=0;
for(i=0;i<4;i++) //判断有几个位置相同
if(d[i]==c[i])
n++;

}
printf("恭喜你猜对了!\n");


}

第三个猜字游戏难度更加变态
猜一个四位数,电脑只会告诉你有几个位置猜对,有几个数字猜对

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void sort( int a[], int n);
void main(void)
{
int a, b, c[4],d[4],e[4], m, n; //n代表位置数,m代表相同数字数
int i, j;
srand(time(NULL));
a=rand()%9000+1000; //范围是1000~9999
printf("原数字:%d\n",a);
for(i=0;i<4;i++)
{
e[i]=c[i]=a%10;
a=a/10;
}
printf("请猜一个四位数:\n");
scanf("%d",&b);
for(i=0;i<4;i++) //将玩家猜的数放入数组中
{
d[i]=b%10;
b=b/10;
}
n=0;
for(i=0;i<4;i++) //判断几个位置相同
if(d[i]==e[i])
n++;
sort(c,4); **//重点:将被猜数排序**
sort(d,4); **//将玩家猜的数排序**
m=0;
j=0;
for(i=0;i<4;i++)
{

while(d[j]<c[i])
{
j++;
if(j>3)
break;
}
if(c[i]==d[j]) //判断相同的数字数
m++;
j++;
if(j>3)
break;
}

while(n!=4)
{
printf("你猜对了%d位数字,猜对了%d个位置上的数字\n", m, n);
printf("请你再猜:\n");
scanf("%d",&b);
for(i=0;i<4;i++) //将玩家猜的数放入数组中
{
d[i]=b%10;
b=b/10;
}
n=0;
for(i=0;i<4;i++) //相同的位置数
if(d[i]==e[i])
n++;
sort(d,4);
m=0;
j=0;
for(i=0;i<4;i++)
{

while(d[j]<c[i])
{
j++;
if(j>3)
break;
}
if(c[i]==d[j]) //判断相同的数字数
m++;
j++;
if(j>3)
break;
}
}


printf("恭喜你猜对了!\n");


}
void sort( int a[], int n) //排序功能
{
int i, j,t;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
{
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}

这个游戏出的有点无语,但你要抓住编程的重点,我当时没怎么弄懂什么意思。【重点是排序!在比较有多少相同的位置时,不需要排序,直接原数组比较。但是,在比较有多少相同的数字时,一定要先将两个原数组排序再比较每个数字上的数字!
重点是判断相同的数字这里,多想想

        m=0;
j=0;
for(i=0;i<4;i++)
{

while(d[j]<c[i])
{
j++;
if(j>3)
break;
}
if(c[i]==d[j]) //判断相同的数字数
m++;
j++;
if(j>3)
break;
}

给大家两个例子好好想想选修课1. 各种猜数字游戏
选修课1. 各种猜数字游戏
被猜数7582,排序后是2578
我猜的数是5777,排序后也是5777,上面的代码去比较相同的数只有1个,这样数字才不会重复。(多想想)

第三个确实有点扭!搞了半天,我觉得我解释的不是很清楚,你们要是有更好的想法,欢迎评论,我期待着哟O(∩_∩)O~

好了 ,以上就是第一节课的内容,难度不是很大,没有涉及数据结构,只是一些基础算法,别急,后天下一堂课,我会继续更新的,敬请期待,我很用心的在写哦,第一次写博客,希望能一直坚持下去。好了,坐的我腰酸背痛,我活动胫骨去了,88