Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用随机模块获得更好的结果_Python_Python 3.x_Random - Fatal编程技术网

Python 如何使用随机模块获得更好的结果

Python 如何使用随机模块获得更好的结果,python,python-3.x,random,Python,Python 3.x,Random,我目前正在用Python制作一个扫雷游戏,但我在重新分配地雷方面遇到了一些问题: 为了选择不同矿井的位置,我使用Pythonrandom模块生成x和y坐标。首先,我选择在玩家第一次玩之前放置所有地雷,但问题是,第一次玩通常是一个地雷或一个有地雷作为邻居的cas。所以我决定在玩家第一次玩游戏后放置地雷,以确保第一个CA不会有地雷作为邻居,但问题是地雷的重新分配对于地雷游戏来说不是很有趣。我怎样才能做得更好 以下是我的函数,在玩家首次玩后将地雷放置在棋盘类中,其中pos是第一个CA的坐标:

我目前正在用Python制作一个扫雷游戏,但我在重新分配地雷方面遇到了一些问题:

为了选择不同矿井的位置,我使用Python
random
模块生成x和y坐标。首先,我选择在玩家第一次玩之前放置所有地雷,但问题是,第一次玩通常是一个地雷或一个有地雷作为邻居的cas。所以我决定在玩家第一次玩游戏后放置地雷,以确保第一个CA不会有地雷作为邻居,但问题是地雷的重新分配对于地雷游戏来说不是很有趣。我怎样才能做得更好

以下是我的函数,在玩家首次玩后将地雷放置在棋盘类中,其中pos是第一个CA的坐标:

    def place_mines(self, pos):
        posed_mines = 0
        while posed_mines < self.mines_number:
            x = random.randrange(0, COLUMN_NUMBER-1)
            y = random.randrange(0, LINE_NUMBER-1)
            if not self.Matrix[y][x].is_mined and (x < pos[0]-1 or x > pos[0]+1) and (y < pos[1]-1 or y > pos[1]+1):
                self.Matrix[y][x].mine()
            posed_mines += 1
def place_mines(self,pos):
所提出的方法=0
当提出地雷<自我地雷编号:
x=random.randrange(0,第1列)
y=随机。随机范围(0,第1行)
如果不是自矩阵,则矩阵[y][x]被挖掘和(xpos[0]+1)和(ypos[1]+1):
self.Matrix[y][x].mine()
构成的(u+1)
游戏的结果是:

以下是在玩家首次游戏之前放置所有地雷的功能:

    def place_mines(self):
        posed_mines = 0
        while posed_mines < self.mines_number:
            x = random.randrange(0, COLUMN_NUMBER-1)
            y = random.randrange(0, LINE_NUMBER-1)
            if not self.Matrix[y][x].is_mined:
                self.Matrix[y][x].mine()
                posed_mines += 1
def place_mines(self):
所提出的方法=0
当提出地雷<自我地雷编号:
x=random.randrange(0,第1列)
y=随机。随机范围(0,第1行)
如果不是self,则矩阵[y][x]是:
self.Matrix[y][x].mine()
构成的(u+1)
游戏的结果是:


我的问题不是重复的,因为在链接的问题上,地雷的放置不是在玩家第一次玩后进行的

如果你不关心时间/空间的复杂性,并且棋盘足够小,你不需要关心,你可以使用
random.sample()
进行选择:

import random, itertools

def place_mines(self, pos):
    available_cells = set(itertools.product(range(COLUMN_NUMBER-1), range(LINE_NUMBER-1))))
    available_cells.remove(pos)
    for x, y in random.sample(available_cells, self.mines_number):
        self.Matrix[y][x].mine()
如果
mines\u number
明显小于电路板的大小,则会有更高效的计算解决方案,但只要上面的代码不需要在紧密循环中运行,并且电路板的大小合理,上述贴图生成就可以了



现在,关于代码风格的不相关评论:为什么要使用
第1列
第1行
?如果
列号
行号
是self.MATRIX的大小,这看起来像是一个off by one错误。通常情况下,您只需使用
range(len(lst))
random.randrange(0,len(lst))
即可获得与
lst
大小相同的范围,而不必将
len(lst)
减去1。

可能的重复,您正在防止地雷出现在第一次猜测的整行和整列中,不仅仅是一个正方形(“cas”?)问题与随机模块无关,而是在你拒绝某些位置的逻辑中。@jonrsharpe我不明白。为什么我要拒绝wole行和列?@jornsharpe我怎么能重写我的条件?因为你拒绝x和y的逻辑是错误的;您对垂直和水平放置的检查是独立的。如果你看你发布的图片,你可以清楚地看到两条“条纹”,三个正方形宽,没有地雷,它们在第一个正方形上相交。此外,关于这是否算作“冒充”地雷的缩进看起来很可疑,你永远不能用这两个片段将地雷放在最后一行或最后一列。