标签:article 相互 and turn 计算机 策略 layer rate import
策略模式是一个很easy的模式。
它定义一系列的算法,把它们一个个封装起来,而且使它们能够相互替换。
考虑到我在做一个剪刀石头布的游戏,能够和计算机对战。
计算机的难度等级分为2个等级:普通难度和无法战胜难度。
普通难度是指电脑会随机出石头、剪刀、布。而无法战胜难度是指电脑会“作弊”。电脑会事先知道玩家出的是什么手势。
假设玩家出的是剪刀。那么电脑会出石头,玩家永远的无法取胜。
那么,这两个难度分别代表两种算法,为了使得它们可以被游戏的主类装载,它们都应该继承于同一个接口或类。并暴露出电脑出手势的方法,代码例如以下:
import java.util.Random; import java.util.Scanner; interface GameStrategy{ int play(int player); } class FingerGuessing{ Scanner playerScanner = new Scanner(System.in); public String toString(int finger){ switch (finger){ case 1: return "石头"; case 2: return "剪刀"; case 3: return "布"; default: return "错误!"; } } public void start(GameStrategy comStrategy){ boolean gameOver = false; while (!gameOver){ System.out.println("请出拳(按回车确认):1、石头;2、剪刀。3、布"); int playerChoice = 0; while ( playerChoice <= 0 || playerChoice > 4){ playerChoice = playerScanner.nextInt(); } int comChoice = comStrategy.play(playerChoice); System.out.printf("你出的是%s。计算机出的是%s\n", toString(playerChoice), toString(comChoice)); if (playerChoice == comChoice){ System.out.println("平局"); } else if (playerChoice + 1 == comChoice || playerChoice - 2 == comChoice){ System.out.println("恭喜你获胜了!"); gameOver = true; } else { System.out.println("非常遗憾你失败了!"); gameOver = true; } } } } class Normal implements GameStrategy{ public int play(int player) { Random rnd = new Random(); return rnd.nextInt(3) + 1; } } class Hard implements GameStrategy{ public int play(int player) { switch (player){ case 1: return 3; case 2: return 1; case 3: return 2; default: return 1; } } } public class Strategy { public static void main(String[] args) { FingerGuessing guess = new FingerGuessing(); System.out.println("一般难度:"); guess.start(new Normal()); System.out.println("你不可能获胜的难度:"); guess.start(new Hard()); }
另外,这个模式的长处是,如果要设计一种新的难度,十分方便,仅仅要设计一个继承于GameStrategy的类。并在play方法中编写自己的算法就可以。
Java设计模式之从[剪刀石头布AI策略]分析策略(Strategy)模式
标签:article 相互 and turn 计算机 策略 layer rate import
原文地址:http://www.cnblogs.com/jzdwajue/p/7017018.html