用Go写一个中国象棋(八)| 象棋规则
基本的象棋规则已经写完了,现在要做的是如何在界面上表现。
Game结构体
打开game.go,修改代码:
type Game struct {
sqSelected int // 选中的格子
mvLast int // 上一步棋
bFlipped bool //是否翻转棋盘
bGameOver bool //是否游戏结束
showValue string //显示内容
images map[int]*ebiten.Image //图片资源
audios map[int]*audio.Player //音效
audioContext *audio.Context //音效器
singlePosition *PositionStruct //棋局单例
}
增加bGameOver、showValue,用来表示棋局结束。
clickSquare
func (g *Game) clickSquare(screen *ebiten.Image, sq int) {
pc := 0
if g.bFlipped {
pc = g.singlePosition.ucpcSquares[squareFlip(sq)]
} else {
pc = g.singlePosition.ucpcSquares[sq]
}
if (pc & sideTag(g.singlePosition.sdPlayer)) != 0 {
//如果点击自己的棋子,那么直接选中
g.sqSelected = sq
g.playAudio(MusicSelect)
} else if g.sqSelected != 0 && !g.bGameOver {
//如果点击的不是自己的棋子,但有棋子选中了(一定是自己的棋子),那么走这个棋子
mv := move(g.sqSelected, sq)
if g.singlePosition.legalMove(mv) {
if g.singlePosition.makeMove(mv) {
g.mvLast = mv
g.sqSelected = 0
if g.singlePosition.isMate() {
// 如果分出胜负,那么播放胜负的声音,并且弹出不带声音的提示框
g.playAudio(MusicGameWin)
g.showValue = "Your Win!"
g.bGameOver = true
} else {
// 如果没有分出胜负,那么播放将军、吃子或一般走子的声音
if g.singlePosition.checked() {
g.playAudio(MusicJiang)
} else {
if pc != 0 {
g.playAudio(MusicEat)
} else {
g.playAudio(MusicPut)
}
}
}
} else {
g.playAudio(MusicJiang) // 播放被将军的声音
}
}
//如果根本就不符合走法(例如马不走日字),那么不做任何处理
}
}
在选中棋子进行移动之前,加入规则判断。
messageBox
//messageBox 提示
func (g *Game) messageBox(screen *ebiten.Image) {
fmt.Println(g.showValue)
tt, err := truetype.Parse(fonts.ArcadeN_ttf)
if err != nil {
fmt.Print(err)
return
}
arcadeFont := truetype.NewFace(tt, &truetype.Options{
Size: 16,
DPI: 72,
Hinting: font.HintingFull,
})
text.Draw(screen, g.showValue, arcadeFont, 180, 288, color.White)
text.Draw(screen, "Click mouse to restart", arcadeFont, 100, 320, color.White)
}
truetype.Parse解析字体。
truetype.NewFace初始化字体。
text.Draw在屏幕上显示内容。
Update
增加游戏结束之后的处理:
func (g *Game) Update(screen *ebiten.Image) error {
if inpututil.IsMouseButtonJustPressed(ebiten.MouseButtonLeft) {
x, y := ebiten.CursorPosition()
x = Left + (x-BoardEdge)/SquareSize
y = Top + (y-BoardEdge)/SquareSize
g.clickSquare(screen, squareXY(x, y))
}
g.drawBoard(screen)
if g.bGameOver {
g.messageBox(screen)
}
return nil
}
运行程序之后 ,棋子的走法必须符合它的规则,否则无法移动。
如果小伙伴们想学习更多这方面的知识,可以访问http://www.xqbase.com/computer/stepbystep2.htm
在下一节中,我们将学习如何加入AI,实现和电脑的对弈?
0