说明
Chess JavaFx
配合代码阅读效果更更佳,下⽅方数字均为⾏行行数
整体设计
整体可分为四个模块:
Main, Model, View, Control.
图⽚片全在images/⾥里里头
Main
游戏的⼊入⼝口,包含所有内容(Model, View, Control)和初始窗⼝口
Model
游戏模型,负责Chess游戏的所有计算
View
游戏的GUI,通过模型的数据来画出游戏界⾯面
Control
负责游戏所有输⼊入输出操作,操控Model和View
Main
Main其实是extends的JavaFx的Application,这样的话在Main⾥里里⾯面只需要override⼀一个start就可以创
建出窗⼝口了了。Main⾸首先把(Model, View, Control)实例例化(15 – 17),然后告诉view要读取的model,告
诉control要控制的view(19-20)。22⾏行行告诉JavaFx要现实的内容(root,存储在view⾥里里)。其余
的代码(23-27)全是关于窗⼝口属性的设置(窗⼝口标题,背景颜⾊色,不不可改变⼤大⼩小)。
Model
这⼀一部分变动不不⼤大。只是在Model.java⾥里里⾯面加了了⼀一个initCustom,当玩家选择Custom模式的时候被
调⽤用,初始化Custom数据(camel,zebra rider)。
View
所有被显示的内容都放在root⾥里里⾯面,这样JavaFx才知道要显示什什么东⻄西。
整个GUI包含两部分:
棋盘,信息显示和控制区域
棋盘
在窗⼝口的上⽅方,包括两部分,棋盘背景和所有棋⼦子。
棋⼦子的图⽚片都是Image,在setModel(145)的时候被加载到⼆二维数组images⾥里里⾯面(161)。
棋盘背景就是⼀一张图⽚片,在setMode的时候就初始化(170-187)并放进被root(26)包含的
piecePane(27)⾥里里⾯面了了。
所有的棋⼦子都是ImageView(30),在setModel的时候被根据model来被初始化(163)并放进root
(164)。
信息显示和控制区域
这⼀一部分包括显示提示输⼊入名字,该哪⼀一⽅方⾛走棋,显示分数,显示Check的警告,显示赢棋,和
棋,认输,以及显示输⼊入名称的提示,开始按钮,重新开始按钮,悔悔棋按钮,认输按钮,和棋按钮。
这⼀一部分整体显示在棋盘的正下⽅方,⾼高度为⼀一个棋盘块⼉儿的边⻓长。这⼀一部分其实是⼀一个Vbox
(vertical box)包含两个Hbox(horizontal box),上下分布。第⼀一个Hbox包含输⼊入名字,该哪⼀一
⽅方⾛走棋,显示分数,显示Check的警告,显示赢棋,和棋,认输,第⼆二个Hbox包含显示输⼊入名称的
提示,开始按钮,重新开始按钮,悔悔棋按钮,认输按钮,和棋按钮。
输⼊入名字,该哪⼀一⽅方⾛走棋,赢棋,和棋,认输 – 共享⼀一个Text(33, prompt),也就是说同⼀一时间
这⼏几个只能显示⼀一个。其他都是各⾃自显示,分开的。
这些东⻄西在View被实例例化的时候(68-75)就被初始化了了,并由(81-139)定义显示属性(⼤大⼩小,
位置,字体,粗细,等等)。
refreshPieces(201-216)是保留留给control的接⼝口,作⽤用是根据更更新的model刷新view。
(219-)全部是getters。
Control
这⼀一部分掌控全局。在setView(24-27)的时候初始化输⼊入名字相关的event listener(33-47),只
有两个名字不不为空和不不相同的时候点击start才可以进⼊入游戏。(34-35)⾸首先禁⽤用start button,
(36-37)初始化两个输⼊入名字的输⼊入框的listener,只有两个名字符合条件才启⽤用start button,
(38-45)监听star button,按下去调⽤用start开始游戏(143-157)。start⾸首先询问⽤用户是否玩
custom piece(通过 Confirm Box完成,弹出新的窗⼝口,屏蔽其他窗⼝口活动),如果是custom piece
的话就控制model刷新数据(145)。然后更更新信息显示和控制区域(148-155),然后调⽤用
initListener初始化棋盘的listener(193)和按钮的listener(194)。棋盘listener很简单(200-
208),便便利利view的所有ImageView,当当前玩家和ImageView⼀一致的时候初始化它的listener:当⿏鼠
标点击的时候记录棋⼦子原始显示位置(217-222),当⿏鼠标拖动的时候更更新棋⼦子的显示位置(230-
234),当⿏鼠标松开的时候试着移动棋⼦子(231-260),调⽤用model的moveTo,如果不不能移动就把棋
⼦子放回原始位置(258-260),可以移动的话就⽤用view的refreshPieces刷新view,并检查输赢、
check,然后刷新所有棋⼦子的listener,如果有输赢或draw的话(249,280-296)就处理理输赢和draw
(135)和输赢并准备重新开始(115)。重新开始就是更更新score并且重新询问是否custom
mode,以此循环。悔悔棋按钮的listener(96-107)是弹出⼀一个窗⼝口确认,上⼀一步棋盘的情况在piece
moveTo的时候被记录了了下来,悔悔棋确认以后调⽤用model⾥里里undo来恢复上⼀一步数据。认输(75-89)
也是要先确认。和棋(61-68)要征求对⼿手的同意(弹出窗⼝口确认)。