#---------------------------------备注-----------------------------------
#运行环境 :
#python --v3.2.5
#pygame -- pygame-1.9.2a0.win32-py3.2
#-------------------------------------------------------------------------
#--------------------------------导入库-------------------------------------
import pygame
import random
import copy
import time
from pygame.locals import *
from sys import exit
pygame.init()
#--------------------------------新建类-------------------------------------
#-----------新建类--蛇------------------------------------------------------
class Snake:
def __init__(self):
#蛇头X坐标
self.x=200
#蛇头Y坐标
self.y=200
#蛇头半径大小
self.r=5
#蛇身数组
self.c=[]
#蛇身长度
self.index=2
#初始化按键
self.keys = [False, False, False, False]
#初始化蛇的位置
def s_weizhi(self):
for i in range(self.index):
if len(self.c) < self.index+2:
(self.c).append([self.x-(i*2*self.r),self.y])
#调用PYGAME画出蛇头
pygame.draw.circle(screen, (50,50,50),(self.c[i]),self.r)
#初始化--蛇
def s_restart(self):
self.x=200
self.y=200
del self.c[:]
self.index=2
self.keys = [False, False, False, False]
#设置(W,A,S,D)按键
def move(self):
#----------判断 按键 状态-------------------------
if event.type==pygame.KEYDOWN:
if event.key==K_w:
if self.keys[2]:
pass
else:
self.keys[0]=True
self.keys[1]=False
self.keys[2]=False
self.keys[3]=False
elif event.key==K_a:
if self.keys[3]:
pass
else:
self.keys[1]=True
self.keys[0]=False
self.keys[2]=False
self.keys[3]=False
elif event.key==K_s:
if self.keys[0]:
pass
else:
self.keys[2]=True
self.keys[1]=False
self.keys[0]=False
self.keys[3]=False
elif event.key==K_d:
if self.keys[1]:
pass
else:
self.keys[3]=True
self.keys[1]=False
self.keys[2]=False
self.keys[0]=False
#---------------判断 (W,A,S,D) 的操作------------------------------
if self.keys[0]==True:
self.c[self.index-1]=copy.copy(self.c[0])
(self.c).insert(0,(self.c[self.index-1]))
del self.c[self.index]
self.c[0][1]-=10
time.sleep (0.05)
if self.keys[1]==True:
self.c[self.index-1]=copy.copy(self.c[0])
(self.c).insert(0,(self.c[self.index-1]))
del self.c[self.index]
self.c[0][0]-=10
time.sleep (0.05)
if self.keys[2]==True:
self.c[self.index-1]=copy.copy(self.c[0])
(self.c).insert(0,(self.c[self.index-1]))
del self.c[self.index]
self.c[0][1]+=10
time.sleep (0.05)
if self.keys[3]==True:
self.c[self.index-1]=copy.copy(self.c[0])
(self.c).insert(0,(self.c[self.index-1]))
del self.c[self.index]
self.c[0][0]+=10
time.sleep (0.05)
#-----------新建类--食物------------------------------------------------------
class Food:
def __init__(self):
self.r=5
#-------------------确保食物出现的位置是 半径 的倍数-------------------
self.rp_x = random.randint(1,59)*2*self.r
self.rp_y = random.randint(1,59)*2*self.r
#-------------------随机食物颜色---------------------------------------
self.rc = (random.randint(100,255), random.randint(100,255), random.randint(100,255))
def f_weizhi(self):
#----------------预防食物刷新在 蛇身上---------------------------------------------
if (self.rp_x == s.x and self.rp_y == s.y):
pass
else:
#----------------调用PYGAME画出食物---------------------------------------
pygame.draw.circle(screen, (self.rc),(self.rp_x,self.rp_y),self.r)
#---------------------初始化食物-------------------------------------------
def f_restart(self):
self.rp_x = random.randint(1,59)*10
self.rp_y = random.randint(1,59)*10
self.rc = (random.randint(100,255), random.randint(100,255), random.randint(100,255))
#--------------------------设置函数---------------------------------------------------------------------------
#----------------------判断--是否碰中食物-------------------------------------------
def CheckEat():
if (s.c[0][0] == f.rp_x) and (s.c[0][1] == f.rp_y):
return True
#----------------------判断--是否碰撞墙壁--------------------------------------------
def CheckPen():
if (s.c[0][0] > 600-s.r) or (s.c[0][1] > 600-s.r) or (s.c[0][0] < s.r) or (s.c[0][1] < s.r):
return True
#----------------------判断--是否碰中蛇身--------------------------------------------
def CheckTouch():
for i in range(s.index-1):
if (s.c[i+1][0] == s.c[0][0] and s.c[i+1][1] == s.c[0][1]):
return True
#---------------------设置游戏常数------------------------------------------------------------------------------
#设置游戏窗口大小
width,height=(600,600)
#新建一个游戏窗口,窗口大小为(width,height)
screen=pygame.display.set_mode((width,height))
#设置游戏窗口标题
pygame.display.set_caption("tan-shi-she")
#游戏运行时的字体
font = pygame.font.Font(None, 32)
#游戏结束时的字体
font_over = pygame.font.Font(None, 128)
#游戏状态
gameover=False
#重玩按钮--R----
restart_game=False
s=Snake()
f=Food()
#---------------------游戏主循环------------------------------------------------------------------------------
while 1:
for event in pygame.event.get():
if event.type==pygame.QUIT:
pygame.quit()
exit(0)
#将没有图像的空间填满(白色)
screen.fill((255,255,255))
if not gameover:
s.move()
s.s_weizhi()
f.f_weizhi()
if CheckTouch():
gameover=True
if CheckEat():
f.f_restart()
s.index+=1
if CheckPen():
gameover=True
else:
#文本-游戏restart
text_restart = font.render("按 R 键重新游戏", 1, (0, 0, 0))
#载入文本(游戏restart)
screen.blit(text_restart, (200,350))
#文本-游戏结束
text_over = font.render("Game Over", 1, (0, 0, 0))
#载入文本(游戏结束)
screen.blit(text_over, (200,250))
#按R键重新游戏
if event.type==pygame.KEYDOWN:
if event.key==K_r:
restart_game=True
#初始化游戏
if restart_game:
s.s_restart()
f.f_restart()
restart_game=False
gameover = False
pygame.display.flip()
pygame.display.update()