Swing界面之五子棋小結



        我寫五子棋界面與畫圖板的方法相類似,也是用到了JFrame中創建窗體的方法,並且用JButton創建“悔棋”按鍵對象,添加到窗體上(我在窗體右邊添加了一個JPanel對象來放置按鍵)。既然要實現下棋,那就需要用到監聽器,我創建了一個Listener類,繼承了MouseListener 和ActionListener(獲得按鈕的名字),分別添加到窗體上和按鍵上。也是因爲重繪的原因,需要重寫重繪的方法(裏面包括重繪棋盤和棋子的方法)。當然爲了保存棋子,也需要一個數組隊列,與畫圖板保存圖形的方法相似,創建了一個包含了棋子顏色,位置的類,並用這個類創建數組隊列。下棋子的同時還需要標誌已下棋子的位置,避免同一個位置可以重複下棋。

       上述的都是和畫圖板類似的,因爲實踐過一次了,所以感覺難度不大。而困難的地方還是在於判斷輸贏的方法。我曾經設想過一些判斷方法,譬如從判斷所下的那顆棋子的哪一行(列)的第一顆開始判斷是否有相連的五顆,或者把黑棋(1)白棋(-1)的值相加,如果大於等於±5,就獲勝,但是這些都沒能實現,最後還是參照了書上的方法,並自己做了一些調整

	//判斷輸贏
	public int win(int r ,int c){
		int win = 0;
		int count = 0;
		//判斷行
		for(int i=c+1;i<qu.chesses.length;i++){
			if(qu.chesses[r][i]==qu.chesses[r][c]){
				count++;
			}
			else{
				break;
			}
		}
		for(int i=c;i>0;i--){
			if(qu.chesses[r][i]==qu.chesses[r][c]){
				count++;
			}
			else{
				break;
			}
		}			
		if(count>=5){
			win=1;
			count=0;
		}
		else{
			count=0;
		}
		//判斷列
		for(int i=r+1;i<qu.chesses.length;i++){
			if(qu.chesses[i][c]==qu.chesses[r][c]){
				count++;
			}
			else{
				break;
			}
		}
		for(int i=r;i>0;i--){
			if(qu.chesses[i][c]==qu.chesses[r][c]){
				count++;
			}
			else{
				break;
			}
		}

		if(count>=5){
			win=1;
			count=0;
		}
		else{
			count=0;
		}
		//判斷左上到右下
		for(int i=r+1,j=c+1;i<qu.chesses.length&&j<qu.chesses.length;i++,j++){
			if(qu.chesses[i][j]==qu.chesses[r][c]){
				count++;
			}
			else{
				break;
			}
		}
		for(int i=r,j=c;i>0&&j>0;i--,j--){
			if(qu.chesses[i][j]==qu.chesses[r][c]){
				count++;
			}
			else{
				break;
			}
		}			
		if(count>=5){
			win=1;
			count=0;
		}
		else{
			count=0;
		}
		//判斷左下到右上
		for(int i=r-1,j=c+1;i>0&&j<qu.chesses.length;i--,j++){
			if(qu.chesses[i][j]==qu.chesses[r][c]){
				count++;
			}
			else{
				break;
			}
		}
		for(int i=r+1,j=c-1;i<qu.chesses.length&&j>0;i++,j--){
			if(qu.chesses[i][j]==qu.chesses[r][c]){
				count++;
			}
			else{
				break;
			}
		}			
		if(count>=4){
			win=1;
			count=0;
		}
		else{
			count=0;
		}
		return win;
	}

 我將判斷輸贏寫成了一個方法,並且會返回一個值,如果值爲真就是贏。這樣做也更方便在每一次下棋後調用,不用重複寫代碼。

       悔棋對我來說也是一個難點,之前我一直不懂如何才能正確識別“悔棋”按鈕,加入使用MouseListener,每次點擊都會和下棋一樣判斷按鍵的座標,但是按鍵的座標從右上角(0,0)算起,由於是與畫板添加同一個監聽器的緣故,都會誤下棋子。後來雄哥教我說爲只需要爲按鍵添加ActionListener就行方纔恍然大悟,並且把悔棋的方法也寫進了ActionListener的方法裏頭。其實悔棋的方法並不難,只需要在數組隊列裏面添加一個刪除最後一個元素的方法,並在點擊“悔棋”後調用,然後使用窗體的repaint方法來重繪畫圖板即可。

      通過這幾天的學習,覺得學得比以前的都要多,雖然五子棋僅僅是寫了一個簡簡單單的界面,而且還沒有人機算法,但是我希望通過以後的學習,能夠不斷地完善這個五子棋這個工程和掌握相關的知識點。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章