import sys
import pygame
import random
class Button(object):#定義按鈕類
def __init__(self,begin1,begin2,restart1,restart2,position,position2):
self.gamebegin1=pygame.image.load(begin1).convert_alpha()#導(dǎo)入開始和重啟按鈕圖片
self.gamebegin2=pygame.image.load(begin2).convert_alpha()
self.gamerestart1=pygame.image.load(restart1).convert_alpha()
self.gamerestart2=pygame.image.load(restart2).convert_alpha()
self.position=position
self.position2=position2
def ifpress(self):
point_x,point_y=pygame.mouse.get_pos()#找到鼠標(biāo)光標(biāo)所在位置
x,y=self.position#指定的點(diǎn)擊按鈕位置
w,h=self.gamebegin1.get_size()#定義按鈕尺寸
x-=w/2
y-=h/2
if_x=x-w/2point_xx+w/2#判斷鼠標(biāo)光標(biāo)是否在按鈕上
if_y=y-h/2point_yy+h/2
return if_x and if_y
def ispress(self):
x,y=self.position
w,h=self.gamebegin1.get_size()
x-=w/2
y-=h/2
if self.ifpress():#如果鼠標(biāo)光標(biāo)在按鈕上,圖片顯示為gamebegin1,否則顯示為gamebegin2
screen.blit(self.gamebegin1,(x-w/2+8,y-h/2+7))
else:
screen.blit(self.gamebegin2,(x-w/2,y-h/2))
#定義重啟按鈕,方法同上
def ifrepress(self):
point_x,point_y=pygame.mouse.get_pos()
x,y=self.position2
w,h=self.gamerestart1.get_size()
x-=w/2
y-=h/2
if_x=x-w/2point_xx+w/2
if_y=y-h/2point_yy+h/2
return if_x and if_y
def isrepress(self):
x,y=self.position2
w,h=self.gamerestart1.get_size()
x-=w/2
y-=h/2
if self.ifrepress():
screen.blit(self.gamerestart1,(x-w/2,y-h/2))
else:
screen.blit(self.gamerestart2,(x-w/2,y-h/2))
def choice():#定義選擇難度
screen.fill((0,0,0))#初始界面顏色設(shè)置為黑色
Rect1=pygame.Rect(300,300,200,100)#設(shè)置按鈕尺寸
Rect2=pygame.Rect(300,450,200,100)
pygame.draw.rect(screen,(136,189,186),Rect1)#創(chuàng)建按鈕
screen.blit(font.render('grade one:',-1,(255,255,255)),(300,300))
pygame.draw.rect(screen,(136,189,186),Rect2)
screen.blit(font.render('grade two:',-1,(255,255,255)),(300,450))
pygame.display.flip()#顯示到屏幕上
point_x,point_y=pygame.mouse.get_pos()#找到鼠標(biāo)光標(biāo)所在位置
global a,b#定義全局變量
if 300point_x500 and 300point_y400:#判斷光標(biāo)是否在按鈕上
if pygame.mouse.get_pressed()[0]:#判斷鼠標(biāo)是否按下
a=8#a表示沒秒執(zhí)行8次
b=1#b表示設(shè)定的一個(gè)數(shù),與后面判斷執(zhí)行時(shí)有關(guān)
if 300point_x500 and 450point_y550:
if pygame.mouse.get_pressed()[0]:
a=12
b=1
pygame.display.update()#更新屏幕
def getResult():#游戲結(jié)束時(shí)出現(xiàn)得分結(jié)果和gameover
final_text1='Game_Over'
final_text2='Your final score is: '+str(score)
ft1_font=pygame.font.SysFont('Arial',70)
ft1_surf=font.render(final_text1,1,(242,3,36))
screen.blit(ft1_surf,[screen.get_width()/2-ft1_surf.get_width()/2,100])
pygame.display.flip()
def main():
pygame.init()#初始化pygame
clock=pygame.time.Clock()#定義時(shí)間
pygame.font.init()#初始化字符
#需要在其它定義中出現(xiàn)的參數(shù),這里還需要定義全局變量一下
global score,screen,font,button,status,x,y,direction,snackhead,snackbody,foodposition,state,a,b
screen=pygame.display.set_mode((640,640))#設(shè)置屏幕尺寸
screen.fill((0,0,0))#填充屏幕顏色
#指明圖片路徑
beginname1='D://picture//gamebegin1.png'
beginname2='D://picture//gamebegin2.png'
restartname1='D://picture//restart1.png'
restartname2='D://picture//restart2.png'
pygame.display.set_caption('sanckgame')
font=pygame.font.SysFont('Arial',40)#定義字符種類和大小
snackhead=[120,120]#定義初始蛇的頭部位置
foodposition=[360,360]#定義初始食物位置
snackbody=[[120,120],[100,120],[80,120]]#定義蛇全身位置
score=0
x=300
y=300
state=0
a=1
b=0
food_eat=1#食物被吃為0,否則為1
direction='right'#定義初始運(yùn)動(dòng)方向
re_direction=direction#re_direction為變化后的方向
button = Button(beginname1,beginname2,restartname1,restartname2,(330,300),(600,320))#定義按鈕數(shù)值
pygame.display.update()
while True:
for event in pygame.event.get():#遍歷可能出現(xiàn)的事件
if event.type == pygame.QUIT:#點(diǎn)擊關(guān)閉,程序關(guān)閉
pygame.quit()
sys.exit()
button.ispress()#顯示按鈕
pygame.display.update()
if button.ifpress():
if pygame.mouse.get_pressed()[0]:
break #點(diǎn)擊按鈕,結(jié)束這里的循環(huán),進(jìn)入游戲選擇難度界面
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
choice()#運(yùn)行choice()
if b==1:#如果點(diǎn)擊了按鈕,結(jié)束循環(huán),進(jìn)入游戲運(yùn)行界面
break
pygame.mixer.init()#初始化音樂
pygame.mixer.music.load('D://music//Above Everything - Capo Productions.ogg')#導(dǎo)入音樂
pygame.display.update()
status=True
screen=pygame.display.set_mode((640,640))
screen.fill((0,0,0))
while status:
clock.tick(a)#運(yùn)行速度
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:#判斷鍵盤事件
if event.key == pygame.K_RIGHT or event.key == ord('d'):
re_direction='right'
if event.key == pygame.K_LEFT or event.key == ord('a'):
re_direction='left'
if event.key == pygame.K_UP or event.key == ord('w'):
re_direction='up'
if event.key == pygame.K_DOWN or event.key == ord('s'):
re_direction='down'
#跳出判斷事件循環(huán)
if re_direction=='right'and not direction =='left':
direction=re_direction
if re_direction=='left'and not direction =='right':
direction=re_direction
if re_direction=='up'and not direction =='down':
direction=re_direction
if re_direction=='down'and not direction =='up':
direction=re_direction
#頭部坐標(biāo)變化
if direction=='left':
snackhead[0]-=20
if direction=='right':
snackhead[0]+=20
if direction=='down':
snackhead[1]+=20
if direction=='up':
snackhead[1]-=20
snackbody.insert(0,list(snackhead))#每移動(dòng)一次,把頭部新位置插入到最前面,形成新的頭部
if snackhead[0]==foodposition[0] and snackhead[1]==foodposition[1]:#判斷蛇是否吃到了食物
food_eat=0
score+=1
pygame.display.update()
else:
snackbody.pop()#沒吃到則將位置變化前的尾部剔除出去,設(shè)的長度不變
pygame.display.update()
if food_eat==0:#遲到食物后生成新的食物
x=random.randint(1,31)
y=random.randint(1,31)
for position in snackbody:#判斷食物是否出現(xiàn)在蛇的身體處,出現(xiàn)則重新生成
if not x == position[0] and not y == position[1]:
state=1
else:
state=0
if state ==1:
foodposition=[int(x*20),int(y*20)]
food_eat=1
screen.fill((0,0,0))
for position in snackbody:#畫出蛇的身體和食物
rect2=pygame.Rect(position[0],position[1],20,20)
pygame.draw.rect(screen,(166,188,199),rect2)
rect1=pygame.Rect(foodposition[0],foodposition[1],20,20)
pygame.draw.rect(screen,(169,111,102),rect1)
screen.blit(font.render('Score:'+str(score),-1,(255,255,255)),(100,50))#顯示出得分
pygame.display.update()
#如果蛇撞到墻或自己的身體,則游戲結(jié)束
if snackhead[0]0 or snackhead[0]>620:
restart()
if snackhead[1]0 or snackhead[1]>620:
restart()
for body in snackbody[1:]:
if body[0]==snackhead[0]and body[1]==snackhead[1]:
restart()
pygame.display.flip()
pygame.display.update()
if pygame.mixer.music.get_busy()==False:
pygame.mixer.music.set_volume(0.3)
pygame.mixer.music.play(-1)#音樂循環(huán)
def restart():#重新開始按鈕
getResult()#顯示結(jié)果
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
button.isrepress()
pygame.display.update()
if button.ifrepress():
pygame.display.update()
if pygame.mouse.get_pressed()[0]:
main()
main()