簡體   English   中英

如何移動 python 中的矩陣元素?

[英]How do I move elements of a matrix in python?

我想用鍵盤移動 object 1,使用來自 pygame 的事件,例如:pygame.key.get_pressed()。 但我不知道如何將它放在我的代碼中。

import pygame
pygame.init()
tela = pygame.display.set_mode((1000, 560))
jogo = True

class Tabuleiro:
    def __init__(self, tela, x, y):
        self.x = x
        self.y = y
        self.tela = tela
        self.maze = [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
                     [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],
                     [1, 0, 1, 1, 0, 1, 3, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1],
                     [1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 1],
                     [1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1],
                     [1, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1],
                     [1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1],
                     [1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1],
                     [1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1],
                     [1, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],
                     [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]

    def show(self):
        for col in range(20):
            for lin in range(11):
                if self.maze[lin][col] == 1:
                    self.tela.fill((255, 255, 255), rect=[self.x + col * 49, self.y + lin * 49, 49, 49])
                if self.maze[lin][col] == 2:
                    self.tela.fill((255, 255, 0), rect=[self.x + col * 30, self.y + lin * 30, 25, 25])
                if self.maze[lin][col] == 3:
                    self.tela.fill((255, 0, 0), rect=[self.x + col * 50, self.y + lin * 50, 25, 25])


maze = tabuleiro.Tabuleiro(tela, 10, 10)

while jogo:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            jogo = False

    tela.fill(0)
    maze.show()
    pygame.display.update()

而且我也不知道如何使用碰撞函數,此代碼適用於我必須作為學校作業完成的吃豆人游戲。 如果我也能得到一些關於它的提示,我很高興。 謝謝你。

首先,您需要修復迷宮的表示。 每個單元格的左上角是self.x + col * 50, self.y + lin * 50

class Tabuleiro:
    # [...]

    def show(self):
        for col in range(20):
            for lin in range(11):
                if self.maze[lin][col] == 1:
                    self.tela.fill((255, 255, 255), rect=[self.x + col * 50, self.y + lin * 50, 50, 50])
                if self.maze[lin][col] == 2:
                    self.tela.fill((255, 255, 0), rect=[self.x + col * 50 + 12, self.y + lin * 50 + 12, 25, 25])
                if self.maze[lin][col] == 3:
                    self.tela.fill((255, 0, 0), rect=[self.x + col * 50 + 12, self.y + lin * 50 + 12, 25, 25])

你需要在Tabuleiro class中添加一些方法,添加一個可以在網格中查找特定number的方法:

class Tabuleiro:
    # [...]

    def findFirst(self, number):
        for row, rowlist in enumerate(self.maze):
            for col, cell in enumerate(rowlist):
                if cell == number:
                    return row, col
        return None, None

添加一個方法來測試行索引 ( row ) 和列索引 ( col ) 是否有效:

class Tabuleiro:
    # [...]

    def testIndex(self, row, col):
        if row == None or col == None:
            return False
        if 0 <= row < len(self.maze) and 0 <= col < len(self.maze[row]):
            return True
        return False

添加一個方法來測試單元格的內容是否為特定number

class Tabuleiro:
    # [...]

    def isFieldEqual(self, row, col, number):
        if self.testIndex(row, col):
            return self.maze[row][col] == number
        return False 

添加一個交換 2 個單元格內容的方法:

class Tabuleiro:
    # [...]

    def swapFileds(self, row1, col1, row2, col2):
        if self.testIndex(row1, col1) and self.testIndex(row2, col2):
            self.maze[row1][col1], self.maze[row2][col2] = self.maze[row2][col2], self.maze[row1][col1]

Pygame中有幾種檢測按鍵按下的方法,參見How to get if a key is pressed pygame

例如,使用`KEYDOWN 事件。 每當您要移動一個 object 時,您需要測試要移動到的單元格是否為空 (0)。 移動時,僅交換單元格的內容:

while jogo:

    row, col = maze.findFirst(2)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            jogo = False

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                if maze.isFieldEqual(row, col-1, 0):
                    maze.swapFileds(row, col-1, row, col)
            if event.key == pygame.K_RIGHT:
                if maze.isFieldEqual(row, col+1, 0):
                    maze.swapFileds(row, col+1, row, col)
            if event.key == pygame.K_UP:
                if maze.isFieldEqual(row-1, col, 0):
                    maze.swapFileds(row, col, row-1, col)
            if event.key == pygame.K_DOWN:
                if maze.isFieldEqual(row+1, col, 0):
                    maze.swapFileds(row+1, col, row, col)

最小的例子:

import pygame
pygame.init()
tela = pygame.display.set_mode((1000, 560))
jogo = True

class Tabuleiro:
    def __init__(self, tela, x, y):
        self.x = x
        self.y = y
        self.tela = tela
        self.maze = [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
                     [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],
                     [1, 0, 1, 1, 0, 1, 3, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1],
                     [1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 1],
                     [1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1],
                     [1, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1],
                     [1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1],
                     [1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1],
                     [1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1],
                     [1, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],
                     [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]

    def show(self):
        for col in range(20):
            for lin in range(11):
                if self.maze[lin][col] == 1:
                    self.tela.fill((255, 255, 255), rect=[self.x + col * 50, self.y + lin * 50, 50, 50])
                if self.maze[lin][col] == 2:
                    self.tela.fill((255, 255, 0), rect=[self.x + col * 50 + 12, self.y + lin * 50 + 12, 25, 25])
                if self.maze[lin][col] == 3:
                    self.tela.fill((255, 0, 0), rect=[self.x + col * 50 + 12, self.y + lin * 50 + 12, 25, 25])

    def findFirst(self, number):
        for row, rowlist in enumerate(self.maze):
            for col, cell in enumerate(rowlist):
                if cell == number:
                    return row, col
        return None, None

    def testIndex(self, row, col):
        if row == None or col == None:
            return False
        if 0 <= row < len(self.maze) and 0 <= col < len(self.maze[row]):
            return True
        return False

    def isFieldEqual(self, row, col, number):
        if self.testIndex(row, col):
            return self.maze[row][col] == number
        return False 
    
    def swapFileds(self, row1, col1, row2, col2):
        if self.testIndex(row1, col1) and self.testIndex(row2, col2):
            self.maze[row1][col1], self.maze[row2][col2] = self.maze[row2][col2], self.maze[row1][col1]


maze = Tabuleiro(tela, 10, 10)

while jogo:

    row, col = maze.findFirst(2)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            jogo = False

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                if maze.isFieldEqual(row, col-1, 0):
                    maze.swapFileds(row, col-1, row, col)
            if event.key == pygame.K_RIGHT:
                if maze.isFieldEqual(row, col+1, 0):
                    maze.swapFileds(row, col+1, row, col)
            if event.key == pygame.K_UP:
                if maze.isFieldEqual(row-1, col, 0):
                    maze.swapFileds(row, col, row-1, col)
            if event.key == pygame.K_DOWN:
                if maze.isFieldEqual(row+1, col, 0):
                    maze.swapFileds(row+1, col, row, col)

    tela.fill(0)
    maze.show()
    pygame.display.update()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM