📄 chess.java
字号:
/*十行九列棋谱
* 黑
* 1 2 3 4 5 6 7 8 9
* 车 马 象 士 将 士 象 马 车
* 空 空 空 空 空 空 空 空 空
* 空 炮 空 空 空 空 空 炮 空
* 卒 空 卒 空 卒 空 卒 空 卒
* 空 空 空 空 空 空 空 空 空
* ----楚河 汉界-----
* 空 空 空 空 空 空 空 空 空
* 兵 空 兵 空 兵 空 兵 空 兵
* 空 炮 空 空 空 空 空 炮 空
* 空 空 空 空 空 空 空 空 空
* 车 马 相 士 帅 士 相 马 车
*
* 九 八 七 六 五 四 三 二 一
* 红
*
* 一开始不考虑颜色,只考虑两种棋子
*/
package com.catking.chess;
import com.catking.Utility.*;
import com.catking.Manager.*;
import java.util.*;
import org.eclipse.swt.graphics.GC;
abstract public class Chess implements ChessKind{
protected int x;
protected int y;
protected int color;
protected Stack<ChessState> pre_chesses_stack;
protected char name;
public Chess(int color){
this.color = color;
this.pre_chesses_stack = new Stack<ChessState>();
}
////////////
public void paint(){
ChessPane.canvas.paint(x, y, name, color == ATTACK_UP);
}
public void showCursor(){
if(BoardStateManager.isGaming()){
if(ChessPane.pre_player != color )
ChessPane.canvas.showSelectedCursor();
else
ChessPane.canvas.resetCursor();
}
}
public boolean showSelectedEffect(){
boolean isOK = false;
if(ChessPane.pre_player != color){
ChessPane.canvas.showSelectedEffect(x, y, name, color == ATTACK_UP);
isOK = true;
}
return isOK;
}
/////////////
public int setPos(int x, int y, boolean alternative) {
if(alternative && ChessPane.pre_player == color) //已经动过棋子了!!
return BoardStateManager.CANNOT_PUT_CHESS;
Set<Position>p = availableSteps();
boolean isOK = p.contains(new Position(x, y));
String wavFileName = null;
if(isOK){
//更新ChessPane
if(ChessPane.chesses[x][y].color == KONG)
wavFileName = "Wav/mov.wav";
else
wavFileName = "Wav/eat.wav";
Utilities.playSound(wavFileName);
//记录被占领的棋子的信息和原来棋子的位置
this.pre_chesses_stack.add(
new ChessState(
ChessPane.chesses[x][y],
this.x, this.y,
ChessPane.isJiangJunState[color],
ChessPane.isJiangJunState[3 - color]));
//侵占
ChessPane.chesses[x][y] = this;
Kong kong = new Kong(KONG);
kong.x = this.x;
kong.y = this.y;
ChessPane.chesses[this.x][this.y] = kong;
this.x = x;
this.y = y;
//标志自己动的棋子
ChessPane.pre_player = color;
//记录上一步是不是已经被将了
boolean isAlreadyJiangJun = ChessPane.isJiangJunState[color];
//检测并且更新全局被将情况
ChessPane.checkJiangJunState();
//检测自己动完棋子后是不是仍然处于被将状态,如果被将,就输掉了比赛
if(ChessPane.isJiangJunState[color] && isAlreadyJiangJun){
//输了
//语音提示
//Utilities.delay(2000);
Utilities.playSound("Wav/endGame.wav");
ChessPane.canvas.showGameOver(color != ATTACK_UP);
return BoardStateManager.GAME_OVER;
}
//自己失误将自己的军,不行的!!
else if(ChessPane.isJiangJunState[color]){
undo();
//重新得到棋权
ChessPane.pre_player = 3 - color;
return BoardStateManager.CANNOT_PUT_CHESS;
}
//记录双方最后一步棋
ChessPane.prePosition[color] = new Position(x, y);
return BoardStateManager.CAN_PUT_CHESS;
}
return BoardStateManager.CANNOT_PUT_CHESS;
}
/* 首先意识到将军方法的复杂性
* 1.自己动过棋子后,应该检测包括该棋子在内的所以可以将对方军的棋子是否已经将对方的军
* 2.检测动过棋子后,自己将军的被将情况
* 3.更新被将状态标志(对方和自己)
*
* 解决方案,每个棋子只负责自己对老将的威胁
* 然后由表盘统一检查(调用每个可能将军的棋子)两个老将的被将状态
*/
public boolean isJiangJun(){
boolean isOK = false;
Set<Position>p = availableSteps();
int index = 3 - color; //得到对方将军位置1->2 2->1
isOK = p.contains(ChessPane.jiangPos[index]);
//对方被将军了咯
if(isOK){
Utilities.playSound("Wav/jiangjun.wav");
//更新对方被将状态
ChessPane.isJiangJunState[index] = true;
}
return isOK;
}
public boolean undo(){
if(this.pre_chesses_stack.isEmpty())
return false;
//得到最近进去的棋子
ChessState state = this.pre_chesses_stack.pop();
ChessPane.chesses[x][y] = state.chess;
x = state.x;
y = state.y;
ChessPane.chesses[state.x][state.y] = this;
ChessPane.isJiangJunState[color] = state.myBossSafe;
ChessPane.isJiangJunState[3 - color] = state.hisBossSafe;
//更新最后一步棋的位置
ChessPane.prePosition[color] = new Position(x, y);
return true;
}
abstract public void go();
abstract public Set<Position> availableSteps();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -