|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
自己制作的第一个游戏!
- import tkinter as tk
- import random
- class Game(tk.Tk):
- def __init__(self):
- tk.Tk.__init__(self)
- self.title('Eat Snake')
- # 固定边框
- self.resizable(False,False)
- # 设置边长、像素
- self.width = 15
- self.height = 16
- self.px = 20
- # 设置自动移动
- self.auto = True
- # 创建画布
- self.canvas = tk.Canvas(
- self, width=self.width*self.px,
- height=self.height*self.px)
- self.canvas.grid(row=0,column=0,columnspan=2)
- # 设置画布的点集(范围)
- self.canvas_set = set()
- for i in range(0, self.width):
- for j in range(0, self.height):
- self.canvas_set.add((i,j))
- # 绑定按键功能
- self.bind("<Key-Right>", self.move_right)
- self.bind("<Key-Left>", self.move_left)
- self.bind("<Key-Up>", self.move_up)
- self.bind("<Key-Down>", self.move_down)
- # 运行游戏
- self.run_game()
- def draw_rect(self,x,y,obj="bg"):
- """"绘制像素"""
- match obj:
- case 'bg':
- # 设置背景像素颜色
- fill = 'grey'
- outline = 'white'
- case 'snake':
- # 设置蛇身像素颜色
- fill = 'green'
- outline = 'red'
- case 'head':
- # 设置蛇头像素颜色
- fill = 'yellow'
- outline = 'red'
- case 'apple':
- # 设置Food像素颜色
- fill = 'red'
- outline = 'yellow'
- px = self.px
- try:
- # 绘制像素
- self.canvas.create_rectangle(
- x*px,y*px,
- (x+1)*px,(y+1)*px,
- fill=fill,outline=outline
- )
- except:
- # 如果fill和outline没有定义,打印Error
- print("Error")
- def initialize(self):
- """初始化界面"""
- # 绘制背景
- for x,y in list(self.canvas_set):
- self.draw_rect(x,y,obj='bg')
- # 绘制初始的贪吃蛇
- self.snake_list = [(self.width//2 + i,self.height//2) for i in range(3)]
- for (i, j) in self.snake_list:
- if (i,j) == self.snake_list[-1]:
- self.draw_rect(i,j,obj='head')
- else:
- self.draw_rect(i,j,obj='snake')
- # 绘制初始的Food
- self.food_set = self.canvas_set.difference(set(self.snake_list))
- self.food_x,self.food_y = random.choice(list(self.food_set))
- self.draw_rect(self.food_x,self.food_y,obj='apple')
- def flip(self,food=False):
- """刷新界面,使画面动起来"""
- # 删除画布上所有元素
- self.canvas.delete("all")
- # 重新绘制当前画布上的元素
- for (x,y) in list(self.canvas_set):
- self.draw_rect(x,y,obj='bg')
- for (i, j) in self.snake_list:
- if (i, j) == self.snake_list[-1]:
- self.draw_rect(i, j, obj='head')
- else:
- self.draw_rect(i, j, obj='snake')
- if food:
- self.food_set = self.canvas_set.difference(set(self.snake_list[-1]))
- self.food_x,self.food_y = random.choice(list(self.food_set))
- self.draw_rect(self.food_x, self.food_y, obj='apple')
- def move_right(self,event):
- x, y = self.snake_list[-1]
- if x <= self.snake_list[-2][0] and y == self.snake_list[-2][1]:
- pass
- else:
- self.run(1,0)
- def move_left(self,event):
- x, y = self.snake_list[-1]
- if x >= self.snake_list[-2][0] and y == self.snake_list[-2][1]:
- pass
- else:
- self.run(-1,0)
- def move_up(self,event):
- x, y = self.snake_list[-1]
- if x == self.snake_list[-2][0] and y >= self.snake_list[-2][1]:
- pass
- else:
- self.run(0,-1)
- def move_down(self,event):
- x, y = self.snake_list[-1]
- if x == self.snake_list[-2][0] and y <= self.snake_list[-2][1]:
- pass
- else:
- self.run(0,1)
- def run(self,move_x,move_y):
- x, y = self.snake_list[-1]
- food = self.eat_food(x + move_x, y + move_y)
- if food == False:
- self.snake_list.pop(0)
- else:
- self.food_x, self.food_y = random.choice(list(self.food_set))
- print(self.food_x, self.food_y) # 无意义,可删去
- if move_x != 0 or move_y != 0:
- self.snake_list.append((x + move_x, y + move_y))
- if self.is_over(x + move_x, y + move_y):
- self.game_over()
- else:
- self.flip(food)
- def eat_food(self,x,y):
- if x == self.food_x and y == self.food_y:
- return True
- else:
- return False
- def is_over(self,x,y):
- ls = len(self.snake_list)
- if x < 0 or y < 0 or x >= self.width or y >= self.height:
- return True
- elif (x, y) in self.snake_list[:ls-1]:
- return True
- return False
- def again(self):
- self.destroy()
- self.__init__()
- def game_over(self):
- w = self.width*self.px // 2
- h = self.height*self.px // 2
- self.canvas.create_text(w, h, text="GAME OVER", fill="red", font=("黑体",50))
- qb = tk.Button(self,text="QUIT", font=50, command=self.destroy)
- qb.grid(row=1,column=0,sticky="nsew")
- rb = tk.Button(self,text="Again", font=50, command=self.again)
- rb.grid(row=1,column=1,sticky="nsew")
- self.unbind("<Key-Right>")
- self.unbind("<Key-Left>")
- self.unbind("<Key-Up>")
- self.unbind("<Key-Down>")
- self.auto = False
- # 取消所有后续的自动运行
- self.canvas.after_cancel("automatic_run")
- def run_game(self):
- self.initialize()
- if self.auto:
- self.automatic_run()
- self.mainloop()
- def automatic_run(self):
- if not hasattr(self, "game_over_called"):
- ls = len(self.snake_list)
- if self.snake_list[ls-1][0] == self.snake_list[ls-2][0]:
- if self.snake_list[ls-1][1] > self.snake_list[ls-2][1]:
- self.run(0,1)
- else:
- self.run(0,-1)
- else:
- if self.snake_list[ls-1][0] > self.snake_list[ls-2][0]:
- self.run(1,0)
- else:
- self.run(-1,0)
- if self.auto:
- self.canvas.after(500,self.automatic_run)
- if __name__ == '__main__':
- game = Game()
复制代码 |
评分
-
参与人数 3 | 荣誉 +10 |
鱼币 +6 |
贡献 +7 |
C币 +4 |
收起
理由
|
小甲鱼
| + 3 |
+ 3 |
+ 3 |
+ 3 |
鱼C有你更精彩^_^ |
sfqxx
| + 5 |
|
+ 3 |
|
|
不二如是
| + 2 |
+ 3 |
+ 1 |
+ 1 |
鱼C有你更精彩^_^ |
查看全部评分
|