C语言从入门到入土(入门特别篇)珠玑妙算益智小游戏
Posted 原来45
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言从入门到入土(入门特别篇)珠玑妙算益智小游戏相关的知识,希望对你有一定的参考价值。
目录
谁都不能阻挡你成为优秀的人。
//游戏题目
//珠玑妙算:是一个猜不重复数字的游戏。
//游戏流程是:出题者根据答题者的推测给予提示
//循环进行这种对话形式的处理,直到答题者猜对答案为止。
//注:数字和位置都与正确答案一致就是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
今天的内容就到这里了哈!!!
要是认为作者有一点帮助你的话!
就来一个点赞加关注吧!!!当然订阅是更是求之不得!
最后的最后谢谢大家的观看!!!
你们的支持是作者写作的最大动力!!!
下期见哈!!
以上是关于C语言从入门到入土(入门特别篇)珠玑妙算益智小游戏的主要内容,如果未能解决你的问题,请参考以下文章
汉罗塔与青蛙跳台阶的递归实现(及扩展青蛙跳台阶)C语言从入门到入土(入门篇)(算法篇p2)