用golang寫一個簡單的遊戲(三)

上篇文章中,留下了一些問題。儘管我已經添加了一個設定“炸彈”,在炸彈周圍的位置是不能經過的,但是炸彈的數量還是太少,所以有些單調。我想要讓遊戲變得豐富些,就要增加炸彈的數量。這裏就有個問題,炸彈的位置是隨機的話,那就可能出現炸彈堵住了去路,造成死局,上篇文章中提到的m×n的畫布上最多能有多少個炸彈這個問題不是很有意義,比如下圖:

max-booms.png

這種排列是最多個炸彈的情況,但它沒啥用處。我們的問題應該是最少有多少個炸彈就能造成死局。最少是2顆炸彈就可以造成死局,但這種特色情況,我們已經做了處理--不能在起點和終點的周圍有炸彈。除去這種特殊情況外的其他情況,最少有幾個炸彈就能造成死局,不難想到是以下的情況:

min-booms.png

min-booms2.png

把規律描述一下就是,取出m和n之中的最小數min,min除以3,如果整除則是min/3,如果有餘數,則是min/3+1。那麼只要小於min,炸彈的位置就可以任意擺放了。

代碼修改一下:

func GetRoundParams(round int) RoundParams {
    once.Do(func() {
        roundParams = RoundParams{
            Height:  10,
            Width:   10,
            BoomNum: 1,
            BoomPosition: [][]int{
                {5, 5},
            },
        }
        switch round {
        case 1:
            roundParams = RoundParams{
                Height:     10,
                Width:      10,
                StartPoint: []int{0, 0},
                EndPoint:   []int{9, 9},
            }
            roundParams.BoomNum = minBooms(roundParams.Height, roundParams.Width)
            bp := make([][]int,0)
            tp := make([][]int,0)
                        rand.Seed(time.Now().UnixNano())
            for i := 0; i < roundParams.BoomNum - 1; i++ {
                x := rand.Intn(roundParams.Width-3) + 2
                y := rand.Intn(roundParams.Height-3) + 2
                bp = append(bp, []int{x, y})
                tp = append(tp, []int{x - 1, y}, []int{x + 1, y}, []int{x, y - 1}, []int{x, y + 1},)
            }
            roundParams.BoomPosition = bp
            roundParams.TrapPosition = tp
        }
    })

    return roundParams
}

func minBooms(h, w int) int {
    min := h
    if h-w > 0 {
        min = h
    }
    boomNum := min / 3
    if boomNum%3 != 0 {
        boomNum++
    }
    return boomNum
}

這裏有一定概率會有炸彈位置是重複的,不過這不是什麼問題,可以忽略不管。看一下實際的效果圖:

boom1.png

額……有些差強人意,儘管炸彈位置可以任意了,但是數目看起來還是太少了,沒有什麼難度,一個兩個也沒差。還是不夠豐富,不需要思考就可以通過了。留着這個問題下篇文章再解決。


歡迎關注我的公衆號:onepunchgo,給我留言。

image

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章