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

Posted 原来45

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

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

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

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

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

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

下期见哈!!

以上是关于C语言从入门到入土(入门特别篇)珠玑妙算益智小游戏的主要内容,如果未能解决你的问题,请参考以下文章

C语言从入门到入土(入门篇)(数组p1)

C语言从入门到入土(入门篇P3)

C语言从入门到入土(入门篇)(函数p1)

汉罗塔与青蛙跳台阶的递归实现(及扩展青蛙跳台阶)C语言从入门到入土(入门篇)(算法篇p2)

《C语言深度剖析》第三章 预处理详解 p2(完结) C语言从入门到入土(进阶篇)

《C语言深度剖析》第五章 内存管理 p1(完结)( C语言从入门到入土(进阶篇)