一、问题概述
五子棋又称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
测试结果如下图:
本文出自 “鹰之眸” 博客,转载请与作者联系!