游戏截图
引入库
import copy
import random
import sys
import pygame
初始化模型
snake_list = [ [ 10 , 10 ] ]
x = random. randint( 10 , 490 )
y = random. randint( 10 , 490 )
food_point = [ x, y]
food_r, food_g, food_b = random. randint( 0 , 255 ) , random. randint( 0 , 255 ) , random. randint( 0 , 255 )
food_color = pygame. Color( food_r, food_g, food_b)
move_up = False
move_down = False
move_left = False
move_right = True
score= 0
pygame. init( )
screen = pygame. display. set_mode( ( 500 , 500 ) )
title = pygame. display. set_caption( '贪吃蛇' )
clock = pygame. time. Clock( )
获取键盘事件
for event in pygame. event. get( ) :
if event. type == pygame. QUIT:
running= False
sys. exit( )
if event. type == pygame. KEYDOWN:
if event. key == pygame. K_DOWN or event. key == pygame. K_s:
move_up = False
move_down = True
move_left = False
move_right = False
if event. key == pygame. K_UP or event. key == pygame. K_w:
move_up = True
move_down = False
move_left = False
move_right = False
if event. key == pygame. K_LEFT or event. key == pygame. K_a:
move_up = False
move_down = False
move_left = True
move_right = False
if event. key == pygame. K_RIGHT or event. key == pygame. K_d:
move_up = False
move_down = False
move_left = False
move_right = True
if event. key == pygame. K_ESCAPE:
running= False
sys. exit( )
if event. key == pygame. K_SPACE and not running:
running= True
snake_list = [ [ 10 , 10 ] ]
score= 0
移动贪吃蛇
snake_len = len ( snake_list) - 1
while snake_len > 0 :
snake_list[ snake_len] = copy. deepcopy( snake_list[ snake_len - 1 ] )
snake_len -= 1
if move_up:
snake_list[ snake_len] [ 1 ] -= 10
if snake_list[ snake_len] [ 1 ] < 0 :
snake_list[ snake_len] [ 1 ] = 500
if move_down:
snake_list[ snake_len] [ 1 ] += 10
if snake_list[ snake_len] [ 1 ] > 500 :
snake_list[ snake_len] [ 1 ] = 0
if move_left:
snake_list[ snake_len] [ 0 ] -= 10
if snake_list[ snake_len] [ 0 ] < 0 :
snake_list[ snake_len] [ 0 ] = 500
if move_right:
snake_list[ snake_len] [ 0 ] += 10
if snake_list[ snake_len] [ 0 ] > 500 :
snake_list[ snake_len] [ 0 ] = 0
吃食物逻辑
if food_rect. collidepoint( snake_pos) :
snake_list. append( food_point)
food_point = [ random. randint( 10 , 490 ) , random. randint( 10 , 490 ) ]
food_r, food_g, food_b = random. randint( 0 , 255 ) , random. randint( 0 , 255 ) , random. randint( 0 , 255 )
food_color = pygame. Color( food_r, food_g, food_b)
score+= 1
break
碰撞到自身逻辑
snake_head_rect = snake_rect[ 0 ]
count = len ( snake_rect)
while count > 1 :
if snake_head_rect. colliderect( snake_rect[ count - 1 ] ) :
running= False
count -= 1
结束游戏
if not running:
show_text( screen, ( 20 , 200 ) , 'GAME OVER!' , ( 227 , 29 , 18 ) , False , 100 )
show_text( screen, ( 120 , 300 ) , 'press space to try again' , ( 223 , 223 , 223 ) , False , 30 )
显示文字函数
def show_text ( screen, pos, text, color, font_bold= False , font_size= 60 , font_italic= False ) :
cur_font = pygame. font. SysFont( '宋体' , font_size)
cur_font. set_bold( font_bold)
cur_font. set_italic( font_italic)
text_fmt = cur_font. render( text, 1 , color)
screen. blit( text_fmt, pos)
完整代码
import copy
import random
import sys
import pygame
def show_text ( screen, pos, text, color, font_bold= False , font_size= 60 , font_italic= False ) :
cur_font = pygame. font. SysFont( '宋体' , font_size)
cur_font. set_bold( font_bold)
cur_font. set_italic( font_italic)
text_fmt = cur_font. render( text, 1 , color)
screen. blit( text_fmt, pos)
snake_list = [ [ 10 , 10 ] ]
x = random. randint( 10 , 490 )
y = random. randint( 10 , 490 )
food_point = [ x, y]
food_r, food_g, food_b = random. randint( 0 , 255 ) , random. randint( 0 , 255 ) , random. randint( 0 , 255 )
food_color = pygame. Color( food_r, food_g, food_b)
move_up = False
move_down = False
move_left = False
move_right = True
pygame. init( )
screen = pygame. display. set_mode( ( 500 , 500 ) )
title = pygame. display. set_caption( '贪吃蛇' )
clock = pygame. time. Clock( )
running= True
score= 0
while True :
clock. tick( 20 )
screen. fill( [ 255 , 255 , 255 ] )
for event in pygame. event. get( ) :
if event. type == pygame. QUIT:
running= False
sys. exit( )
if event. type == pygame. KEYDOWN:
if event. key == pygame. K_DOWN or event. key == pygame. K_s:
move_up = False
move_down = True
move_left = False
move_right = False
if event. key == pygame. K_UP or event. key == pygame. K_w:
move_up = True
move_down = False
move_left = False
move_right = False
if event. key == pygame. K_LEFT or event. key == pygame. K_a:
move_up = False
move_down = False
move_left = True
move_right = False
if event. key == pygame. K_RIGHT or event. key == pygame. K_d:
move_up = False
move_down = False
move_left = False
move_right = True
if event. key == pygame. K_ESCAPE:
running= False
sys. exit( )
if event. key == pygame. K_SPACE and not running:
running= True
snake_list = [ [ 10 , 10 ] ]
score= 0
snake_len = len ( snake_list) - 1
while snake_len > 0 :
snake_list[ snake_len] = copy. deepcopy( snake_list[ snake_len - 1 ] )
snake_len -= 1
if move_up:
snake_list[ snake_len] [ 1 ] -= 10
if snake_list[ snake_len] [ 1 ] < 0 :
snake_list[ snake_len] [ 1 ] = 500
if move_down:
snake_list[ snake_len] [ 1 ] += 10
if snake_list[ snake_len] [ 1 ] > 500 :
snake_list[ snake_len] [ 1 ] = 0
if move_left:
snake_list[ snake_len] [ 0 ] -= 10
if snake_list[ snake_len] [ 0 ] < 0 :
snake_list[ snake_len] [ 0 ] = 500
if move_right:
snake_list[ snake_len] [ 0 ] += 10
if snake_list[ snake_len] [ 0 ] > 500 :
snake_list[ snake_len] [ 0 ] = 0
if running:
show_text( screen, ( 200 , 20 ) , f'score: {
score} ' , ( 0 , 0 , 0 ) , False , 30 )
food_rect = pygame. draw. circle( screen, food_color, food_point, 15 )
snake_rect = [ ]
for snake_pos in snake_list:
snake_rect. append( pygame. draw. circle( screen, food_color, snake_pos, 5 ) )
if food_rect. collidepoint( snake_pos) :
snake_list. append( food_point)
food_point = [ random. randint( 10 , 490 ) , random. randint( 10 , 490 ) ]
food_r, food_g, food_b = random. randint( 0 , 255 ) , random. randint( 0 , 255 ) , random. randint( 0 , 255 )
food_color = pygame. Color( food_r, food_g, food_b)
score+= 1
break
snake_head_rect = snake_rect[ 0 ]
count = len ( snake_rect)
while count > 1 :
if snake_head_rect. colliderect( snake_rect[ count - 1 ] ) :
running= False
count -= 1
if not running:
show_text( screen, ( 20 , 200 ) , 'GAME OVER!' , ( 227 , 29 , 18 ) , False , 100 )
show_text( screen, ( 120 , 300 ) , 'press space to try again' , ( 223 , 223 , 223 ) , False , 30 )
pygame. display. update( )