實現人人五子棋簡單的java程序

一、問題概述

五子棋又稱FIR(Five in a  row )。意思是連續五個棋子在一條線上。這是一種兩方對弈形式的一種益智遊戲。任何一方都可以選擇先開局、悔棋、重新開局和退出的基本功能遊戲。獲勝的標準就是任何一方先達到五個連續的棋子在一條線(包括橫線、直線或者斜線)上。

二、需求分析和流程設計

1、需求分析

人人對戰五子棋主要的需求包括:

(1)界面友好易於操作。

(2)選擇合適的控制結構、控制玩家輪流下棋。

(3)動態地生成黑白棋子。

(4)添加簡單的悔棋、重新開始等基本功能。

(5)判斷輸贏。

2、流程圖設計

wKioL1NKVl_zzve6AADjEtvhCUs795.jpg

三、軟件開發模型

採用邊做邊改模型

原因如下:

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

測試結果如下圖:

wKiom1NKgajxg4m4AAMHbYoRxdc941.jpg

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