当前位置:   article > 正文

Java设计模式之从[剪刀石头布AI策略]分析策略(Strategy)模式

石头剪刀布设计模式

  策略模式是一个很easy的模式。

它定义一系列的算法,把它们一个个封装起来,而且使它们能够相互替换。

  考虑到我在做一个剪刀石头布的游戏,能够和计算机对战。

计算机的难度等级分为2个等级:普通难度和无法战胜难度。

普通难度是指电脑会随机出石头、剪刀、布。而无法战胜难度是指电脑会“作弊”。电脑会事先知道玩家出的是什么手势。

假设玩家出的是剪刀。那么电脑会出石头,玩家永远的无法取胜。

  那么,这两个难度分别代表两种算法,为了使得它们可以被游戏的主类装载,它们都应该继承于同一个接口或类。并暴露出电脑出手势的方法,代码例如以下:

  1. import java.util.Random;
  2. import java.util.Scanner;
  3. interface GameStrategy{
  4. int play(int player);
  5. }
  6. class FingerGuessing{
  7. Scanner playerScanner = new Scanner(System.in);
  8. public String toString(int finger){
  9. switch (finger){
  10. case 1:
  11. return "石头";
  12. case 2:
  13. return "剪刀";
  14. case 3:
  15. return "布";
  16. default:
  17. return "错误!";
  18. }
  19. }
  20. public void start(GameStrategy comStrategy){
  21. boolean gameOver = false;
  22. while (!gameOver){
  23. System.out.println("请出拳(按回车确认):1、石头;2、剪刀。3、布");
  24. int playerChoice = 0;
  25. while ( playerChoice <= 0 || playerChoice > 4){
  26. playerChoice = playerScanner.nextInt();
  27. }
  28. int comChoice = comStrategy.play(playerChoice);
  29. System.out.printf("你出的是%s。计算机出的是%s\n", toString(playerChoice), toString(comChoice));
  30. if (playerChoice == comChoice){
  31. System.out.println("平局");
  32. } else if (playerChoice + 1 == comChoice || playerChoice - 2 == comChoice){
  33. System.out.println("恭喜你获胜了!");
  34. gameOver = true;
  35. } else {
  36. System.out.println("非常遗憾你失败了!");
  37. gameOver = true;
  38. }
  39. }
  40. }
  41. }
  42. class Normal implements GameStrategy{
  43. public int play(int player) {
  44. Random rnd = new Random();
  45. return rnd.nextInt(3) + 1;
  46. }
  47. }
  48. class Hard implements GameStrategy{
  49. public int play(int player) {
  50. switch (player){
  51. case 1:
  52. return 3;
  53. case 2:
  54. return 1;
  55. case 3:
  56. return 2;
  57. default:
  58. return 1;
  59. }
  60. }
  61. }
  62. public class Strategy
  63. {
  64. public static void main(String[] args) {
  65. FingerGuessing guess = new FingerGuessing();
  66. System.out.println("一般难度:");
  67. guess.start(new Normal());
  68. System.out.println("你不可能获胜的难度:");
  69. guess.start(new Hard());
  70. }

  电脑的出手势方式继承于GameStrategy接口。play方法返回的是电脑出的手势(石头、剪刀、布),传入的參数player是玩家出的手势(用于无法展示难度中作弊)。在游戏类中,start方法接受一个满足GameStrategy接口的对象,也就是相当于它接受不同的算法。在main方法中。我们传入了一个普通难度的算法,以及一个无法战胜难度的算法,大家能够试着执行一下。

另外,这个模式的长处是,如果要设计一种新的难度,十分方便,仅仅要设计一个继承于GameStrategy的类。并在play方法中编写自己的算法就可以。

转载于:https://www.cnblogs.com/jzdwajue/p/7017018.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/776096
推荐阅读
相关标签
  

闽ICP备14008679号