使用Python寫(xiě)一個(gè)貪吃蛇游戲?qū)嵗a
我在程序中加入了分?jǐn)?shù)顯示,三種特殊食物,將貪吃蛇的游戲邏輯寫(xiě)到了SnakeGame的類(lèi)中,而不是在Snake類(lèi)中。
特殊食物:
1.綠色:普通,吃了增加體型
2.紅色:吃了減少體型
3.金色:吃了回到最初體型
4.變色食物:吃了會(huì)根據(jù)食物顏色改變蛇的顏色
#coding=UTF-8
from Tkinter import *
from random import randint
import tkMessageBox
class Grid(object):
def __init__(self, master=None,height=16, width=24, offset=10, grid_width=50, bg="#808080"):
self.height = height
self.width = width
self.offset = offset
self.grid_width = grid_width
self.bg = bg
self.canvas = Canvas(master, width=self.width*self.grid_width+2*self.offset, height=self.height*self.grid_width+
2*self.offset, bg=self.bg)
self.canvas.pack(side=RIGHT, fill=Y)
def draw(self, pos, color, ):
x = pos[0] * self.grid_width + self.offset
y = pos[1] * self.grid_width + self.offset
#outline屬性要與網(wǎng)格的背景色(self.bg)相同,要不然會(huì)很丑
self.canvas.create_rectangle(x, y, x + self.grid_width, y + self.grid_width, fill=color, outline=self.bg)
class Food(object):
def __init__(self, grid, color = "#23D978"):
self.grid = grid
self.color = color
self.set_pos()
self.type = 1
def set_pos(self):
x = randint(0, self.grid.width - 1)
y = randint(0, self.grid.height - 1)
self.pos = (x, y)
def display(self):
self.grid.draw(self.pos, self.color)
class Snake(object):
def __init__(self, grid, color = "#000000"):
self.grid = grid
self.color = color
self.body = [(8, 11), (8, 12), (8, 13)]
self.direction = "Up"
for i in self.body:
self.grid.draw(i, self.color)
#這個(gè)方法用于游戲重新開(kāi)始時(shí)初始化貪吃蛇的位置
def initial(self):
while not len(self.body) == 0:
pop = self.body.pop()
self.grid.draw(pop, self.grid.bg)
self.body = [(8, 11), (8, 12), (8, 13)]
self.direction = "Up"
self.color = "#000000"
for i in self.body:
self.grid.draw(i, self.color)
#蛇像一個(gè)指定點(diǎn)移動(dòng)
def move(self, new):
self.body.insert(0, new)
pop = self.body.pop()
self.grid.draw(pop, self.grid.bg)
self.grid.draw(new, self.color)
#蛇像一個(gè)指定點(diǎn)移動(dòng),并增加長(zhǎng)度
def add(self ,new):
self.body.insert(0, new)
self.grid.draw(new, self.color)
#蛇吃到了特殊食物1,剪短自身的長(zhǎng)度
def cut_down(self,new):
self.body.insert(0, new)
self.grid.draw(new, self.color)
for i in range(0,3):
pop = self.body.pop()
self.grid.draw(pop, self.grid.bg)
#蛇吃到了特殊食物2,回到最初長(zhǎng)度
def init(self, new):
self.body.insert(0, new)
self.grid.draw(new, self.color)
while len(self.body) > 3:
pop = self.body.pop()
self.grid.draw(pop, self.grid.bg)
#蛇吃到了特殊食物3,改變了自身的顏色,純屬好玩
def change(self, new, color):
self.color = color
self.body.insert(0, new)
for item in self.body:
self.grid.draw(item, self.color)
class SnakeGame(Frame):
def __init__(self, master):
Frame.__init__(self, master)
self.grid = Grid(master)
self.snake = Snake(self.grid)
self.food = Food(self.grid)
self.gameover = False
self.score = 0
self.status = ['run', 'stop']
self.speed = 300
self.grid.canvas.bind_all("<KeyRelease>", self.key_release)
self.display_food()
#用于設(shè)置變色食物
self.color_c = ("#FFB6C1","#6A5ACD","#0000FF","#F0FFF0","#FFFFE0","#F0F8FF","#EE82EE","#000000","#5FA8D9","#32CD32")
self.i = 0
#界面左側(cè)顯示分?jǐn)?shù)
self.m = StringVar()
self.ft1 = ('Fixdsys', 40, "bold")
self.m1 = Message(master, textvariable=self.m, aspect=5000, font=self.ft1, bg="#696969")
self.m1.pack(side=LEFT, fill=Y)
self.m.set("Score:"+str(self.score))
#這個(gè)方法用于游戲重新開(kāi)始時(shí)初始化游戲
def initial(self):
self.gameover = False
self.score = 0
self.m.set("Score:"+str(self.score))
self.snake.initial()
#type1:普通食物 type2:減少2 type3:大樂(lè)透,回到最初狀態(tài) type4:吃了會(huì)變色
def display_food(self):
self.food.color = "#23D978"
self.food.type = 1
if randint(0, 40) == 5:
self.food.color = "#FFD700"
self.food.type = 3
while (self.food.pos in self.snake.body):
self.food.set_pos()
self.food.display()
elif randint(0, 4) == 2:
self.food.color = "#EE82EE"
self.food.type = 4
while (self.food.pos in self.snake.body):
self.food.set_pos()
self.food.display()
elif len(self.snake.body) > 10 and randint(0, 16) == 5:
self.food.color = "#BC8F8F"
self.food.type = 2
while (self.food.pos in self.snake.body):
self.food.set_pos()
self.food.display()
else:
while (self.food.pos in self.snake.body):
self.food.set_pos()
self.food.display()
def key_release(self, event):
key = event.keysym
key_dict = {"Up": "Down", "Down": "Up", "Left": "Right", "Right": "Left"}
#蛇不可以像自己的反方向走
if key_dict.has_key(key) and not key == key_dict[self.snake.direction]:
self.snake.direction = key
self.move()
elif key == 'p':
self.status.reverse()
def run(self):
#首先判斷游戲是否暫停
if not self.status[0] == 'stop':
#判斷游戲是否結(jié)束
if self.gameover == True:
message = tkMessageBox.showinfo("Game Over", "your score: %d" % self.score)
if message == 'ok':
self.initial()
if self.food.type == 4:
color = self.color_c[self.i]
self.i = (self.i+1)%10
self.food.color = color
self.food.display()
self.move(color)
else:
self.move()
self.after(self.speed, self.run)
def move(self, color="#EE82EE"):
# 計(jì)算蛇下一次移動(dòng)的點(diǎn)
head = self.snake.body[0]
if self.snake.direction == 'Up':
if head[1] - 1 < 0:
new = (head[0], 16)
else:
new = (head[0], head[1] - 1)
elif self.snake.direction == 'Down':
new = (head[0], (head[1] + 1) % 16)
elif self.snake.direction == 'Left':
if head[0] - 1 < 0:
new = (24, head[1])
else:
new = (head[0] - 1, head[1])
else:
new = ((head[0] + 1) % 24, head[1])
#撞到自己,設(shè)置游戲結(jié)束的標(biāo)志位,等待下一循環(huán)
if new in self.snake.body:
self.gameover=True
#吃到食物
elif new == self.food.pos:
if self.food.type == 1:
self.snake.add(new)
elif self.food.type == 2:
self.snake.cut_down(new)
elif self.food.type == 4:
self.snake.change(new, color)
else:
self.snake.init(new)
self.display_food()
self.score = self.score+1
self.m.set("Score:" + str(self.score))
#什么都沒(méi)撞到,繼續(xù)前進(jìn)
else:
self.snake.move(new)
if __name__ == '__main__':
root = Tk()
snakegame = SnakeGame(root)
snakegame.run()
snakegame.mainloop()
總結(jié)
以上所述是小編給大家介紹的使用Python寫(xiě)一個(gè)貪吃蛇游戲?qū)嵗a,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
python根據(jù)距離和時(shí)長(zhǎng)計(jì)算配速示例
這篇文章主要介紹了python根據(jù)距離和時(shí)長(zhǎng)計(jì)算配速示例,需要的朋友可以參考下2014-02-02
Python中Pandas庫(kù)的數(shù)據(jù)處理與分析
Python的Pandas庫(kù)是數(shù)據(jù)科學(xué)領(lǐng)域中非常重要的一個(gè)庫(kù),它使數(shù)據(jù)清洗和分析工作變得更快更簡(jiǎn)單,Pandas結(jié)合了NumPy的高性能數(shù)組計(jì)算功能以及電子表格和關(guān)系型數(shù)據(jù)庫(kù)(如SQL)的靈活數(shù)據(jù)處理能力,需要的朋友可以參考下2023-07-07
Python中異步HTTP客戶端/服務(wù)器框架aiohttp的使用全面指南
aiohttp 是一個(gè)基于 Python asyncio 的異步 HTTP 客戶端/服務(wù)器框架,專(zhuān)為高性能網(wǎng)絡(luò)編程設(shè)計(jì),本文將為大家詳細(xì)介紹一下它的具體使用,需要的可以了解下2025-06-06
一個(gè)小示例告訴你Python語(yǔ)言的優(yōu)雅之處
本篇中, 我們展示一下一段非常小的代碼, 這段代碼十分吸引我們, 因?yàn)樗褂檬謨?yōu)雅和直接的方式解決了一個(gè)常見(jiàn)的問(wèn)題.2014-07-07
Python基于network模塊制作電影人物關(guān)系圖
這篇文章主要介紹了Python基于network模塊制作電影人物關(guān)系圖,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06

