基本的象棋规则已经写完了,现在要做的是如何在界面上表现。

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

本文为原创文章,转载请注明出处,欢迎访问作者网站(和而不同)

发表评论

error: Content is protected !!