五子棋小游戏的分析和设计
1、系统分析
面向对象分析方法,站在用户的角度回答两个问题:
(1)系统中应该有什么对象?
a.棋盘
b.棋局:多个棋子构成的某一时刻的状态
c.游戏:系统总控对象,接收用户的操作指令,并按照用户的操作指令控制棋盘和棋局。
(2)每个对象都应该有什么属性和方法?
棋盘 |
||
属性 |
rows |
行数 |
cols |
列数 |
|
size |
每一个格子的尺寸 |
|
margin |
棋盘离窗口的边距 |
|
方法 |
init |
初始化 |
convert |
将物理坐标(像素)转换为逻辑坐标(行号,列号) |
|
getWidth |
获取棋盘的宽度(这个暂时可能考虑不到,在后续过程中才会考虑到这一点,设计也不一定就是一步到位) |
|
getHeight |
获取棋盘的高度 |
棋局 |
||
属性 |
chesses |
当前棋局状态 方案1:描述每一个棋子的状态 棋子:{行号,列号,颜色},颜色用0、1表示 对应的棋局:[{1,3,1},{2,1,1},{2,2,0}] 方案2:描述每一个落点的状态 落点:0-无子;1-有黑子;-1-有白子 对应的棋局: [ [0,0,0,0,0,0] [0,0,0,1,0,0] [0,1,-1,0,0,0] [0,0,0,0,0,0] [0,0,0,0,0,0] [0,0,0,0,0,0] ] |
turn |
当前轮到谁落子(1-黑方;-1-白方) |
|
方法 |
init |
初始化 |
exist |
判断某个位置是否有棋子 |
|
win |
判断输赢,即是否连成了五个及以上的同颜色棋子 |
|
add |
落子 |
游戏 |
||
属性 |
board |
棋盘 |
chess |
棋局 |
|
|
|
|
|
|
|
方法 |
init |
初始化 |
drawBoard |
绘制棋盘 |
|
drawChess |
绘制棋子 |
|
handle |
接收并处理用户的落子指令 |
2、系统设计
a. 棋盘(Board)
考虑到棋盘的属性在游戏过程中是不变的,所以可以将其属性和方法设计成静态的,那么初始化的方法就应该由静态代码块来完成。
转换:Point convert(int x, int y)
增加一个坐标类Point,描述行号和列号
b. 棋局(Chess)
定义常量(0-无子,1-黑子,-1-白子)
初始化: void init(),也可以使用构造函数
判断是否某个落点有棋子:boolean exist(Point p)
判断输赢:int isWin(Point p)
落子:void add(Point p)
c. 游戏
初始化 void init(),也可以使用构造函数
处理落子指令 void handle(int x, int y)
绘制棋盘void drawBoard()
绘制棋子void drawChess(Point p,int turn)