珠玑妙算益智小游戏 C语言从入门到入土(入门特别篇)

本文阅读 6 分钟
首页 代码,C/C#/C++ 正文

目录

一这里先提几点:

1.生成随机数还是老方法。

2.isdigit 函数:

3.计算程序所花的时间:

4.字符与对应整数的关系

二:游戏实现

test.c:

game.c:

game.h:

谁都不能阻挡你成为优秀的人。

//游戏题目 //珠玑妙算:是一个猜不重复数字的游戏。 //游戏流程是:出题者根据答题者的推测给予提示 //循环进行这种对话形式的处理,直到答题者猜对答案为止。

//注:数字和位置都与正确答案一致就是hit,数字猜对了但位置不对就是blow。

PS:想要发给朋友玩的方法在前面如何发动态链接库那篇文章里面哈!非常简单!

废话不多说,直接上代码(里面有详细的思路和解释哈!)

一这里先提几点:

1.生成随机数还是老方法。

2.isdigit 函数:

这个头文件是#include<ctype.h>   格式:int isdigit(int c)

功能:判断c是否为十进制数字 返回值:若判断成立,则返回除0以外的值(真),若判断不成立,则返回0。

3.计算程序所花的时间:

        调用clock函数后,就能以clock_t型的数值形式获取程序启动后经过的时钟数。时钟数的单位根据编程环境不同而有所差别,但都能通过除以CLOCKS_PER_SEC来换算成以秒为单位的数值。

        然而,这样直接进行除法运算的话会舍去小数部分,所以要强制转换成double型,再进行(double)clock() / CLOCKS_PER_SEC的操作。

格式就是这样:

clock_t start, end;

start = clock();

-----处理------

end = clock();

此时所需的时间是end减去start的时钟数。

把这个值除以CLOCKS_PER_SEC就能换算成以秒为单位的值。直接进行除法运算的话会舍去小数部分,所以想求出实数的话,就必须将其强制转换成double型。

(double)(end-start)/CLOCKS_PER_SEC  //处理所需的时间

4.字符与对应整数的关系

数字字符减去‘0’,可以得到对应的整数值。

整数值加上‘0’,可以得到对应的数字字符。

二:游戏实现

test.c:

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"

//1.生成4个各不相同的字符串
//2.检查字符串的有效性
//3.对于数字和位置是否正确的判断
//4.显示判断结果
//5.计算完成用的时间


//游戏题目
//珠玑妙算:是一个猜不重复数字的游戏。
//游戏流程是:出题者根据答题者的推测给予提示
//循环进行这种对话形式的处理,直到答题者猜对答案为止。

//注:数字和位置都与正确答案一致就是hit,数字猜对了但位置不对就是blow。 





int main()
{
    int try_guess = 0;  //计算输入次数
    clock_t start=0 ;
    clock_t end=0;
    srand((unsigned int)time(NULL)); //设置随机数种子

    int guess[4] = { 0 };  //要猜的字符串
    char buff[10] = { 0 }; //玩家输入字符串
    int chk = 0; //已输入字符串的检查结果
    int try_no = 0;  //输入次数
    int hit = 0; //位置和数字都正确的数字个数
    int blow = 0;  //数字正确但位置不正确的数字个数

    printf("来玩珠玑妙算吧。\n");
    printf("猜猜4个数字。\n");
    printf("其中不包含相同的数字。\n");
    printf("来玩珠玑妙算吧。\n");
    printf("不能输入空格字符。\n");

    make4digits(guess);

     start = clock();  //计算开始

    do
    {
        do
        {
            printf("请输入:\n");
            scanf("%s", buff);

            chk = check(buff);

            switch (chk)
            {
            case 1:
                printf("\a请确保输入4个字符。\n");
                break;
            case 2:
                printf("\a请不要输入除了数字外以外的字符。\n");
                break;
            case 3:
                printf("\a请不要输入相同的数字。\n");
                break;
            }
        } while (chk != 0);
        try_guess++;
        judge(buff, guess, &hit, &blow);
        print_result(hit + blow, hit);
    } while (hit < 4);

    end = clock();   //计算结束
    printf("用了%d次。\n", try_guess);
    printf("用时%lf秒。\n",(double)(end-start)/CLOCKS_PER_SEC);
    return 0;
}

game.c:

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"

//1.生成4个各不相同的字符串
void make4digits(int guess[])
{
    int i = 0;
    int j = 0;
    int val = 0;

    for (i = 0; i < 4; i++)  //生成4个数
    {
        do
        {
            val = rand() % 10;  //0-9的数
            for (j = 0; j < i; j++)   //是否已经取值
            {
                if (val == guess[j])
                    break;
            }
        } while (j < i);  //循环至获得不重复的值
        guess[i] = val;  //上面不重复之后然后赋值
    }
}

//2.检查字符串的有效性
int check(const char buff[])
{
    int i = 0;
    int j = 0;
    //字符串长度不为4
    if (strlen(buff) != 4)
        return 1;
    //包含了除数字以外的字符
    for (i = 0; i < 4; i++)
    {
        if (!isdigit(buff[i]))
            return 2;
    }
    //含有相同数字
    for (j = 0; j < i; j++)
    {
        if (buff[i] == buff[j])
            return 3;
    }
    //字符串有效
    return 0; 
}

//3.对于数字和位置是否正确的判断
void judge(const char buff[],const int guess[], int* hit, int* blow)
{
    int i = 0;
    int j = 0;
    *hit = *blow = 0;

    for ( i = 0; i < 4; i++)   //前面两个for循环是4个数每个数都和其他的数比较
    {
        for ( j = 0; j < 4; j++)
        {
            if (buff[i] == '0' + guess[j]) //数字一致
            {
                if (i == j)
                {
                    (*hit)++;  //位置也一致
                }
                else
                {
                    (*blow)++; //位置不一致
                }
            }
        }
    }
}

//4.显示判断结果
void print_result(int snum, int spos)
{
    if (spos == 4)
    {
        printf("回答正确!!!\n");
    }
    else if (snum == 0)
    {
        printf("这些数字里没有答案数字。\n");
    }
    else
    {
        printf("这些数字里包括%d个答案数字。\n", snum);

        if (spos == 0)
        {
            printf("但是数字的位置都不一致。\n");
        }
        else
        {
            printf("其中有%d个数字的位置是一致的。\n",spos);
        }
    }
    printf("\n");
}

game.h:

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<time.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>






//生成4个各不相同的字符串 的声明
void make4digits(int guess[]);

//检查字符串的有效性 的声明
int check(const char buff[]);

//3.对于数字和位置是否正确的判断 的声明
void judge(const char buff[],const int guess[], int* hit, int* blow);

//4.显示判断结果 的声明
void print_result(int snum, int spos);

吐槽一下,今天这个游戏在写的时候找bug找了快两小时(两个=写成了一个=),中间写的时候还把game函数删掉了又重新写....太艰难了QAQ

今天的内容就到这里了哈!!!

要是认为作者有一点帮助你的话!

就来一个点赞加关注吧!!!当然订阅是更是求之不得!

最后的最后谢谢大家的观看!!!

你们的支持是作者写作的最大动力!!!

下期见哈!!

本文为互联网自动采集或经作者授权后发布,本文观点不代表立场,若侵权下架请联系我们删帖处理!文章出自:https://blog.csdn.net/weixin_62700590/article/details/121344998
-- 展开阅读全文 --
KillDefender 的 Beacon 对象文件 PoC 实现
« 上一篇 02-09
Web安全—逻辑越权漏洞(BAC)
下一篇 » 03-13

发表评论

成为第一个评论的人

热门文章

标签TAG

最近回复