Pygame代码简化问题

我正在独自开发一个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))

目前运行结果如下:

img

我仅仅只让它绘制了两行的元素(每个元素都是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()函数:

  1. 将所有图像文件名存储在一个列表中,然后使用循环加载它们。这样可以减少重复代码,并且在需要添加或删除图像时也更容易。
  1. 使用字典将图像文件名映射到图像。这样可以在随机数生成时使用字典键来选择图像,而不是使用if-elif语句。
  1. 使用数组存储要绘制的图像。在绘制图像时可以直接通过索引访问图像
  1. 使用函数来替代重复代码
  1. 使用一个简单的类来管理图像资源,将图像资源与绘制逻辑分离.
  1. 把绘制第一行和第二行的代码放在一起,使用循环绘制.

例如:

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