有人知道为什么吃豆子不尊重墙壁吗?当我按下按键在墙壁之间移动吃豆子时

问题描述

我正在尝试制作一个像 pygame 一样的吃豆人游戏,现在我只想让他穿过迷宫而不超出迷宫的墙壁。但是我遇到了一些问题,当我按下按键移动吃豆人时,他最终在墙之间打电话,虽然他没有超过墙,但最终会干扰坐标系并在游戏命令期间开始出现一系列错误.有谁知道为什么会发生这种情况以及如何解决

import pygame
pygame.init()
window = pygame.display.set_mode((800,600),0)
# Color used in the game
YELLOW = (255,255,0)
BLACK = (0,0)
BLUE = (13,56,143)
speed = 1
class Scenery:
    def __init__(self,size,character):
        self.character = character
        self.size = size 
        self.matrix = [
            [2,2,2],[2,1,2]
        ]
    def paint_line(self,surface,line_index,line):
        for column_index,column in enumerate(line):
            x_Box = column_index * self.size
            y_Box = line_index * self.size
            half_size = self.size // 2
            color = BLACK
            if column == 2:
                color = BLUE
            pygame.draw.rect(surface,color,(x_Box,y_Box,self.size,self.size),0)
            if column == 1:
                pygame.draw.circle(surface,YELLOW,(x_Box + half_size,y_Box + half_size),self.size//10,0)
    def paint_scenery(self,surface):
        for line_index,line in enumerate(self.matrix):
            self.paint_line(surface,line)
    def calculate_rules(self):
        column_character = self.character.intention_column
        line_character = self.character.intention_line    
        if 0 <= column_character < 28 and 0 <= line_character < 29: 
            if self.matrix[line_character][column_character] != 2:
                self.character.aprove_movement() 
class Pacman:
    def __init__(self,size):
        self.column = 1
        self.line = 1
        self.x_center = 400
        self.y_center = 300
        self.size = size # 2x radius and size/number of the cells
        self.speed_x = 0
        self.speed_y = 0
        self.radius = self.size // 2
        self.intention_column = self.column
        self.intention_line = self.line

    def calculate_rules(self):
        # calculate the movimentantion
        self.intention_column =  self.intention_column + self.speed_x
        self.intention_line = self.intention_line + self.speed_y
        self.x_center = int( self.column * self.size + self.radius ) 
        self.y_center = int( self.line * self.size + self.radius )

    def draw_pacman(self,surface):
        # Draw pacman's character
        pacman_body = pygame.draw.circle(surface,(self.x_center,self.y_center),self.radius,0)
        
        
        # Coordinates
        x_eye_position = ( self.x_center + int( self.radius/4 ) )
        y_eye_position = ( self.y_center - int( (self.radius/2) ) )
        point_a = (self.x_center,self.y_center) # Center
        point_b = ((self.x_center + self.radius),self.y_center) # Right Center
        point_c = ((self.x_center + self.radius),(self.y_center - self.radius)) # Superior Right Center
        points = [point_a,point_b,point_c]
        # Pacman 
        pacman_eye = pygame.draw.circle(surface,BLACK,(x_eye_position,y_eye_position),int(self.radius/10),0)
        pacman_mouth = pygame.draw.polygon(surface,points,0)
        # Make the draws
        pacman_body 
        pacman_eye
        pacman_mouth
    
    def calculate_events(self,events):
        for e in events:
            if e.type == pygame.QUIT: # check if the user have clicked on the X Box to quit
                exit()
            elif e.type == pygame.KEYDOWN:
                if e.key == pygame.K_RIGHT or e.key == pygame.K_d:
                    self.speed_x = speed
                elif e.key == pygame.K_LEFT or e.key == pygame.K_a:
                    self.speed_x = -speed
                elif e.key == pygame.K_UP or e.key == pygame.K_w:
                    self.speed_y = -speed
                elif e.key == pygame.K_DOWN or e.key == pygame.K_s:
                    self.speed_y = speed
            elif e.type == pygame.KEYUP:
                if e.key == pygame.K_RIGHT or e.key == pygame.K_d:
                    self.speed_x = 0
                elif e.key == pygame.K_LEFT or e.key == pygame.K_a:
                    self.speed_x = 0
                elif e.key == pygame.K_UP or e.key == pygame.K_w:
                    self.speed_y = 0
                elif e.key == pygame.K_DOWN or e.key == pygame.K_s:
                    self.speed_y = 0

    def aprove_movement(self):
        self.column = self.intention_column
        self.line = self.intention_line
       
    
if __name__ == '__main__':
    size = 600 // 30
    pacman = Pacman(size)
    scenary = Scenery(size,pacman)  
    

    while True:

        # Game Rules
        pacman.calculate_rules()
        scenary.calculate_rules()

        
        # figures
        window.fill(BLACK)
        scenary.paint_scenery(window)
        pacman.draw_pacman(window)
        pygame.display.update()
        pygame.time.delay(100)

        
        events = pygame.event.get()
        pacman.calculate_events(events)
        
 

所以每次我按住键移动几秒钟,吃豆人就会越过项目的蓝色墙壁,有谁知道为什么以及如何修复它?

看起来他只是传送到另一边,而不是角色坐标系的错误

解决方法

有两个问题:

  1. intention_columnintention_line 取决于当前的 columeline,而不是之前的 intention_columnintention_line。即使有墙,intention_columnintention_line 也会递增。 columeline 但是只有在可能移动时才会增加:
class Pacman:
    # [...]

    def calculate_rules(self):
        # calculate the movimentantion
        self.intention_column =  self.column + self.speed_x
        self.intention_line = self.line + self.speed_y
  1. 仅在更改 x_centery_center 时更新 columnline
class Pacman:
    # [...]

    def aprove_movement(self):
        self.column = self.intention_column
        self.line = self.intention_line
        self.x_center = int( self.column * self.size + self.radius ) 
        self.y_center = int( self.line * self.size + self.radius )

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...