神经科学/心理学实验经常用到一些电脑的模拟,例如检查注意力的持续注意测试(Continuous Perfomance Task,CPT),python + pygame是实现这些实验比较好的选择,下面几章将用pygame实现简单的游戏贪吃蛇来了解pygame的使用。之后还会介绍一些神经认知实验的实现。
本章首先实现的是将一条简单的蛇显示出来。用像素为10×10蓝色方块表示蛇身,三角形表示蛇头。
把它分成几个模块:(1)main.py:初始化窗口,游戏主循环。(2)snake.py:绘制并处理蛇的动作。(3)settings.py:主要的设置。(4)game_functions.py:相应键盘动作,处理事件。
# -*- coding: utf-8 -*-
# date: 2019/5/17
# author: DennisLu
# import modules
import pygame
from settings import Settings
from snake import Snake
import game_functions as gf
def run_game():
# initial game
pygame.init()
# create a screen
ai_settings = Settings()
screen = pygame.display.set_mode(ai_settings.screen_dim)
pygame.display.set_caption("snake")
# create snake
snake = Snake(ai_settings, screen, clock)
# game loop
while(True):
# listen to keyboard events
gf.check_events(ai_settings, screen, snake)
# update screen
gf.update_screen(ai_settings, screen, snake)
if __name__ == '__main__':
run_game()
pygame.display.set_mode(resolution=(0,0), flags=0, depth=0) -> Surface 输入 resolution,返回resolution大小的窗口。
pygame.display.set_caption(str) -> none 设置标题。
# -*- coding: utf-8 -*-
# date: 2019/5/18
# author: DennisLu
# import modules
import pygame
from settings import Settings
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
self.snake_len = self.ai_settings.ini_snake_len
self.snake_body = [(self.ai_settings.snake_head_x + 10 * i, self.ai_settings.snake_head_y) for i in range(1, self.snake_len) ]
# load snake images
self.head_row_image = pygame.image.load('images/snake_head.png')
self.body_image = pygame.image.load('images/snake_body.png')
# snake body moves with its head
self.head_rect = self.head_row_image.get_rect()
self.body_rect = self.body_image.get_rect()
# position the snake image
self.head_rect.x, self.head_rect.y = self.ai_settings.snake_head_x, self.ai_settings.snake_head_y
def blitme(self):
self.head_image = pygame.transform.rotate(self.head_row_image, self.direction)
self.screen.blit(self.head_image, self.head_rect)
for i in self.snake_body:
self.body_rect.x, self.body_rect.y = i[0], i[1]
self.screen.blit(self.body_image, self.body_rect)
pygame.image.load(str) -> Surface 读取图片,创建一个pygame Surface可以简单理解成pygame的图像元素。
通过蛇的头部对蛇进行定位,创建一个数组来记录蛇身。
# -*- coding: utf-8 -*-
# date: 2019/5/18
# author: DennisLu
# import module
import pygame
import sys
from time import sleep
def check_events(ai_settings, screen, snake):
for event in pygame.event.get():
if(event.type == pygame.QUIT):
pygame.quit()
sys.exit()
def update_screen(ai_settings, screen, snake):
screen.fill(ai_settings.bg_color)
snake.blitme()
pygame.display.flip()
pygame.event.get():从输入事件队列中按顺序取出事件。
pygame.Surface.fill():给平面元素填充颜色
# -*- coding: utf-8 -*-
# date: 2019/5/11
# author: DennisLu
class Settings():
"""A class to store all settings for snake"""
def __init__(self):
# screen setings
self.screen_width = 600
self.screen_height = 400
self.screen_dim = (600, 400)
self.bg_color = (200, 200, 200)
# snake settings
self.snake_head_x, self.snake_head_y = 140, 140
self.direction = 90
self.ini_snake_len = 4