?? translation.java
字號:
/*
* 創建日期 2005-3-18
*
* 更改所生成文件模板為
* 窗口 > 首選項 > Java > 代碼生成 > 代碼和注釋
*/
package org.acerge.main;
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import org.acerge.engine.*;
import org.acerge.pieces.*;
public class Translation {
private int firstBout = 1;
private String gameEvent = "在家自戰賽";
private String gameRound ="1";
private String gameDate;
private String gameSite = "Home";
private String redTeam = "Wild Wolf";
private String redName = "WolfNo.1";
private String blackTeam = "SuperComputers";
private String blackName = "DeepGreen";
private String result = "?-?";
private String fenStr = "rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR w - - 0 1";
private String newLine = "\n";
private ArrayList emoveStrList;
private ArrayList cmoveStrList;
private ArrayList hisEmoveStrList=new ArrayList(); //save for history s
private ArrayList hisCmoveStrList=new ArrayList();
private ArrayList hisMoveStructList=new ArrayList();
//format: EMoveStr:C2+5 C+.5 N3-4
//format: CMoveStr::炮2進五 前炮平5 馬三退四
private ArrayList moveStructList;
//private String[] qzEName={"K","A","B","N","R","C","P"};
private String[] qzCName={"帥","仕","相","馬","車","炮","兵","將","士","象","馬","車","炮","卒"};
private String[] bCLocation={"0","1","2","3","4","5","6","7","8","9"};
private String[] rCLocation={" ","一","二","三","四","五","六","七","八","九"};
//private boolean boardReversed;
public Translation(){
Calendar c = Calendar.getInstance();
gameDate = c.get(Calendar.YEAR)+ "-"+c.get(Calendar.MONTH)+"-"+c.get(Calendar.DATE);
emoveStrList = new ArrayList();
cmoveStrList = new ArrayList();
moveStructList = new ArrayList();
}
public char getEName(char cName){
switch (cName){
case '帥':
case '將':
return 'K';
case '仕':
case '士':
return 'A';
case '相':
case '象':
return 'B';
case '馬':
return 'N';
case '車':
return 'R';
case '炮':
return 'C';
default:
return 'P';
}
}
public char getELoc(char cLoc){
switch(cLoc){
case '1':
case '一':
return '1';
case '2':
case '二':
return '2';
case '3':
case '三':
return '3';
case '4':
case '四':
return '4';
case '5':
case '五':
return '5';
case '6':
case '六':
return '6';
case '7':
case '七':
return '7';
case '8':
case '八':
return '8';
default:
return '9';
}
}
public char getEDir(char cDir){
switch (cDir){
case '進': return '+';
case '退': return '-';
default :return '.';//平
}
}
public String cStrToEStr(String CStr){
char cc1,cc2,cc3,cc4;
char ec1,ec2,ec3,ec4;
String EStr;
cc1 = CStr.charAt(0);cc2=CStr.charAt(1);
cc3=CStr.charAt(2);cc4=CStr.charAt(3);
if (cc1=='前'){
ec2 = '+';
ec1 = getEName(cc2);
}else if (cc1=='后'){
ec2 = '-';
ec1 = getEName(cc2);
}else{
ec1 = getEName(cc1);
ec2 = getELoc(cc2);
}
ec3 = getEDir(cc3);
ec4 = getELoc(cc4);
return ""+ec1+ec2+ec3+ec4;
}
public void setFenStr(String fstr){
fenStr=fstr;
}
public void addMoveInfo(final BitBoard qzBoard, final Qizi qz,int dstX,int dstY){
//qzBoard是qz的位棋盤(移動前的狀態)
int pieceType = qz.getPieceType();
char pieceName = qz.getPieceName();
if (pieceName>='a') pieceName = (char) (pieceName + 'A' - 'a');
char c1,c2,c3,c4;
String cmoveStr="",emoveStr="";
int srcX,srcY,srcX1,srcY1,srcX2,srcY2;
int hi = BitBoard.MSB(qzBoard);
int low = BitBoard.LSB(qzBoard);
srcX=qz.getCoordinateX();
srcY=qz.getCoordinateY();
srcX1=ActiveBoard.FILE[low];
srcY1=ActiveBoard.RANK[low];
srcX2=ActiveBoard.FILE[hi];
srcY2=ActiveBoard.RANK[hi];
//-----------------------------------------------------------------------
int[] pawns={-1,-1,-1,-1,-1};
if (pieceType == 6 || pieceType == 13){
int k=0;
for(int i=low;i<=hi;i++){
if ((qzBoard.opAnd(PreMoveNodesGen.BitMask[i])).notZero()){
pawns[k]=i;
k++;
}
}
boolean found=false;
for (int i=0;i<k && !found;i++){
if(ActiveBoard.FILE[pawns[i]]==srcX){
srcX1 = ActiveBoard.FILE[pawns[i]];
srcX2 = ActiveBoard.FILE[pawns[i]];
srcY1 = ActiveBoard.RANK[pawns[i]];
srcY2 = ActiveBoard.RANK[pawns[i]];
for(int j=i+1;j<k;j++){
if(ActiveBoard.FILE[pawns[j]]==srcX){
srcX2 = ActiveBoard.FILE[pawns[j]];
srcY2 = ActiveBoard.RANK[pawns[j]];
found = true;
break;
}
}
}
if(found) break;
}
}
//-----------------------------------------------------------------------
c1=pieceName;
if(srcX1==srcX2 && srcY2!=srcY1 && pieceType!=1 && pieceType!=2
&& pieceType!=8 && pieceType!=9){//士象無前后
if(srcY==srcY1 && pieceType<7 || srcY==srcY2 && pieceType>=7){
c2 = '-';
}else{
c2 = '+';
}
}else{
//if (pieceType<7 && !boardReversed || pieceType>=7 && boardReversed){
if (pieceType<7){
c2 = (char) ('0' + 9 - srcX);
}else{
c2 = (char) ('0' + 1 + srcX);
}
}
if(srcY==dstY) {
c3='.';
if (pieceType<7){
c4=(char)('0' + 9 - dstX);
}else{
c4=(char)('0' + dstX + 1);
}
}else{
if(dstX==srcX){//直線
if(srcY<dstY && pieceType<7 || srcY>dstY && pieceType>=7){
c3='+';
}else{
c3='-';
}
c4 = (char) ('0'+ Math.abs(dstY-srcY));
}else{
if(srcY<dstY && pieceType<7 || srcY>dstY && pieceType>=7){
c3 = '+';
}else{
c3 = '-';
}
if (pieceType<7){
c4 = (char) ('0' + 9 - dstX);
}else{
c4 = (char) ('0' + dstX + 1);
}
}
}
emoveStr = ""+c1+c2+c3+c4;
// begin tanslation to Chinese
if (c2=='+') {
cmoveStr="前"+qzCName[pieceType];
}else if(c2=='-'){
cmoveStr="后"+qzCName[pieceType];
}else{
cmoveStr=qzCName[pieceType]+(pieceType<7? rCLocation[c2-'0']:bCLocation[c2-'0']);
}
if (c3=='+'){
cmoveStr+="進";
}else if (c3=='-'){
cmoveStr+="退";
}else{
cmoveStr+="平";
}
cmoveStr+=(pieceType<7? rCLocation[c4-'0']:bCLocation[c4-'0']);
clearHis();
emoveStrList.add(emoveStr);
cmoveStrList.add(cmoveStr);
moveStructList.add(new MoveNode(srcX*10+srcY,dstX*10+dstY));
}
public void clearHis(){
if(hisMoveStructList.size()==0) return;
hisEmoveStrList = new ArrayList();
hisCmoveStrList = new ArrayList();
hisMoveStructList = new ArrayList();
}
public void clearCurrent(){
if(moveStructList.size()==0) return;
emoveStrList = new ArrayList();
cmoveStrList = new ArrayList();
moveStructList = new ArrayList();
}
public String getEMoveStr(){
if (emoveStrList.size()>0){
return (String) emoveStrList.get(emoveStrList.size()-1);
}
return null;
}
public String getEMoveStr(int index){
if (index<emoveStrList.size()){
return (String) emoveStrList.get(index);
}
return null;
}
public String getHisEMoveStr(){
if (hisEmoveStrList.size()>0){
return (String) hisEmoveStrList.get(hisEmoveStrList.size()-1);
}
return null;
}
public String getCMoveStr(){
if(cmoveStrList.size()>0){
return (String) cmoveStrList.get(cmoveStrList.size()-1);
}
return null;
}
public String getHisCMoveStr(){
if(hisCmoveStrList.size()>0){
return (String) hisCmoveStrList.get(hisCmoveStrList.size()-1);
}
return null;
}
public void moveHisToCurrent(){
if(hisEmoveStrList.size()>0){
emoveStrList.add(hisEmoveStrList.remove(hisEmoveStrList.size()-1));
cmoveStrList.add(hisCmoveStrList.remove(hisCmoveStrList.size()-1));
moveStructList.add(hisMoveStructList.remove(hisMoveStructList.size()-1));
}
}
public void moveCurrentToHis(){
if(emoveStrList.size()>0){
hisEmoveStrList.add(emoveStrList.remove(emoveStrList.size()-1));
hisCmoveStrList.add(cmoveStrList.remove(cmoveStrList.size()-1));
hisMoveStructList.add(moveStructList.remove(moveStructList.size()-1));
}
}
public String getCMoveStr(int index){
if (index<moveStructList.size()){
return (String) cmoveStrList.get(index);
}
return null;
}
public String[] getECMoveStr(){
String[] tmpStr=new String[2];
tmpStr[0]=getEMoveStr();
tmpStr[1]=getCMoveStr();
if(tmpStr[0]==null) return null;
return tmpStr;
}
public String[] getECMoveStr(int index){
if (index<emoveStrList.size()){
String[] tmpStr=new String[2];
tmpStr[0]=getEMoveStr(index);
tmpStr[1]=getCMoveStr(index);
return tmpStr;
}
return null;
}
public MoveNode getMoveStruct(){
if (moveStructList.size()>0){
return (MoveNode)moveStructList.get(moveStructList.size()-1);
}
return null;
}
public MoveNode getHisMoveStruct(){
if (hisMoveStructList.size()>0){
return (MoveNode)hisMoveStructList.get(hisMoveStructList.size()-1);
}
return null;
}
public MoveNode getMoveStruct(int index){
if (index<moveStructList.size()){
return (MoveNode)moveStructList.get(index);
}
return null;
}
/**
*save and read procedure
*file Format:
*[Game "Chinese Chess"]
*[Event "在家自戰賽"]
*[Round "1"]
*[Date ""]
*[Site "Home"]
*[RedTeam "Computer"]
*[Red "Engine"]
*[BlackTeam "Home"]
*[Black "GB"]
*[FenStr "rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR w - - 0 1"]
*[Result "?-?"]
*/
public void saveToFile(File f) throws IOException{
BufferedWriter outFile = new BufferedWriter(new FileWriter(f));
String sign = "\"";
// write header
outFile.write("[Event " + sign + gameEvent + sign + "]" + newLine);
outFile.write("[Round " + sign + gameRound + sign + "]" + newLine);
outFile.write("[Date " + sign + gameDate + sign + "]" + newLine);
outFile.write("[Site " + sign + gameSite + sign + "]" + newLine);
outFile.write("[RedTeam " + sign + redTeam + sign + "]" + newLine);
outFile.write("[Red " + sign + redName + sign + "]" + newLine);
outFile.write("[BlackTeem " + sign + blackTeam + sign + "]" + newLine);
outFile.write("[Black " + sign + blackName + sign + "]" + newLine);
outFile.write("[FenStr " + sign + fenStr + sign + "]" + newLine);
outFile.write("[Result " + sign + result + sign + "]" + newLine);
//System.out.println("炮2平五".substring(1,2));//2
int i,currBout=firstBout;
String cmoveStr = getCMoveStr(0);
String boutStr = ""+firstBout+".";
if (boutStr.length()<3) boutStr = " " + boutStr;
for (i=0;i<bCLocation.length;i++){
if (cmoveStr.substring(1,2).equals(bCLocation[i])){
outFile.write(boutStr + " " + " " + cmoveStr + newLine);
currBout++;
break;
}
}
//System.out.println(bCLocation);
for (i=currBout-firstBout;;){
cmoveStr = getCMoveStr(i);
if (cmoveStr != null){
boutStr = ""+currBout+".";
if (boutStr.length()<3) boutStr = " " + boutStr;
outFile.write(boutStr+cmoveStr);
i++;currBout++;
}else{
break;
}
cmoveStr = getCMoveStr(i);
if (cmoveStr != null){
outFile.write(" " + cmoveStr + newLine);
i++;
}else{
break;
}
}
outFile.flush();
outFile.close();
//begin writeBody;
}
public boolean loadFromFile(File f) throws IOException{
BufferedReader inFile = new BufferedReader(new FileReader(f));
String lineStr = "";
int i,j;
clearCurrent();
clearHis();
while ((lineStr=inFile.readLine())!=null){
i = lineStr.indexOf("\"");
j = lineStr.indexOf("\"",i+1);
i = i + 1;
if (lineStr.indexOf("Game")>=0){
}else if((lineStr.indexOf("Event")>=0)){
gameEvent = lineStr.substring(i, j);
}else if((lineStr.indexOf("Round")>=0)){
gameRound = lineStr.substring(i, j);
}else if((lineStr.indexOf("Date")>=0)){
gameDate = lineStr.substring(i, j);
}else if((lineStr.indexOf("Site")>=0)){
gameSite = lineStr.substring(i, j);
}else if((lineStr.indexOf("RedTeam")>=0)){
redTeam = lineStr.substring(i, j);
}else if((lineStr.indexOf("Red")>=0)){
redName = lineStr.substring(i, j);
}else if((lineStr.indexOf("BlackTeam")>=0)){
blackTeam = lineStr.substring(i, j);
}else if((lineStr.indexOf("Black")>=0)){
blackName = lineStr.substring(i, j);
}else if((lineStr.indexOf("FenStr")>=0)){
fenStr = lineStr.substring(i, j);
}else if((lineStr.indexOf("Result")>=0)){
result = lineStr.substring(i, j);
break;
}else {
inFile.close();
return false;
}
}
//add to hiscmoveStrList
while ((lineStr=inFile.readLine())!=null){
int index0,index1;
String tmpStr;
int start = 0;
while((index0 = getQiziIndex(lineStr,start))>=0){
tmpStr = lineStr.substring(index0,index0 + 4);
hisCmoveStrList.add(0,tmpStr);
start = index0 + 4;
}
}
//translate and add to hisemoveStrList
for (i=0;i<hisCmoveStrList.size();i++){
hisEmoveStrList.add(0,cStrToEStr((String)hisCmoveStrList.get(i)));
}
//generate moveStruct
ActiveBoard position = new ActiveBoard();
position.loadFen(fenStr);
for (i=0;i<hisEmoveStrList.size();i++){
String tmpStr = (String) hisEmoveStrList.get(i);
MoveNode move = getMoveStruct(position, tmpStr);
if (move!=null){
try{
position.movePiece(move);
}catch(ArrayIndexOutOfBoundsException e){
e.printStackTrace();
break;
}
hisMoveStructList.add(0,move);
}else{
break;
}
}
//top = moveStructList.size();
inFile.close();
if (hisMoveStructList.size()>0)
return true;
else
return false;
}
public int getQiziIndex(String lineStr,int from){
int[] index = new int[13];
index[0] = lineStr.indexOf("車",from);
index[1] = lineStr.indexOf("馬",from);
index[2] = lineStr.indexOf("炮",from);
index[3] = lineStr.indexOf("兵",from);
index[4] = lineStr.indexOf("卒",from);
index[5] = lineStr.indexOf("象",from);
index[6] = lineStr.indexOf("相",from);
index[7] = lineStr.indexOf("將",from);
index[8] = lineStr.indexOf("帥",from);
index[9] = lineStr.indexOf("仕",from);
index[10] = lineStr.indexOf("士",from);
index[11] = lineStr.indexOf("前",from);
index[12] = lineStr.indexOf("后",from);
int value = 1000;//satisfy
for (int i=0;i<index.length;i++){
if (index[i]>=0 && index[i]<value)
value = index[i];
}
if (value!=1000) {
return value;
}else{
return -1;
}
}
private MoveNode getMoveStruct(ActiveBoard position, String emoveStr){
int player = position.getPlayer();
char c1=emoveStr.charAt(0);
char c2=emoveStr.charAt(1);
char c3=emoveStr.charAt(2);
char c4=emoveStr.charAt(3);
int piece = ActiveBoard.fenPiece(c1);
piece = piece + player*7;
BitBoard pieceBoard = position.getPieceBits(piece);
int low = BitBoard.LSB(pieceBoard);
int hi = BitBoard.MSB(pieceBoard);
int srcX,srcY,srcX1,srcY1,srcX2,srcY2;
int dstX,dstY;
int i=0,j=0;
srcX1 = ActiveBoard.FILE[low];
srcX2 = ActiveBoard.FILE[hi];
srcY1 = ActiveBoard.RANK[low];
srcY2 = ActiveBoard.RANK[hi];
//srcX = srcY = 0;
int[] pawns={-1,-1,-1,-1,-1};
//Pawn's max number is 5;
if (piece == 6 || piece == 13){
int k=0;
for(i=low;i<=hi;i++){
if ((pieceBoard.opAnd(PreMoveNodesGen.BitMask[i])).notZero()){
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -