2007-08-03

猜数字游戏

关键字: 代码
引用
猜数字的游戏,很多人都玩过吧,规则是这样的:随机产生一个由4个不同数字串,如0257。玩家输入自己猜测的数字如:4567,此时系统将给出提示 1a1b,1a表示有猜中一个数字,且位置正确(7),1b表示猜中一个数字,且位置不正确,如此猜下去,直到所猜数字返回4a0b为止。

现在转换角色,让程序来玩这个游戏,用户输入10个不同的A-Z的字母,然后程序猜测这10个字母是什么样的排列组合,平台将告知程序xayb,让程序尽量用最少的次数解出答案。


先作出一个出题机。
package com.maodajun.javaeye2;

public class GuessNumber {
	String primitive ="";
	public GuessNumber(String primitive){
		this.primitive=primitive;
	}
        public GuessNumber(){
		
		List list = new ArrayList();
		String primitive = "";
		for(int i = 0 ; i < 26 ; i ++){
			char tmp = (char) ('A'+i);
			list.add( Character.toString(tmp));
			
		}
		int j =-1;
		for(int i = 0 ; i <10 ; i++){		 
			j =r.nextInt(list.size());
			primitive+=list.remove(j);
		}
		this.primitive=primitive;
	
		
	}
	
	public String guessOne(String guessone){
		if(primitive.equalsIgnoreCase(guessone) ){
			return primitive.length()+"a"+0+"b";
			
		}
		char[] oldchars = primitive.toCharArray();
		char[] guesschars = guessone.toCharArray();
		int a = 0 ; 
		int b =0;
		for(int i  = 0 ; i < oldchars.length ||i < guesschars.length ; i++ ){
			if(oldchars[i]==guesschars[i]){
				oldchars [i ]= '0';
				guesschars[i]='0';
				a++;
				
			}
		}
		for(int i = 0 ; i < oldchars.length ; i ++){
			
			if(guessone.indexOf(oldchars[i])>0){
				b++;
				oldchars[i]='0';
			}
		}
		
		
		return a+"a"+b+"b";
	}

}

测试 代码:
package com.maodajun.javaeye2;

import junit.framework.TestCase;

public class GuessNumberTest extends TestCase {
	public GuessNumber gn= null;
	public static void main(String[] args) {
		junit.textui.TestRunner.run(GuessNumberTest.class);
	}

	protected void setUp() throws Exception {
		super.setUp();
	}

	protected void tearDown() throws Exception {
		super.tearDown();
	}

	/*
	 * Test method for 'com.maodajun.javaeye2.GuessNumber.guessOne(String)'
	 */
	public void testGuessOne() {
		gn = new GuessNumber("ABCD");
		assertEquals("4a0b",gn.guessOne("ABCD"));
		assertEquals("0a0b",gn.guessOne("EFGH"));
		assertEquals("1a0b",gn.guessOne("AEFG"));
		assertEquals("0a1b",gn.guessOne("EAFG"));

	}

}
评论
Lich_Ray 2007-08-16
LS 明明只写了一个出题目的游戏...我怎么可能没看清原题。

PS: 区别不是很大?你那个版本不但只能猜字母,而且还只能猜4个字母;而我写的可以猜任意个数的同类型常量,比如 game = startGame "BODXA"。/* smile */ 这道 AI 的题应该也不难,以后再说。
抛出异常的爱 2007-08-09
你没读懂。
这个题目是说怎么样才能用电脑猜出预设数字。
是个人工智能的题。

PS:50行与5行的区别不是很大。。。。。我认为
Lich_Ray 2007-08-03
崩溃,这么长 。花 5 分钟用 Haskell 写了一个:
startGame ns = ans (0, 0) ns
	where ans r _ [] = r
		ans (a, b) (m:ms) (x:xs)
			| m == x = ans (a + 1, b) ms xs
			| elem x ns = ans (a, b + 1) ms xs
			| True = ans (a, b) ms xs

在互交解释器里执行
game = startGame [5,1,0,3]
即可开始一个新游戏 game,参数是你猜的数列,返回一个元组(A, B)。
引用

Main> game [0,1,2,3]
(2,1) :: (Integer,Integer)
Main> game [4,5,6,7]
(0,1) :: (Integer,Integer)
Main> game [0,1,3,5]
(1,3) :: (Integer,Integer)
Main> game [1,3,5,0]
(0,4) :: (Integer,Integer)
Main> game [5,1,3,0]
(2,2) :: (Integer,Integer)
Main> game [5,1,0,3]
(4,0) :: (Integer,Integer)
Main>

博主应该庆幸我没有就此发篇博客叫做《五行与五十行的区别》
发表评论

您还没有登录,请登录后发表评论

抛出异常的爱
搜索本博客
我的相册
1569dbfd-b702-3ce0-a83c-605b146f22c2-thumb
长椅
共 39 张
存档
最新评论