完善小游戏逻辑

This commit is contained in:
2024-10-16 01:34:36 +08:00
parent 2f8d833006
commit 7986bb1c9b
2 changed files with 91 additions and 52 deletions
+81 -46
View File
@@ -1,8 +1,8 @@
package views package views
import ( import (
"fmt"
"fyne.io/fyne/v2" "fyne.io/fyne/v2"
"fyne.io/fyne/v2/canvas"
"fyne.io/fyne/v2/container" "fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/dialog" "fyne.io/fyne/v2/dialog"
"fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/theme"
@@ -12,51 +12,77 @@ import (
) )
func TenChinaGameView() { func TenChinaGameView() {
myApp := fyne.CurrentApp() game := NewTenGame(nil)
myWindow := myApp.NewWindow("Game") game.StartShow()
gridWrap := container.NewGridWrap(fyne.NewSize(100, 100))
game := NewTenGame(2, func(i int) {
fmt.Println("win", i)
dialog.ShowInformation("游戏结束", fmt.Sprintf("%d 获得胜利", i), myWindow)
//myWindow.Close()
})
for _, i := range game.Items {
gridWrap.Add(container.NewBorder(nil, nil, nil, nil, i))
}
myWindow.SetContent(container.NewScroll(gridWrap))
myWindow.Resize(fyne.NewSize(320, 318))
myWindow.CenterOnScreen()
myWindow.Show()
} }
type TenGame struct { type TenGame struct {
lock sync.Mutex lock sync.Mutex
playerMax int
CurrentRoundPlayer int playerMax int // 玩家总人数
players [][]int playerID2Image map[int]fyne.Resource // 各个玩家对应的图标
Items []*widget.Button defaultImage fyne.Resource
winCallback func(int)
CurrentRoundPlayer int // 当前行动的玩家
players [][]int // 各个玩家已完成下棋数据
winCallback func(int) // 胜利返回
Items []*canvas.Image // 各个板块对象
w fyne.Window
itemSize fyne.Size //单个格子大小
itemX float32 // 格子总数x
itemY float32 // 格子总数y
} }
func NewTenGame(playerMax int, winCallback func(int)) *TenGame { func NewTenGame(winCallback func(int)) *TenGame {
game := &TenGame{ game := &TenGame{
playerMax: playerMax, playerID2Image: map[int]fyne.Resource{
0: theme.RadioButtonIcon(),
1: theme.CancelIcon(),
},
defaultImage: theme.CheckButtonIcon(),
CurrentRoundPlayer: 0, CurrentRoundPlayer: 0,
players: make([][]int, playerMax), players: make([][]int, 2),
winCallback: winCallback, winCallback: winCallback,
itemSize: fyne.NewSize(100, 100),
itemX: 3,
itemY: 3,
}
return game
} }
var items = make([]*widget.Button, 9) func (t *TenGame) StartShow() {
for i := 0; i < 9; i++ { myApp := fyne.CurrentApp()
var itemIndex = i myWindow := myApp.NewWindow("Game")
var item = widget.NewButton("", func() { t.w = myWindow
game.Play(0, itemIndex) myWindow.SetContent(t.CanvasObject())
}) myWindow.Resize(fyne.NewSize(t.itemX*t.itemSize.Width+20, t.itemY*t.itemSize.Height+20))
item.SetIcon(theme.FyneLogo()) myWindow.CenterOnScreen()
items[i] = item myWindow.Show()
} }
game.Items = items
return game func (t *TenGame) CanvasObject() fyne.CanvasObject {
gridWrap := container.NewGridWrap(t.itemSize)
for i := 0; i < int(t.itemX*t.itemY); i++ {
var itemIndex = i
image := canvas.NewImageFromResource(t.defaultImage)
image.FillMode = canvas.ImageFillOriginal
image.Resize(t.itemSize) //fy
t.Items = append(t.Items, image)
toggle := widget.NewButton("", func() {
t.Play(0, itemIndex)
})
toggle.Resize(t.itemSize)
//toggle.Alignment = 3
gridWrap.Add(container.NewBorder(nil, nil, nil, nil, container.NewWithoutLayout(image, toggle)))
}
return container.NewScroll(gridWrap)
} }
func (t *TenGame) Play(userIndex int, pos int) error { func (t *TenGame) Play(userIndex int, pos int) error {
@@ -67,8 +93,9 @@ func (t *TenGame) Play(userIndex int, pos int) error {
//} //}
t.play(pos) t.play(pos)
// 推进
t.CurrentRoundPlayer++ t.CurrentRoundPlayer++
if t.CurrentRoundPlayer+1 > t.playerMax { if t.CurrentRoundPlayer+1 > len(t.playerID2Image) {
t.CurrentRoundPlayer = 0 t.CurrentRoundPlayer = 0
} }
return nil return nil
@@ -80,27 +107,35 @@ func (t *TenGame) Play(userIndex int, pos int) error {
7, 8, 9 7, 8, 9
*/ */
func (t *TenGame) play(pos int) { func (t *TenGame) play(pos int) {
// TODO // 更新玩家数据
playerIntList := t.players[t.CurrentRoundPlayer] playerIntList := t.players[t.CurrentRoundPlayer]
playerIntList = append(playerIntList, pos) playerIntList = append(playerIntList, pos)
// 刷新数据
if t.CurrentRoundPlayer == 1 {
t.Items[pos].SetIcon(theme.ConfirmIcon())
} else {
t.Items[pos].SetIcon(theme.CancelIcon())
}
// check 胜利 判断
slices.Sort(playerIntList)
t.players[t.CurrentRoundPlayer] = playerIntList t.players[t.CurrentRoundPlayer] = playerIntList
// 刷新展示
t.Items[pos].Resource = t.playerID2Image[t.CurrentRoundPlayer]
t.Items[pos].Refresh()
// check 胜利 判断
if t.winCheck(playerIntList) { if t.winCheck(playerIntList) {
endView := widget.NewButton("关闭", func() {
t.w.Close()
})
img := canvas.NewImageFromResource(t.playerID2Image[t.CurrentRoundPlayer])
img.FillMode = canvas.ImageFillOriginal
v := container.NewBorder(nil, endView, nil, nil,
container.NewBorder(nil, nil, img, nil, widget.NewLabel("胜利")))
dialog.NewCustomWithoutButtons("游戏结束", v, t.w).Show()
if t.winCallback != nil {
t.winCallback(t.CurrentRoundPlayer) t.winCallback(t.CurrentRoundPlayer)
} }
} }
}
func (t *TenGame) winCheck(playerIntList []int) bool { func (t *TenGame) winCheck(playerIntList []int) bool {
fmt.Println("playerIntList:", playerIntList) slices.Sort(playerIntList)
if isArithmeticSequence(playerIntList, 1) || if isArithmeticSequence(playerIntList, 1) ||
isArithmeticSequence(playerIntList, 2) || isArithmeticSequence(playerIntList, 2) ||
isArithmeticSequence(playerIntList, 3) || isArithmeticSequence(playerIntList, 3) ||
+6 -2
View File
@@ -22,7 +22,7 @@ import (
) )
func mainUserViews(w fyne.Window) fyne.CanvasObject { func mainUserViews(w fyne.Window) fyne.CanvasObject {
TenChinaGameView()
var userCard = widget.NewCard("", "", nil) var userCard = widget.NewCard("", "", nil)
user1 := repo.User.GetUserInfo(global.DB) user1 := repo.User.GetUserInfo(global.DB)
refresh := func(user *models.Users) { refresh := func(user *models.Users) {
@@ -43,7 +43,11 @@ func mainUserViews(w fyne.Window) fyne.CanvasObject {
} else { } else {
status = "离线" status = "离线"
} }
userCard.SetContent(widget.NewLabel(fmt.Sprintf("状态:%s", status))) v := container.NewVBox(
widget.NewLabel(fmt.Sprintf("状态:%s", status)),
widget.NewButton("游戏", TenChinaGameView),
)
userCard.SetContent(v)
} }
refresh(user1) refresh(user1)
return container.NewBorder(widget.NewToolbar( return container.NewBorder(widget.NewToolbar(