欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

用golang写一个简单的游戏(三)

程序员文章站 2024-03-18 13:52:58
...

上篇文章中,留下了一些问题。尽管我已经添加了一个设定“炸弹”,在炸弹周围的位置是不能经过的,但是炸弹的数量还是太少,所以有些单调。我想要让游戏变得丰富些,就要增加炸弹的数量。这里就有个问题,炸弹的位置是随机的话,那就可能出现炸弹堵住了去路,造成死局,上篇文章中提到的m×n的画布上最多能有多少个炸弹这个问题不是很有意义,比如下图:

用golang写一个简单的游戏(三)

这种排列是最多个炸弹的情况,但它没啥用处。我们的问题应该是最少有多少个炸弹就能造成死局。最少是2颗炸弹就可以造成死局,但这种特殊情况,我们已经做了处理–不能在起点和终点的周围有炸弹。除去这种特殊情况外的其他情况,最少有几个炸弹就能造成死局,不难想到是以下的情况:

用golang写一个简单的游戏(三)

用golang写一个简单的游戏(三)

把规律描述一下就是,取出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
}

这里有一定概率会有炸弹位置是重复的,不过这不是什么问题,可以忽略不管。看一下实际的效果图:

用golang写一个简单的游戏(三)

额……有些差强人意,尽管炸弹位置可以任意了,但是数目看起来还是太少了,没有什么难度,一个两个也没差。还是不够丰富,不需要思考就可以通过了。留着这个问题下篇文章再解决。


欢迎关注我的公众号:onepunchgo,给我留言。

用golang写一个简单的游戏(三)