1、前言

我在自己的博客里上传了一些本科时编过、最近又改良了一遍的C语言程序,已有些时日了。好家伙,要是再不搞点Java,莫不要真以为我的主方向是C语言吧!

于是乎,今天就带来一个Java编写的项目,是一个我小时候(大概2007年左右)玩过的,小灵通里自带的猜数字游戏。

说到猜数字,同志们最先想到什么?是系统生成一个随机数,让用户来猜,然后系统再告诉你“大了”、“小了”这样的猜数字游戏?拜托,这样子的未免也太简单了吧!除了用来启发二分查找(binary search)思维,对于逻辑推理能力的锻炼可以说毫无卵用。

而我此篇带来的猜数字,并非此类,请各位看官放心食用。这个猜数字对于高手以下的一般人来说还是有点难度的。它也会给提示,但它不会提示你大了小了,它只会告诉你你的正确程度如何。什么意思呢?规格解说里见。总之,我小时候特别喜欢玩这个猜数字。主要是因为它的界面上有一只非常可爱的小青蛙,每次玩的时候总能让我想起更小的时候在小霸王游戏机上面玩的大眼蛙大冒险。大多数时候我都猜不到数字,偶尔我能猜准。而猜对的话小青蛙就会开心地蹦蹦跳跳,说你“聪明绝顶”。

而在这次编程中,我也尽量去还原了童年手机游戏的原貌,包括提示的格式与猜对时的标语。只要是我能记得的,都努力去还原,以此来致敬经典。

【项目展示】一个有点难度的猜数字小游戏(Java编写)_游戏开发

2、规格说明

【外部规格】

系统随机生成一个不重复的四位数字,用户也猜一个不重复的四位数字。

系统会比较自己想的数字和用户猜的数字,并告诉用户正确的情况如何。如果用户有一位数字,既猜对了数值,又猜对了位置,则将这位数字计数为A。而如果用户猜对了数字却没有猜对位置,则计数为B。用户总计有10次机会,每猜一次,系统就会告诉用户有几A几B。一直猜到4A0B,或者10次机会全部耗尽为止,系统会公布答案。

运行示例
(系统生成的数字是:1295)←当然,程序实际运行时不会显示这句
我已经想了一个数字,你猜它是几?1234
2A0B
我已经想了一个数字,你猜它是几?5678
0A1B
我已经想了一个数字,你猜它是几?1278
2A0B
我已经想了一个数字,你猜它是几?1250
2A1B
我已经想了一个数字,你猜它是几?1259
2A2B
我已经想了一个数字,你猜它是几?1295
4A0B

♬聪明☆
    绝顶♪

【内部规格】
开发所用语言:Java
类文件数:2个
代码总行数:Test类71行+Rule类29行=100行
方法总数:Test类1个(main方法)+Rule类7个=8个

3、源代码

Rule.java

public class Rule{
	private int digit;

	public Rule(int digit){this.digit = digit;}

	public int hitCounter(int[] num, int[] guess){
		int hit = 0;
		for(int i = 0; i < this.digit; i++)
			if(num[i] == guess[i])	hit++;
		return hit;
	}

	public int blowCounter(int[] num, int[] guess){
		int blow = 0;
		for(int i = 0; i < this.digit; i++)
			for(int j = 0; j < this.digit; j++)
				if(guess[i]==num[j] && i!=j) blow++;
		return blow;
	}

	public int getThousands(int num){return num / 1000;}

	public int getHundreds(int num){return num / 100 % 10;}

	public int getTens(int num){return num / 10 % 10;}

	public int getOnes(int num){return num % 10;}
	
}

Test.java

import java.util.*;
public class Test{
	static final int DIGIT = 4;

	public static void main(String[] args){
		Random rand = new Random();
		Scanner input = new Scanner(System.in);
		Rule judge = new Rule(DIGIT);
		
		int[] number = new int[DIGIT];
		int[] guess = new int[DIGIT];
		int i = 0, j;
		int chance = 10, userInput = 0;
		int hit, blow;
		boolean isSame = false;

		//生成四位不重复的数字
		do{
			isSame = false;
			number[i] = rand.nextInt(10);
			for(j = 0; j < i; j++){
				if(number[i] == number[j]){
					isSame = true;
					break;
				}
			}
			if(isSame) continue;
			else i++;
		}while(i<DIGIT);

		while(true){
			System.out.print("我已经想了一个数字,你猜它是几?");
			userInput = input.nextInt();
			if(userInput > 9999){
				System.out.println("数位不对!应该输入四位数。");
				continue;
			}
			guess[0] = judge.getThousands(userInput);
			guess[1] = judge.getHundreds(userInput);
			guess[2] = judge.getTens(userInput);
			guess[3] = judge.getOnes(userInput);
			isSame = false;
			for(i = 0; i < DIGIT; i++){
				for(j = 0; j < i; j++){
					if(guess[i] == guess[j]){
						System.out.println("不可以输入重复的数字!请重新输入。");
						isSame = true;
						break;
					}
				}
				if(isSame) break;
			}
			if(isSame) continue;
			else chance--;

			hit = judge.hitCounter(number, guess);
			blow = judge.blowCounter(number, guess);
			System.out.printf("%dA%dB\n", hit, blow);

			if(hit == 4){
				System.out.println("♬聪明☆\n\t绝顶♪");
				break;
			}else{
				if(chance == 0){
					System.out.println("答案:"+number[0]+number[1]+number[2]+number[3]);
					System.exit(0);
				}
			}
		}
	}
}
4、运行结果
我已经想了一个数字,你猜它是几?1024
0A1B
我已经想了一个数字,你猜它是几?1234
0A0B
我已经想了一个数字,你猜它是几?5678
1A2B
我已经想了一个数字,你猜它是几?5670
1A2B
我已经想了一个数字,你猜它是几?5608
1A2B
我已经想了一个数字,你猜它是几?5078
0A3B
我已经想了一个数字,你猜它是几?0678
2A2B
我已经想了一个数字,你猜它是几?0687
4A0B
♬聪明☆
	绝顶♪

5、感想

没什么技术上的心得,那就来谈谈感想吧。纯属个人观点,仅供参考,请以你自己的观点为标准。

①有些机器好好保存,不要因为不再使用了就丢弃。因为现在技术发展飞快,也许再过几年你想怀个旧,你想怀旧的那种机器就早已被市场淘汰,不再那么容易入手了。

②多做点小项目来练Java OOP(面向对象)编程。最典型的例子就是像这样的小游戏啦,什么什么的管理系统啦(比如,图书馆、班级、饭店,等等)之类的。

今天的内容有点短,到此为止吧。

图片来源:http://www.hp91.cn/  h5游戏