|
|
发表于 2019-8-19 09:45:17
|
显示全部楼层
你先这么改吧,好像还有N多问题,自己看看
- import sys
- import random
- from tkinter import *
- class Grid(object):
- def __init__(self,master = None,window_width = 500,window_height = 400,grid_width = 20,offset = 10):
- #设置窗口参数 grid是表格的意思,以下就是表格布局的宽度--offset是偏移量的意思
- 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 = 'black'
- self.canvas = Canvas(master,width = self.width+2*self.offset,height = self.height+2*offset,bg = self.bg)
- self.canvas.pack()
- #方块的位置
- 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.width+self.offset,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)
- return grid_list
- class Food(object):
- def __init__(self,Grid):
- self.grid = Grid
- self.color = '#23d978'
- self.set_pos()
- def set_pos(self):
- x = random.randint(0,self.grid.grid_x -1)
- y = random.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 = 1000
- self.color = 'red'
- self.food = Food(self.grid)
- self.gameover = False
- #分数
- self.scoer = 0
- def available_grid(self):
- #获得能用的坐标
- return [i for i in self.grid.grid_list() if i not in self.body[2:]]
- def gaibian(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)
- if not self.food.pos == head:
- pop = self.body.pop()
- self.grid.draw(pop,self.grid.bg)
- else:
- self.display_food()#生成新的
- self.scoer +=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 SankeGame(Frame):
- #接收字典和接收元组
- def __init__(self,master = None,*args,**kwargs):
- Frame.__init__(self,master)
- self.grid = Grid(master = master,*args,**kwargs)
- self.snake = Snake(self.grid)
- self.bind_all('<KeyRelease>',self.key_release)
- def run(self):
- if not self.snake.status[0] == 'stop':
- self.snake.move()
- if self.snake.gameover == True:
- 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()
- if __name__ == '__main__':
- root = Tk()
- root.title('My Game!')
- snakegame = SankeGame(root)
- snakegame.run()
- snakegame.mainloop()
复制代码 |
|