⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 translation.java

📁 用jav语言开发的基于J2SE平台的中国象棋.供大家参考和学习
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*
 * 创建日期 2005-3-18
 *
 * 更改所生成文件模板为
 * 窗口 > 首选项 > Java > 代码生成 > 代码和注释
 */
package chinesechess.main;

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;

import chinesechess.engine.*;
import chinesechess.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 + -