心理学实验学习pygame编程-贪吃蛇(2)

这节是让snake相应键盘并且能移动。

(1)首先给每一个方向指定一个移动的标记,并且给头部图片加上一个旋转角度。(snake.py)

class Snake():
    """
    class of a snake:
    snake_head: use to local a snake
    """
    def __init__(self, ai_settings, screen):
        self.ai_settings = ai_settings
        self.screen = screen
        
        # ......

        # set snake direction up:0, right:90 down:180 left: 270
        self.direction = self.ai_settings.direction

        # moving flag
        self.moving_right = False
        self.moving_left = False
        self.moving_up = False
        self.moving_down = False

(2)响应键盘事件,根据键盘输入改变移动标记和改变蛇头部图片的角度。(game_functions.py)

pygame图片旋转角度是逆时针计算,这里根据图片把向上定为0度。还有就是蛇不能朝着反方向转向,只能向左或右转90°。

def check_events(ai_settings, screen, snake):
    for event in pygame.event.get():
        if(event.type == pygame.QUIT):
            pygame.quit()
            sys.exit()
        elif(event.type == pygame.KEYDOWN):
            check_keydown_events(event, snake)


def check_keydown_events(event, snake):
    if(event.key == pygame.K_RIGHT and snake.moving_left != True):
        snake.moving_right = True
        snake.moving_up = False
        snake.moving_down = False
        snake.direction = 270
    elif(event.key == pygame.K_LEFT and snake.moving_right != True):
        snake.moving_left = True
        snake.moving_up = False
        snake.moving_down = False
        snake.direction = 90
    elif(event.key == pygame.K_UP and snake.moving_down != True):
        snake.moving_up = True
        snake.moving_left = False
        snake.moving_right = False
        snake.direction = 0
    elif(event.key == pygame.K_DOWN and snake.moving_up != True):
        snake.moving_down = True
        snake.moving_left = False
        snake.moving_right = False
        snake.direction = 180

(3)处理当蛇的移动机蛇走出边界的情况(snake.py)。

当蛇出了一侧边界,我们就让它在对侧边界相应的位置再次出现。蛇一次的移动距离固定为组成蛇图片每个正方形的边长,蛇的速度 = 步长 * 频率。

蛇的移动方式,是让蛇的头部作出移动,然后蛇身体的每一个方形图片移动到它们前一个图形的位置上。

class snake():
    # ......
    
    def update(self):
        screen_rect = self.screen.get_rect()
        time_passed = self.clock.tick(self.ai_settings.snake_speed_factor)

        # move snake
        if(self.moving_right):
            if(self.head_rect.right < screen_rect.right):
                self.snake_body = [(self.head_rect.x, self.head_rect.y)] + self.snake_body[:-1]
                self.head_rect.centerx += self.ai_settings.step
            else:
                self.head_rect.right = 0
        elif(self.moving_left):
            if(self.head_rect.left > 0):
                self.snake_body = [(self.head_rect.x, self.head_rect.y)] + self.snake_body[:-1]
                self.head_rect.centerx -= self.ai_settings.step
            else:
                self.head_rect.left = screen_rect.right
        elif(self.moving_up):
            if(self.head_rect.top > 0):
                self.snake_body = [(self.head_rect.x, self.head_rect.y)] + self.snake_body[:-1]
                self.head_rect.centery -= self.ai_settings.step
            else:
                self.head_rect.top = screen_rect.bottom
        elif(self.moving_down):
            if(self.head_rect.bottom < screen_rect.bottom):
                self.snake_body = [(self.head_rect.x, self.head_rect.y)] + self.snake_body[:-1]
                self.head_rect.centery += self.ai_settings.step
            else:
                self.head_rect.bottom = 0

 

转载于:https://my.oschina.net/avenger222/blog/3058971

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值