一个简单的猜拳小游戏(C语言实现)

一个简单的猜拳小游戏(C语言实现)

小伙伴们,对C语言编程有疑问的,可以加微信交流:poo_poo或者扫描我的头像,验证时请注明是“知友”

这个小游戏的原题是“C primer plus 5版” 第8章编程题4。

一、题目描述


二、题目及思路分析

2.1 从题述来看,有如下几个关键点需要思考,以及这些关键点对应的解决思路如下:

2.1.1 关键点1.获取用户的输入

你要和计算机玩这个猜数游戏,那么,你得以某种方式告知计算机如何获取你的输入吧。比如计算机猜了一个数,你得告诉计算机猜大了还是猜小了。然后计算机再根据你的指示继续猜测。


2.1.2 关键点2.处理用户的异常输入

你和计算机玩游戏,计算机再等着你的指示,你却输入了一个莫名其妙的指示,那么计算机也要能处理你的瞎输入。


2.1.3 关键点3.二分搜索策略

二分搜索策略,是怎么个策略?


2.1.4 关键点4.你骗了计算机

题述中说,你如果没有骗计算机,计算机会很快猜出。但是你蛋疼,就是要骗人家,那么计算机该如何处理?


2.2 思路分析

针对2.1提出的几个关键点,我们来一一破解。

2.2.1 关键点1.获取用户的输入

思路:我们预先定义一个规则:

如果计算机猜大了,你输入“g”告诉它大了;

如果计算机猜小了,你输入“l”告诉它小了;

如果计算机猜对了,你输入“y”告诉它猜对了;

如果计算机被骗了,你输入“n”告诉它被骗了;

对于这种一次只接收1个字符的情况,getchar函数最好了。


2.2.2 关键点2.处理用户的异常输入

2.2.1中,我们定义了你应该输入的字符集。但是你可能会出于故意或者无意,输入一些定义之外的字符集,比如你输入了“gg”,或者你输入了“daf”等无意义的东西,那么你需要使用getchar函数清除掉这些垃圾数据。


2.2.3 关键点3.二分搜索策略

这个才是本题的重点。可以设置一个最高值100,一个最低值1,还有一个当前值。如果计算机猜测的数字大了,那么更新最高值为当前值,最低值不变,当前值=(最高值 + 最低值)/2;如果计算机猜测的数字小了,那么更新最低值为当前值,最高值不变,当前值=(最高值 + 最低值)/2。


2.2.4 关键点4.你骗了计算机

你骗了人家,那么计算机就要继续从50猜起,所以可以重置猜测的数为50.


3.代码

OS:Windows XP sp3

编译器:TDM-GCC 4.9.2 32-bit Release

根据上述分析,代码如下:

#include <stdio.h>
#include <ctype.h>

void ClearBuff()
{
	int ch;

	while( (ch = getchar()) != '\n')
	continue;
}

int main(void)
{
    int ch = 0, guess = 50, begin = 1, end = 100;

    printf("我猜,你的数字是: %d ,对吗?\n", guess); 
    while ((ch = getchar()) != EOF)
    {
    	if( (ch <= ' ') || (ch == '\t') )
		{
			continue;
		}

		if(isalpha(ch))
		{
			if(isupper(ch))
			{
				ch = ch + 32;
			}
		}

    	if( 'y' == ch )
    	{
    		puts("哈哈我猜对了!");
            ClearBuff();
			break; 
		}

    	switch(ch)
    	{
		    case 'g':
            end = guess;
            guess = (begin + end) / 2;
            printf("我猜,你的数字是: %d ,对吗?\n", guess);
            ClearBuff();
            break;

            case 'l':
            begin = guess;
            guess = (begin + end) / 2;
            printf("我猜,你的数字是: %d ,对吗?\n", guess);
            ClearBuff();
            break;

            case 'n':
          	puts("做人要诚信!");
            begin = 1;
            end = 100;
            guess = 50;
            printf("我猜,你的数字是: %d ,对吗?\n", guess);
            ClearBuff();
            break;

		    default:
           	puts("我看不懂你在说什么!");
        	ClearBuff();
        	break;
		}
    }

    puts("再见!");

    return 0;
}


4.运行结果



5.技术点

完成这道题,需要掌握的技术点其实就是getchar函数的使用。本题中,使用getchar函数,我们完成了3件事:

1)接收缓冲区中的字符;

2)丢弃到不需要的数据;

3)判断输入的结束。


6.算法点

二分搜索算法。“二分搜索”的思想在很多地方都会用到,比如在有序列表中二分查找一个数,二叉树中查找一个数等。

编辑于 2017-08-10 13:45