用java编写斗兽棋2之规则与走法

本文详细介绍了使用Java编程实现斗兽棋的规则和走法,包括动物的实力顺序、小河规则、跳跃规则、吃子规则、合法移动判断以及胜利条件。通过设计一系列函数如riverlegal、occupycamp、distancelegal、jumplegal、eatlegal和islegalmove,实现了游戏逻辑。此外,还讲述了走棋函数move的实现以及判断胜利的函数campoccupied、haspieceleft和haslegalmove。最后,通过构建JFrame展示游戏界面。
摘要由CSDN通过智能技术生成

今天我们来写斗兽棋的规则和走法
首先介绍一下斗兽棋的一些规则:

动物的实力按照鼠、猫、狗、狼、豹、虎、狮、象从小到大排列,实力大的动物可以吃掉实力比自己小的以及和自己实力相当的动物。老鼠虽小,却能反杀大象,大象虽大,却奈何不了老鼠。

除了老鼠以外,任何动物都不能进入小河。在小河中的老鼠不能吃地上的大象,同样,地上的其他动物也不能吃小河里的老鼠,小河里的老鼠可以互相吃。

走棋时只能把棋子走到相邻的一个格子中,除非是老虎和狮子可以跳到小河对岸,但如果有老鼠挡住了他们跳的线路则不能跳过小河。

当动物走进陷阱里的时候,他就失去了战斗力,任何敌方的动物都可以吃掉它。

判断胜利的条件有三个
1.己方动物走进敌方兽穴
2.对方动物全部被吃掉
3.对方动物无法走动

首先,针对规则和走法,我一共设计了六个函数,分别是riverlegal,occupycam,distancelegal,jumplegal,eatlegal,和最终的islegalmove。这里个函数并不是并列的,他们之间也会相互影响,而且很重要的一点,在写这些函数的时候要随时注意空指针的情况,一旦出现要及时用条件语句规避掉。

下面我来一一讲解,
第一个函数riverlegal(MyLabel a,MyLabel b),这里涉及到了两个参数,第一个参数为动物原来所在的格子,第二个参数为动物要去的格子,其他五个函数的参数也是如此。
riverlegal顾名思义就是说除了老鼠以外,任何动物都不能进入小河。它的代码也相对来说非常简单,不做过多解释。

private static boolean riverlegal(MyLabel a,MyLabel b) {
     MyIcon icon=(MyIcon) a.getIcon();  
     if(getname(icon)=="mouse") {
      return true;
     }
     else {
      if(b.getIcon()!=null) {
      **这里就是在规避空指针的情况,空指针的出现大多数是因为一般来说棋子
      都会走到一个空的格子上,这个格子上没有Icon,所以用getIcon()是就会出现空指针的问题。**
      MyIcon icon1=(MyIcon) b.getIcon();
       return(!(getname(icon1)=="river"));
      }
      return true;
     }
    }

接下来是occupycamp,这个函数只是为了检查动物是否合理地占据了兽穴,代码也非常简单。

private static boolean occupycamp(MyLabel a,MyLabel b) {
     if(b.row==3&&b.col==0) {这是蓝方兽穴所在位置,只有红方动物能够占据
      if(getside((MyIcon) a.getIcon())=="red") {      
       return true;
      }
      else return false;
     }
     else if(b.row==3&&b.col==8) {这是红方兽穴所在位置,只有蓝方动物能够占据
      if(getside((MyIcon) a.getIcon())=="blue") {
       return true;
      }
      else return false;
     }
     return true; 如果b所在格子并非兽穴,则不考虑这个问题
    }

接下来是distancelegal,最简单的代码,只有一行,判断动物是否走到相邻的一格里。

private static boolean distancelegal(MyLabel a,MyLabel b) {    
     return(Math.abs(a.row-b.row)+Math.abs(a.col-b.col)==1);行与列差距的和只能为一
    }

jumplegal和eatlegal就没那么友善了
先看jumplegal,他背后的规则是“老虎和狮子可以跳到小河对岸,但如果有老鼠挡住了他们跳的线路则不能跳过小河。”我在这里用到了Set,因为Set里面的数字会自动从小到大排序。

private static boolean jumplegal(MyLabel a,MyLabel b) {
     int left=Math.min(a.row, b.row);横跳的时候找到左边的那个
     int top=Math.min(a.col, b.col);纵跳的时候找到上面的那个
     Set<Integer> row=new HashSet<Integer>();根据横条的两点建立Set
     row.add(a.row);
     row.add(b.row);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值