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)