第一次用Python寫這種比較實用且好玩的東西,權(quán)當(dāng)練手吧
游戲說明:
* P鍵控制“暫停/開始”
* 方向鍵控制貪吃蛇的方向
源代碼如下:
from Tkinter import *
import tkMessageBox,sys
from random import randint
class Grid(object):
??? def __init__(self,master=None,window_width=800,window_height=600,grid_width=50,offset=10):
??????? self.height = window_height
??????? self.width = window_width
??????? self.grid_width = grid_width
??????? self.offset = offset
??????? self.grid_x = self.width/self.grid_width
??????? self.grid_y = self.height/self.grid_width
??????? self.bg = "#EBEBEB"
??????? self.canvas = Canvas(master, width=self.width+2*self.offset, height=self.height+2*self.offset, bg=self.bg)
??????? self.canvas.pack()
??????? self.grid_list()
??? def draw(self, pos, color,):
??????? x = pos[0]*self.grid_width + self.offset
??????? y = pos[1]*self.grid_width + self.offset
??????? self.canvas.create_rectangle(x, y, x+self.grid_width, y+self.grid_width,fill=color,outline=self.bg)
??? def grid_list(self):
??????? grid_list = []
??????? for y in range(0,self.grid_y):
??????????? for x in range(0,self.grid_x):
??????????????? grid_list.append((x,y))
??????? self.grid_list = grid_list
class Food(object):
??? def __init__(self, Grid):
??????? self.grid = Grid
??????? self.color = "#23D978"???????
??????? self.set_pos()
??? def set_pos(self):
??????? x = randint(0,self.grid.grid_x - 1)
??????? y = randint(0,self.grid.grid_y - 1)
??????? self.pos =? (x, y)???
??? def display(self):
??????? self.grid.draw(self.pos,self.color)
class Snake(object):
??? def __init__(self, Grid):
??????? self.grid = Grid
??????? self.body = [(10,6),(10,7),(10,8)]
??????? self.direction = "Up"
??????? self.status = ['run','stop']
??????? self.speed = 300
??????? self.color = "#5FA8D9"???????
??????? self.food = Food(self.grid)
??????? self.display_food()
??????? self.gameover = False
??????? self.score = 0
??? def available_grid(self):
??????? return [i for i in self.grid.grid_list if i not in self.body[2:]]
??? def change_direction(self, direction):
??????? self.direction = direction
??? def display(self):
??????? for (x,y) in self.body:
??????????? self.grid.draw((x,y),self.color)
??? def display_food(self):
??????? while(self.food.pos in self.body):
??????????? self.food.set_pos()
??????? self.food.display()
??? def move(self):
??????? head = self.body[0]
??????? if self.direction == 'Up':
??????????? new = (head[0], head[1]-1)
??????? elif self.direction == 'Down':
??????????? new = (head[0], head[1]+1)
??????? elif self.direction == 'Left':
??????????? new = (head[0]-1,head[1])
??????? else:
??????????? new = (head[0]+1,head[1])
??????? if not self.food.pos == head:????????
??????????? pop = self.body.pop()
??????????? self.grid.draw(pop,self.grid.bg)
??????? else:
??????????? self.display_food()
??????????? self.score += 1
??????? self.body.insert(0,new)?????
??????? if not new in self.available_grid():
??????????? self.status.reverse()???????????
??????????? self.gameover = True
??????? else:
??????????? self.grid.draw(new,color=self.color)
class SnakeGame(Frame):
??? def __init__(self,master=None, *args, **kwargs):
??????? Frame.__init__(self, master)
??????? self.master = master
??????? self.grid = Grid(master=master,*args, **kwargs)
??????? self.snake = Snake(self.grid)
??????? self.bind_all("", self.key_release)
??????? self.snake.display()
??? def run(self):
??????? if not self.snake.status[0] == 'stop':
??????????? self.snake.move()
??????? if self.snake.gameover == True:
??????????? message =? tkMessageBox.showinfo("Game Over", "your score: %d" % self.snake.score)
??????????? if message == 'ok':
??????????????? sys.exit()
??????? self.after(self.snake.speed,self.run)
??? 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.change_direction(key)
??????????? self.snake.move()
??????? elif key == 'p':
??????????? self.snake.status.reverse()
if __name__ == '__main__':
??? root = Tk()
??? snakegame = SnakeGame(root)
??? snakegame.run()
??? snakegame.mainloop()
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
