[英]random.randint() generating a consistent pattern
I've been working on a grid-based application using pygame
, and have run into a strange problem.我一直在使用
pygame
开发基于网格的应用程序,但遇到了一个奇怪的问题。
I'm generating a list
of tiles, each of which can have 1 of 3 random colours.我正在生成一个图块
list
,每个图块都可以有 3 种随机颜色中的一种。 Every time I run the program, though, I get a fairly consistent pattern.不过,每次我运行该程序时,我都会得到一个相当一致的模式。
All these tests were right after each other, and similar results were on all runs before the tests, having a giant single-coloured blob in the bottom right.所有这些测试都是紧接着进行的,并且在测试之前的所有运行中都出现了类似的结果,右下角有一个巨大的单色斑点。
This is my tile code这是我的瓷砖代码
from enum import Enum
class Colour(Enum):
RED = 1
GREEN = 2
BLUE = 3
class Tile():
def __init__(self, _map, x : int, y : int, colour = 1):
self.x = x
self.y = y
self.map = _map
self.colour = Colour(colour)
def PrintInfo(self):
print("x: " + str(self.x) + "\ny: " + str(self.y) + "\nCol: " + str(self.colour.name))
This is where an array of tiles is made, (where the random number is generated)这是制作瓷砖阵列的地方,(生成随机数的地方)
from Tile import Tile
from random import randint
"""Map class creates a 2d array of tiles, and allows individual tiles, or
groups of tiles to be returned."""
class Map:
def __init__(self, width : int, height : int):
self.map = []
#Create a 2d array of tiles.
self.map = [[Tile(self, i, j, randint(1, 3)) for i in range(width)] for j in range(height)]
def PrintInfo(self):
#Print the info of each tile. use GetTile(x, y).PrintInfo() tp get
#individual tile into
for t in self.map:
t.PrintInfo()
def GetTile(self, x: int, y: int):
#Get tile from coords
return self.map[x][y]
This is where the visual component is made, based off a random number这是根据随机数制作视觉组件的地方
def Main(self):
#Create an array of data objects
self.map = Map(8, 8)
#Create dictionary to connect data object to display object
self.tileToObjDict = {}
for i in range(8):#change these from constants after testing
for j in range(8):
t = self.map.GetTile(i, j)#get tile at current position in loop
#t.PrintInfo()
bobj = BoxObject(self.win, t.x*self.gridSpacing, t.y*self.gridSpacing, t.x*self.gridSpacing+self.gridSpacing,
t.y*self.gridSpacing+self.gridSpacing, str(t.colour.name).lower())#Create onject based on info
self.objects.append(bobj)#add display object to render list
self.tileToObjDict[t] = bobj#connect tile to display obj in dictionary
Not needed, but code of assembled visual component不需要,但是组装可视化组件的代码
#Basic Object
class BoxObject(Object):
def __init__(self, surface, x1 = 0, y1 = 0, x2 = 0, y2 = 0, colour = 'grey', hitbox = Hitbox(EventManager())):#Take a surface, 4 coords, a colour, and an optional hitbox to manage events
super().__init__(Box(surface, Rectangle(x1,y1,x2,y2).GetCorners(),ColourManager().GetColour(colour)),
hitbox)
#draw the object for 1 frame to reference
self.drawn = draw.rect(self.graphic.surface, self.graphic.colour,(self.graphic.coord1, self.graphic.coord2))
def Update(self):
if self.visible:#Draw the object
draw.rect(self.graphic.surface, self.graphic.colour,(self.graphic.coord1, self.graphic.coord2))
if Hitbox == None:
return
if len(self.hitbox.eventM.eventList) > 0:#If the hitbox has any events to manage, manage them
for e in self.hitbox.eventM.eventList:
e()
Colour Module颜色模块
from pygame import Color
class ColourManager:
colourDict : {}#holds custom colours
def __init__(self, defaultColours = True):
self.colourDict = {}
if defaultColours:
self.AddBasicColours()
def AddColour(self, name : str, _r : int, _g : int, _b : int, _a : int = 255):
self.colourDict[name] = Color(_r, _g, _b, _a)
def GetColour(self, name : str) -> Color:
return self.colourDict.get(name)
def PrintColours(self):
for key in self.colourDict.keys():
print(key)
def AddBasicColours(self):
self.AddColour('red', 255, 0, 0)
self.AddColour('green', 0, 255, 0)
self.AddColour('blue', 0, 0, 255)
self.AddColour('grey', 100, 100, 100)
def LoadColourSheet():
"""TODO: Allow many colours to be loaded at once from txt file"""
Any help is appreciated, on either an effective alternative randomization method, or a problem with my code that could be causing this issue.感谢任何帮助,无论是有效的替代随机化方法,还是我的代码可能导致此问题的问题。
9769953 was right about it being the pattern and not the randomization. 9769953 关于它是模式而不是随机化是正确的。 I forgot about how pygame rendered shapes, and the same pattern was because of single blocks being way bigger than they should have been.
我忘记了 pygame 是如何渲染形状的,同样的模式是因为单个块比它们应该的大得多。 I had to change the x2 and y2.
我不得不改变 x2 和 y2。
#Box object: screen to draw it to, x1, y1, x2, y2, colour (x1, y1) = top left corner of box, x2 = width, y2 = height
bobj = BoxObject(self.win, t.x*self.gridSpacing, t.y*self.gridSpacing, self.gridSpacing, self.gridSpacing, str(t.colour.name).lower())#Create object based on info
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.