Mike Qin 2023-01-20 16:30 采纳率: 50%
浏览 40
已结题

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
我想要简化这个方法,但我又不知道应该如何简化,故在这里请问各位开发者。

  • 写回答

3条回答 默认 最新

  • Flashang_sg 2023-01-20 16:56
    关注

    很多遊戲會預先設計好 “地圖” 並且存檔。
    繪製就只需要 雙迴路,例如:

    for y in range(0, 10):
        for x in range( 0, 20 ):
            #blit( y * height, x * width, map[y][x] )
    
    # 需要額外取得 map[y][x] 所對應的圖片。
    
    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月27日
  • 创建了问题 1月20日