上篇文章中,留下了一些問題。儘管我已經添加了一個設定“炸彈”,在炸彈周圍的位置是不能經過的,但是炸彈的數量還是太少,所以有些單調。我想要讓遊戲變得豐富些,就要增加炸彈的數量。這裏就有個問題,炸彈的位置是隨機的話,那就可能出現炸彈堵住了去路,造成死局,上篇文章中提到的m×n的畫布上最多能有多少個炸彈這個問題不是很有意義,比如下圖:
這種排列是最多個炸彈的情況,但它沒啥用處。我們的問題應該是最少有多少個炸彈就能造成死局。最少是2顆炸彈就可以造成死局,但這種特色情況,我們已經做了處理--不能在起點和終點的周圍有炸彈。除去這種特殊情況外的其他情況,最少有幾個炸彈就能造成死局,不難想到是以下的情況:
把規律描述一下就是,取出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
}
這裏有一定概率會有炸彈位置是重複的,不過這不是什麼問題,可以忽略不管。看一下實際的效果圖:
額……有些差強人意,儘管炸彈位置可以任意了,但是數目看起來還是太少了,沒有什麼難度,一個兩個也沒差。還是不夠豐富,不需要思考就可以通過了。留着這個問題下篇文章再解決。
歡迎關注我的公衆號:onepunchgo,給我留言。