今天我们来写斗兽棋的规则和走法
首先介绍一下斗兽棋的一些规则:
动物的实力按照鼠、猫、狗、狼、豹、虎、狮、象从小到大排列,实力大的动物可以吃掉实力比自己小的以及和自己实力相当的动物。老鼠虽小,却能反杀大象,大象虽大,却奈何不了老鼠。
除了老鼠以外,任何动物都不能进入小河。在小河中的老鼠不能吃地上的大象,同样,地上的其他动物也不能吃小河里的老鼠,小河里的老鼠可以互相吃。
走棋时只能把棋子走到相邻的一个格子中,除非是老虎和狮子可以跳到小河对岸,但如果有老鼠挡住了他们跳的线路则不能跳过小河。
当动物走进陷阱里的时候,他就失去了战斗力,任何敌方的动物都可以吃掉它。
判断胜利的条件有三个
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);