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

在学校里选修课选了“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张图片
选修课1. 各种猜数字游戏_第2张图片
被猜数7582,排序后是2578
我猜的数是5777,排序后也是5777,上面的代码去比较相同的数只有1个,这样数字才不会重复。(多想想)

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

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

你可能感兴趣的:(算法,C语言,rand,猜字游戏)