我正在独自开发一个python游戏,第三方库为pygame
这是我用来绘制元素时用的类中的一部分:
import pygame
import random
class Resources():
def __init__(self, screen):
self.screen = screen
self.image_dirt = pygame.image.load('images\Dirt.gif')
self.image_grass = pygame.image.load("images\Grass.gif")
self.image_water = pygame.image.load("images\Water.gif")
self.image_brick = pygame.image.load("images\Brick.gif")
self.image_wood = pygame.image.load("images\Wood.gif")
self.image_sand = pygame.image.load("images\Sand.gif")
self.image_plank = pygame.image.load("images\Plank.gif")
self.image_glass = pygame.image.load("images\Glass.gif")
self.image_granite = pygame.image.load("images\Granite.gif")
self.willbeblit = []
self.willbeblit_2 = []
def blitme_tubes(self, tubes, lines):
# 开始绘制第二行元素
for i in range(1, tubes + 1):
randomNumber = random.randint(0, 10)
if randomNumber == 1:
self.willbeblit.append(self.image_grass)
elif randomNumber == 2:
self.willbeblit.append(self.image_plank)
elif randomNumber in [3, 4]:
self.willbeblit.append(self.image_wood)
elif randomNumber in [5, 6]:
self.willbeblit.append(self.image_sand)
else:
self.willbeblit.append(self.image_dirt)
for blit_res in range(0, tubes - 1):
for lines_res in range(0, lines):
# self.screen.blit(self.willbeblit[blit_res], (0 + (20 * blit_res), 260 + (20 * lines_res)))
self.screen.blit(self.willbeblit[blit_res], (0 + (20 * blit_res), 260))
# 开始绘制第二行元素
if lines > 1:
for i_2 in range(1, tubes + 1):
randomNumber_2 = random.randint(0, 10)
if randomNumber_2 == 1:
self.willbeblit_2.append(self.image_grass)
elif randomNumber_2 == 2:
self.willbeblit_2.append(self.image_plank)
elif randomNumber_2 in [3, 4]:
self.willbeblit_2.append(self.image_wood)
elif randomNumber_2 in [5, 6]:
self.willbeblit_2.append(self.image_sand)
else:
self.willbeblit_2.append(self.image_dirt)
# print(len(self.willbeblit))
for blit_res_2 in range(0, tubes - 1):
for lines_res_2 in range(0, lines):
# 选取于绘制第一行self.screen.blit(self.willbeblit[blit_res], (0 + (20 * blit_res), 260 + (20 * lines_res)))
self.screen.blit(self.willbeblit_2[blit_res_2], (0 + (20 * blit_res_2), 280))
目前运行结果如下:
我仅仅只让它绘制了两行的元素(每个元素都是20*20的正方形,每一行的元素都是要随机绘制的),方法blitme_tubes的两个实参已在main.py中传递,tubes是一行的总共的单个元素数量,lines是绘制的行数,我现在传递的两个实参分别是31和2,但是我以后还需要让它多绘制几行,因此这个方法会越来越长,可见,绘制第二行元素就只是有了一个新的列表以及将Y坐标往下推了20。
我想要简化这个方法,但我又不知道应该如何简化,故在这里请问各位开发者。
很多遊戲會預先設計好 “地圖” 並且存檔。
繪製就只需要 雙迴路,例如:
for y in range(0, 10):
for x in range( 0, 20 ):
#blit( y * height, x * width, map[y][x] )
# 需要額外取得 map[y][x] 所對應的圖片。
若对您的问题有帮助,望采纳
您可以考虑以下几种方法来简化blitme_tubes()函数:
例如:
class Resources():
def __init__(self, screen):
self.screen = screen
self.images = {'dirt': 'images/Dirt.gif',
'grass': 'images/Grass.gif',
'water': 'images/Water.gif',
'brick': 'images/Brick.gif',
'wood': 'images/Wood.gif',
'sand': 'images/Sand.gif',
'plank': 'images/Plank.gif',
'glass': 'images/Glass.gif',
'granite': 'images/Granite.gif'}
self.image_dict = {k: pygame.image.load(v) for k, v in self.images.items()}
def blitme_tubes(self, tubes, lines):
for lines_res in range(0, lines):
for blit_res in range(0, tubes - 1):
randomNumber = random.randint(1, 10)
if randomNumber == 1:
img = self