一、問題概述
五子棋又稱FIR(Five in a row )。意思是連續五個棋子在一條線上。這是一種兩方對弈形式的一種益智遊戲。任何一方都可以選擇先開局、悔棋、重新開局和退出的基本功能遊戲。獲勝的標準就是任何一方先達到五個連續的棋子在一條線(包括橫線、直線或者斜線)上。
二、需求分析和流程設計
1、需求分析
人人對戰五子棋主要的需求包括:
(1)界面友好易於操作。
(2)選擇合適的控制結構、控制玩家輪流下棋。
(3)動態地生成黑白棋子。
(4)添加簡單的悔棋、重新開始等基本功能。
(5)判斷輸贏。
2、流程圖設計
三、軟件開發模型
採用邊做邊改模型
原因如下:
1、程序設計功能相對簡單。
2、程序開發週期短。
3、程序設計開發難度低。
基於上述幾點,本程序採用邊做邊改的模型,有助於減少設計階段的代價。
四、功能模塊化設計。
(1)、良好的界面設計
爲了給用戶一個友好的遊戲界面設計,直接關係到用戶的體驗,所以一個良好的合適的遊戲界面設計是一個非常重要的第一步。這一步我利用java語言中Graphics畫出簡潔大方的五子棋棋盤界面。
代碼設計:
利用Graphics中的drawLine方法分別畫出行和列的網格形狀。背景圖片利用常用棋盤添加到面板中。
for (int i = 0; i <= Rows; i++)
g.drawLine(Margin, Margin + i * Grid_Span, Margin + Cols
* Grid_Span, Margin + i * Grid_Span);
for (int j = 0; j <= Cols; j++)
g.drawLine(Margin + j*Grid_Span, Margin, Margin + j * Grid_Span,
Margin + Rows * Grid_Span);
(2)、畫出形象的黑白棋子
同樣用Graphics2D方法在棋盤上畫出棋子,棋子落在網格交叉點上.即棋子落下的座標。
代碼設計:
int xPos=chessList[i].getX()*Grid_Span+Margin;//獲得棋子落下額座標
int yPos=chessList[i].getY()*Grid_Span+Margin;
g.setColor(chessList[i].getColor());//設置顏色
colortemp=chessList[i].getColor();
if(colortemp==Color.black){
RadialGradientPaint paint = new RadialGradientPaint(xPos-Point.Diameter/2+25, yPos-Point.Diameter/2+10, 20, new float[]{0f, 1f}
, new Color[]{Color.WHITE, Color.BLACK});
((Graphics2D) g).setPaint(paint);
((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT);
}
else if(colortemp==Color.white){
RadialGradientPaint paint = new RadialGradientPaint(xPos-Point.Diameter/2+25, yPos-Point.Diameter/2+10, 70, new float[]{0f, 1f}
, new Color[]{Color.WHITE, Color.BLACK});
((Graphics2D) g).setPaint(paint);
((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT);
}
(3)、判斷輸贏
判斷輸贏是五子棋裏面最核心的部分。五子相連算法有很多種類。這裏採用用的是從8個方位進行遍歷的來判斷五子是否相連。這八個方位即東、東南、西、西南、南、北、西北、東北。
代碼設計:
建一個棋子類Point ,在該類中創建一個color屬性,便於算法在遍歷的時候根據顏色進行相應的統計。不會出現統計混亂。
private int x;
private int y;
private Color color;
遍歷算法主要根據鼠標點擊的後,獲得棋子的座標,然後根據棋子的座標進行8個方位的遍歷,只要其中一個遍歷成功。就會退出遍歷(在下棋中有可能會出現一個子會出現兩條五子兩連的情況)。這樣將有利於算法的效率提高。
其中一個方向的遍歷代碼設計:
for(int x=xIndex-1;x>=0;x--){
Color c=isBlack?Color.black:Color.white;
if(getChess(x,yIndex,c)!=null){
continueCount++;
}else
break;
}
(4)、悔棋功能
這裏需要藉助一個棋子數組chessLsit。chesslist用來統計一共有多少以下棋子,每當悔一步棋時,就從chesslist減掉一個棋子。因爲這裏的chesslist採用的是先進後出的數據結構。所以每次減掉棋子都是最新下的棋子。減掉棋子的將會要求重新下棋。
代碼設計:
if(chessCount==0)
return ;
chessList[chessCount-1]=null;
chessCount--;
if(chessCount>0){
xIndex=chessList[chessCount-1].getX();
yIndex=chessList[chessCount-1].getY();
}
isBlack=!isBlack;
repaint();
五、測試和運行結果
測試平臺:windows+myeclipse10
測試結果如下圖: