Python---tkinter---贪吃蛇(能用的)

项目分析:
构成:
蛇 Snake
食物 Food
世界 World
蛇和食物属于整个世界
  class World:
      self.snake
      self.food
上面代码不太友好
我们用另外一个思路来分析
我们的分析思路
食物是一个独立的事物
蛇也可以认为是一个独立的事物
世界也是,但世界负责显示

------------------------------------------------

import queue
import time
from tkinter import *
import threading
import random

class GUI(Tk):
    def __init__(self, queue):
        Tk.__init__(self)
        self.queue = queue
        self.is_game_over = False
        #self.canvas = Canvas(self, width=500, height=300, bg='#000000')
        self.canvas = Canvas(self, width=500, height=300, bg='gray')
        self.canvas.pack()
        self.snake = self.canvas.create_line((0,0),(0,0), fill='#FFCC4C', width=10)
        self.food = self.canvas.create_rectangle(0,0,0,0,fill='#FFCC4C', outline='#FFCC4C')
        self.points_earned = self.canvas.create_text(450, 20,fill='white', text='SCORE: 0')
        self.queue_handler()

    def queue_handler(self):
        try:
            while True:
                task = self.queue.get(block=False)
                if task.get("game_over"):
                    self.game_over()
                if task.get('move'):
                    points = [ x for point in task['move'] for x in point]
                    self.canvas.coords(self.snake, *points)
                if task.get('food'):
                    self.canvas.coords(self.food, *task['food'])
                elif task.get('points_earned'):
                    self.canvas.itemconfigure(self.points_earned,
                                              text='SCORE: {}'.format(task['points_earned']))
                    self.queue.task_done()
        except queue.Empty:
            if not self.is_game_over:
                self.canvas.after(100, self.queue_handler)
    def game_over(self):
        self.is_game_over = True
        self.canvas.create_text(200,150, fill='white', text='Game Over')
        quitbtn = Button(self, text='Quit', command=self.destroy)
        rebtn = Button(self, text='Begin', command=self.__init__)
        self.canvas.create_window(200, 180, anchor='nw', window=quitbtn)

class Food():
    def __init__(self,queue):
        self.queue = queue
        self.generate_food()

    def generate_food(self):
        x = random.randrange(5,490,10)
        y = random.randrange(5, 290,10)
        self.postion = x,y
        self.exppos = x - 5, y - 5, x + 5, y + 5
        self.queue.put({'food':self.exppos})

class Snake(threading.Thread):
    def __init__(self,gui, queue):
        threading.Thread.__init__(self)
        self.gui = gui
        self.queue = queue
        self.daemon = True
        self.points_earned = 0
        self.snake_points = [(495,55),(485,55), (465,55),(455,55)]
        self.food = Food(queue)
        self.direction = 'Left'
        self.start()
    def run(self):
        if self.gui.is_game_over:
            self._delete()
        while not self.gui.is_game_over:
            self.queue.put({'move': self.snake_points})
            time.sleep(0.5)
            self.move()
    def key_pressed(self,e):
        # keysym 按键名称
        self.direction = e.keysym
    def move(self):
        new_snake_point = self.calculate_new_coordinates()
        if self.food.postion == new_snake_point:
            self.points_earned += 1
            self.queue.put({'points_earned': self.points_earned})
            self.food.generate_food()
        else:
            self.snake_points.pop(0)
            self.check_game_over(new_snake_point)
            self.snake_points.append(new_snake_point)

    def calculate_new_coordinates(self):
        last_x, last_y = self.snake_points[-1]
        if self.direction == 'Up':
            new_snake_point = last_x, last_y - 10
        elif self.direction == 'Down':
            new_snake_point = last_x, last_y + 10
        elif self.direction == 'Left':
            new_snake_point = last_x - 10, last_y
        elif self.direction == 'Right':
            new_snake_point = last_x + 10, last_y
        return new_snake_point
    def check_game_over(self, snake_point):
        x,y = snake_point[0], snake_point[1]
        if not -5 < x < 505 or not -5 < y < 315 or snake_point in self.snake_points:
            self.queue.put({'game_over': True})

def main():
    q = queue.Queue()
    gui = GUI(q)
    gui.title("傻傻的贪吃蛇")
    #global  q, gui
    snake = Snake(gui,q)
    gui.bind('<Key-Left>', snake.key_pressed)
    gui.bind('<Key-Right>', snake.key_pressed)
    gui.bind('<Key-Up>', snake.key_pressed)
    gui.bind('<Key-Down>', snake.key_pressed)
    gui.mainloop()
if __name__ == "__main__":
    main()

转载于:https://www.cnblogs.com/niaocaizhou/p/11004234.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,你想学习如何用 Pythontkinter 模块制作贪吃蛇游戏是吗?下面是一个简单的教程,希望对你有帮助。 首先,你需要安装 Python 以及 tkinter 模块。在安装好之后,我们可以开始编写代码了。 1. 导入 tkinter 和 random 模块 ```python from tkinter import * import random ``` 2. 创建游戏窗口和画布 ```python # 创建窗口 window = Tk() window.title("贪吃蛇") # 创建画布 canvas = Canvas(window, width=500, height=500) canvas.pack() ``` 3. 定义贪吃蛇和食物 ```python class Snake: def __init__(self): self.body = [(250, 250), (240, 250), (230, 250)] self.direction = "Right" def move(self): if self.direction == "Up": head = (self.body[0][0], self.body[0][1] - 10) elif self.direction == "Down": head = (self.body[0][0], self.body[0][1] + 10) elif self.direction == "Left": head = (self.body[0][0] - 10, self.body[0][1]) else: head = (self.body[0][0] + 10, self.body[0][1]) self.body.insert(0, head) self.body.pop() def change_direction(self, direction): if direction == "Up" and self.direction != "Down": self.direction = direction elif direction == "Down" and self.direction != "Up": self.direction = direction elif direction == "Left" and self.direction != "Right": self.direction = direction elif direction == "Right" and self.direction != "Left": self.direction = direction def draw(self): for body_part in self.body: canvas.create_rectangle(body_part[0], body_part[1], body_part[0]+10, body_part[1]+10, fill="green") class Food: def __init__(self): x = random.randint(0, 49) * 10 y = random.randint(0, 49) * 10 self.position = (x, y) def draw(self): canvas.create_rectangle(self.position[0], self.position[1], self.position[0]+10, self.position[1]+10, fill="red") ``` 4. 定义游戏循环 ```python snake = Snake() food = Food() def game_loop(): canvas.delete(ALL) # 绘制贪吃蛇和食物 snake.draw() food.draw() # 移动贪吃蛇 snake.move() # 如果贪吃蛇吃到食物,就生成新的食物 if snake.body[0] == food.position: food = Food() window.after(100, game_loop) game_loop() ``` 5. 绑定键盘事件 ```python def on_key_press(event): if event.keysym == "Up": snake.change_direction("Up") elif event.keysym == "Down": snake.change_direction("Down") elif event.keysym == "Left": snake.change_direction("Left") else: snake.change_direction("Right") window.bind("<KeyPress>", on_key_press) ``` 6. 运行游戏 ```python window.mainloop() ``` 好了,以上就是一个简单的用 tkinter 制作贪吃蛇游戏的教程。你可以按照上述步骤,自己动手写一下试试看。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值