1. 程式人生 > >控制檯五子棋遊戲類記錄

控制檯五子棋遊戲類記錄

這個文件上面的教程和我所理解的有所不同呢,果然還是需要自己來寫,文件只是提供了一個大致方向

public class ChessGame {
	int posX,posY;
	int WIN_COUNT=5;
	ChessMap map=new ChessMap();
	
	public void newQi(int posx,int posy){				//玩家新座標後更新棋盤
		map.setMap(posx, posy, ChessQizi.BLACK.getChessqizi());
	}
	
	public void newCom(){				//玩家下一步之後,此功能電腦隨機走一步
		int posx=(int)(Math.random()*(map.MAP_SIZE-1));
		int posy=(int)(Math.random()*(map.MAP_SIZE-1));
		String[][] board=map.getMap();
		while (board[posx][posy]!="+"){
			posX=(int)(Math.random()*(map.MAP_SIZE-1));
			posY=(int)(Math.random()*(map.MAP_SIZE-1));
		}
		map.setMap(posX, posY, ChessQizi.WHITE.getChessqizi());
	}
	
	public boolean inputIegal(int posx,int posy){			//判斷玩家輸入的座標是否合法
		boolean t=true;
		if (posx<0 || posx>=WIN_COUNT || posy<0 || posy>=WIN_COUNT)
			t=false;
		return t;
	}
	
	public boolean isWin(int posx,int posy){			//判斷是否有勝利
		int startX=0;
		int startY=0;
		int endX=map.MAP_SIZE-1;
		int endY=endX;
		int sameCount=0;
		int temp=0;
		boolean t=false;
		temp=posx-WIN_COUNT+1;		//計算起點的最小X左邊與Y座標
		startX=temp<0?0:temp;
		temp=posy-WIN_COUNT+1;
		startY=temp<0?0:temp;
		temp=posx+WIN_COUNT-1;		//計算終點的最大X座標與Y座標
		endX=temp>map.MAP_SIZE-1?map.MAP_SIZE-1:temp;
		temp=posy+WIN_COUNT-1;
		endY=temp>map.MAP_SIZE-1?map.MAP_SIZE-1:temp;
		
		String[][] board=map.getMap();
		for (int i=startY;i<endY;i++)
			if (board[posx][i]==board[posx][i+1])				//這裡只是橫向判斷有無五子,豎向和斜向只需更改board裡的座標即可
				sameCount++;
			else if(sameCount!=WIN_COUNT-1)
				sameCount=0;
		if (sameCount==5)
			t=true;
		return t;
	}
}
每個函式的功能都有註釋,今天主要把時間用在了這個判斷輸贏,也就是五棋相連上。

1.每次下完一顆棋子,就通過程式從橫、豎、斜各個方向掃描棋盤,如果在某個方向中,有同種顏色的棋子達到五連子,則此顏色的玩家為贏。如果沒有相同顏色的棋子達到五連子,則繼續遊戲。該判斷方法需要遍歷整個棋盤,也就是意味著每次下棋後(玩家或者“電腦”)都需要對棋盤進行遍歷,這樣對程式的效能會造成一定的影響。

2.每次下完一顆棋子,以該棋子為中心,掃描在此棋子所在範圍內的橫、豎、斜方向,驗證加上此棋子有沒有形成五連子,如果形成五連子,則下棋子的玩家為贏。此方法與前面的方法比較,因為不需要掃描整個棋盤,所以更加快速,本章程式使用的是此方法。

可以看出,(00),(03),(06),(30),(60),(37),(73),(77)這些座標都是此黑棋能形成五連子的最小或者最大位置的棋子,如果各個方向有足夠的空間,就延伸到第五顆棋子,如果沒有,就只延伸到邊界。所以,只要能計算出任意一顆棋子的這些位置,我們就可以判斷遊戲的輸贏,並且是以該棋子為中心向周圍進行遍歷。

首先是計算出在這顆棋子的直線上(橫、豎、斜方向)能達到五連子的最小xy座標與最大xy座標,然後從最小xy座標訪問到最大xy座標,如果此顏色棋子的相連累積數目達到五連子,則為贏。以上程式碼只是實現橫向遍歷判斷,豎向遍歷與斜向遍歷的判斷方法與橫向遍歷的實現基本類似。這裡需要注意的是,當遇到一個可以相邊的棋子,就需要為

sameCount值加1

以上為文件裡面的教程,移過來供大家學習參考。

然後今天還有一個問題就是,現在寫的是類,這個類裡面的屬性posX,posY應該如何使用,差點搞不明白,都是在按自己的邏輯思維在寫。現在我可以很清晰的講出我寫的意思,就等最後再看吧,有問題了再解決。