最近学习了python,用python简单实现一个贪吃蛇小游戏。
使用了pygame。
目前的实现是可以穿墙,而且可以穿过自身。
import pygame,time,random,sys
class Snake:
snake_x = 250
snake_y = 250
way_forward = "left" #0上 1下 2左 3右
body_size = 10
snake_color = (255,0,0)
def __init__(self,snake_x = snake_x,snake_y = snake_y,way_forward=way_forward,speed=body_size):
self.snake_x = snake_x
self.snake_y = snake_y
self.snake_wdith = Snake.body_size
self.snake_hight = Snake.body_size
self.color = Snake.snake_color
self.way_forward = way_forward #0上 1下 2左 3右
self.speed = speed
def __str__(self):
return "%d__%d" % (self.snake_x,self.snake_y)
def createSnakeByPerObj(perObj):
new_body = Snake(perObj.snake_x,perObj.snake_y,perObj.way_forward)
if perObj.way_forward == up:
new_body.snake_y += Snake.body_size
elif perObj.way_forward == down:
new_body.snake_y -= Snake.body_size
elif perObj.way_forward == left:
new_body.snake_x += Snake.body_size
else :
new_body.snake_x -= Snake.body_size
return new_body
# 颜色定义
RED = 255,0,0
ORANGE = 255,156,0
YELLOW = 255,255,0
GREEN = 0,255,0
GREENBLUE = 0,255,255
BLUE = 0,0,255
PURPLE = 255,0,255
# 蛇身的颜色组
colors = [RED,ORANGE,YELLOW,GREEN]
# 游戏窗口
game_window_x = 500
game_window_y = 500
# 初始果实坐标
fruit_x = random.randint(0,game_window_x/10)*10
fruit_y = random.randint(0,game_window_y/10)*10
# 是否吃了当前果实
get_fruit_flag = False
speed = 20
# 方向定义
left = "left"
right = "right"
up = "up"
down = "down"
#一次循环之内只允许改变一次方向 方向改变标识
change_forward_flag = True
#初始化 游戏
pygame.init()
#定义一个蛇身空数组
snake_arr = []
#定义一个全局的方向变量 初始化为None
init_way_forward = None
#初始化蛇身为3个长度
while len(snake_arr) < 3:
if len(snake_arr) == 0 :
snake_arr.append(Snake())
else :
last_body = snake_arr[len(snake_arr)-1]
snake_arr.append(createSnakeByPerObj(last_body))
#死循环刷新窗口
while True:
# print("#"*50)
event_list = pygame.event.get()
for event in event_list:
print(event)
if event.type == pygame.QUIT:
sys.exit(0);
if event.type == pygame.KEYUP:
if change_forward_flag :
print(event.key)
change_forward_flag = False
if event.key == 273:
init_way_forward = up
elif event.key == 274:
init_way_forward = down
elif event.key == 275:
init_way_forward = right
else:
init_way_forward = left
# 创建一个窗口
game_window = pygame.display.set_mode((game_window_x,game_window_y))
# 默认还没吃到果实,迟到了果实则重新赋予果实一个随机坐标
if get_fruit_flag :
fruit_x = random.randint(0,game_window_x/10)*10
fruit_y = random.randint(0,game_window_y/10)*10
get_fruit_flag = False
# 生成果实
fruit = pygame.Rect(fruit_x,fruit_y,Snake.body_size,Snake.body_size)
pygame.draw.rect(game_window,YELLOW,fruit,0)
# 吃了果实
if (snake_arr[0].way_forward == up and snake_arr[0].snake_x == fruit_x and snake_arr[0].snake_y == fruit_y+Snake.body_size) or\
(snake_arr[0].way_forward == down and snake_arr[0].snake_x == fruit_x and snake_arr[0].snake_y == fruit_y-Snake.body_size) or \
(snake_arr[0].way_forward == left and snake_arr[0].snake_x == fruit_x+Snake.body_size and snake_arr[0].snake_y == fruit_y) or \
(snake_arr[0].way_forward == right and snake_arr[0].snake_x == fruit_x-Snake.body_size and snake_arr[0].snake_y == fruit_y):
last_body = snake_arr[len(snake_arr)-1]
snake_arr.append(createSnakeByPerObj(last_body))
get_fruit_flag = True
#改变方向
if init_way_forward is not None:#snake_arr[0].snake_x == fruit_x and snake_arr[0].snake_y == fruit_y:
if snake_arr[0].snake_x >= game_window_x or snake_arr[0].snake_x < 0 \
or snake_arr[0].snake_y >= game_window_y or snake_arr[0].snake_y < 0:
pass
else:
snake_arr[0].way_forward = init_way_forward
# 判断边界可穿
if snake_arr[0].snake_x <= 0 and snake_arr[0].way_forward == left:
snake_arr[0].snake_x = game_window_x
elif snake_arr[0].snake_x >= game_window_x-Snake.body_size and snake_arr[0].way_forward == right:
snake_arr[0].snake_x = Snake.body_size*-1
elif snake_arr[0].snake_y <= 0 and snake_arr[0].way_forward == up:
snake_arr[0].snake_y = game_window_y
elif snake_arr[0].snake_y >= game_window_y-Snake.body_size and snake_arr[0].way_forward == down:
snake_arr[0].snake_y = Snake.body_size*-1
for item in snake_arr[::-1]:
if item.way_forward == up:
item.snake_y -= Snake.body_size
elif item.way_forward == down:
item.snake_y += Snake.body_size
elif item.way_forward == left:
item.snake_x -= Snake.body_size
else :
item.snake_x += Snake.body_size
part_index = snake_arr.index(item)
curr_color = colors[part_index%4]
item.color = curr_color
snake_part = pygame.Rect(item.snake_x,item.snake_y,Snake.body_size,Snake.body_size)
pygame.draw.rect(game_window,item.color,snake_part,0)
if part_index != 0:
item.way_forward = snake_arr[part_index-1].way_forward
item.snake_x = snake_arr[part_index-1].snake_x
item.snake_y = snake_arr[part_index-1].snake_y
print(snake_arr[0])
pygame.display.update()
time.sleep(1)
change_forward_flag = True
pygame.quit()