珠玑妙算益智小游戏 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


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


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


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


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


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


下期见哈!!

相关文章
|
3月前
|
安全 编译器 C语言
C++入门1——从C语言到C++的过渡
C++入门1——从C语言到C++的过渡
73 2
|
30天前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
84 3
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
3月前
|
C语言 C++
【C语言】编写“猜数字“小游戏
【C语言】编写“猜数字“小游戏
108 1
|
3月前
|
存储 API C语言
【C语言】实践:贪吃蛇小游戏(附源码)(一)
【C语言】实践:贪吃蛇小游戏(附源码)
|
3月前
|
C语言 定位技术 API
【C语言】实践:贪吃蛇小游戏(附源码)(二)
【C语言】实践:贪吃蛇小游戏(附源码)
【C语言】实践:贪吃蛇小游戏(附源码)(二)
|
3月前
|
C语言 开发者
C语言实现猜数字小游戏(详细教程)
C语言实现猜数字小游戏(详细教程)
|
3月前
|
存储 Java 编译器
初识C语言1——C语言入门介绍
初识C语言1——C语言入门介绍
37 1
|
3月前
|
C语言
回溯入门题,数据所有排列方式(c语言)
回溯入门题,数据所有排列方式(c语言)
|
3月前
|
C语言
【C语言】实践:贪吃蛇小游戏(附源码)(三)
【C语言】实践:贪吃蛇小游戏(附源码)
|
3月前
|
C语言
C语言贪吃蛇小游戏来啦!
C语言贪吃蛇小游戏来啦!
40 0