Python3 tkinter实现贪吃蛇

from tkinter import *
import random


class SnakeGame:

    def __init__(self):
        # moving step for snake and food
        self.step = 15
        # game score
        self.gamescore = -10
        self.level = 0
        # to initialize the snake in the range of (x1,y1,x2,y2)
        r = random.randrange(400, 600, self.step)
        self.snakeX = [r, r + self.step, r + self.step * 2]
        self.snakeY = [r, r, r]

        # to initialize the moving direction
        self.snakeDirection = 'left'
        self.snakeMove = [-1, 0]
        # to draw the game frame 
        window = Tk()
        window.geometry("600x400+10+10")
        window.maxsize(600, 400)
        window.minsize(600, 400)
        window.title("Snake game")

        self.frame1 = Frame(window, height=371, width=600)
        self.frame2 = Frame(window, width=600, height=371, bg="white")
        self.canvas = Canvas(self.frame1, width=600, height=371, bg="grey")
        self.score_label = Label(self.frame2, text="Score:")

        self.frame1.pack()
        self.frame2.pack(fill=BOTH)
        self.score_label.pack(side=LEFT)
        self.canvas.pack(fill=BOTH)

        self.draw_wall()
        self.draw_score()
        self.draw_food()
        self.draw_snake()

        self.play()

        window.mainloop()

    "=== View Part ==="

    def draw_wall(self):
        self.canvas.create_line(10, 10, 582, 10, fill='blue', width=5)
        self.canvas.create_line(10, 359, 582, 359, fill='blue', width=5)
        self.canvas.create_line(10, 10, 10, 359, fill='blue', width=5)
        self.canvas.create_line(582, 10, 582, 359, fill='blue', width=5)

    def draw_score(self):
        self.score()  # score model
        self.score_label.config(self.score_label,
                                text="Score:  " + str(self.gamescore) + "     level:  " + str(self.level))

    def draw_food(self):
        self.canvas.delete("food")
        self.foodx, self.foody = self.random_food()  # food model
        self.canvas.create_rectangle(self.foodx, self.foody, self.foodx + 15, self.foody + 15, fill="red", tags="food")

    def draw_snake(self):
        self.canvas.delete("snake")
        x, y = self.snake()  # snake model
        for i in range(len(x)):  # snake view
            self.canvas.create_rectangle(x[i], y[i], x[i] + self.step, y[i] + self.step, fill="orange", tags='snake')

    "=== Model Part ==="

    # food model
    def random_food(self):
        return random.randrange(11, 570, self.step), random.randrange(11, 340, self.step)

    # snake model
    def snake(self):
        for i in range(len(self.snakeX) - 1, 0, -1):
            self.snakeX[i] = self.snakeX[i - 1]
            self.snakeY[i] = self.snakeY[i - 1]
        self.snakeX[0] += self.snakeMove[0] * self.step
        self.snakeY[0] += self.snakeMove[1] * self.step
        return self.snakeX, self.snakeY

    # score model
    def score(self):
        self.gamescore = self.gamescore + 10
        if self.gamescore % 100 == 0:
            self.level = self.gamescore // 100 + 1
        return self.score, self.level

    "=== Control Part ==="

    def iseated(self):
        if self.snakeX[0] == self.foodx and self.snakeY[0] == self.foody:
            return True
        else:
            return False

    def isdead(self):
        # 判断是否头触墙以及是否咬到自身
        if self.snakeX[0] < 8 or self.snakeX[0] > 580 or self.snakeY[0] < 8 or self.snakeY[0] > 350:
            return self.gameover

        for i in range(1, len(self.snakeX)):
            if self.snakeX[0] == self.snakeX[i] and self.snakeY[0] == self.snakeY[i]:
                return self.gameover
        else:
            return False

    def move(self, event):
        # left:[-1,0],right:[1,0],up:[0,1],down:[0,-1]

        if (event.keycode == 39 or event.keycode == 68) and self.snakeDirection != 'left':
            self.snakeMove = [1, 0]
            self.snakeDirection = "right"
        elif (event.keycode == 38 or event.keycode == 87) and self.snakeDirection != 'down':
            self.snakeMove = [0, -1]
            self.snakeDirection = "up"
        elif (event.keycode == 37 or event.keycode == 65) and self.snakeDirection != 'right':
            self.snakeMove = [-1, 0]
            self.snakeDirection = "left"
        elif (event.keycode == 40 or event.keycode == 83) and self.snakeDirection != 'up':
            self.snakeMove = [0, 1]
            self.snakeDirection = "down"
        else:
            pass

    #       above codes can be insteaded by the following codes

    #        if (event.keysym == 'Right' or event.keysym == 'd') and self.snakeDirection != 'left':
    #            self.snakeMove = [1,0]
    #            self.snakeDirection = "right"
    #        elif (event.keysym == 'Up' or event.keysym == 'w') and self.snakeDirection != 'down':
    #            self.snakeMove = [0,-1]
    #            self.snakeDirection = "up"
    #        elif (event.keysym == 'Left' or event.keysym == 'a') and self.snakeDirection != 'right':
    #            self.snakeMove = [-1,0]
    #            self.snakeDirection = "left"
    #        elif (event.keysym == 'Down' or event.keysym == 's') and self.snakeDirection != 'up':
    #            self.snakeMove = [0,1]
    #            self.snakeDirection = "down"
    #        else:
    #            pass

    def play(self):
        self.canvas.bind_all("<Key>", self.move)
        self.canvas.focus_set()

        while True:
            if self.isdead():
                self.gameover()
                break
            elif self.iseated():
                self.snakeX[0] += self.snakeMove[0] * self.step
                self.snakeY[0] += self.snakeMove[1] * self.step
                self.snakeX.insert(1, self.foodx)
                self.snakeY.insert(1, self.foody)

                self.draw_score()
                self.draw_food()
                self.draw_snake()
            else:
                self.draw_snake()
                self.canvas.after(200)
                self.canvas.update()

    def gameover(self):
        #        self.canvas.delete("food","snake")
        self.canvas.unbind_all("<Key>")
        self.canvas.bind_all("<Key>", self.restart)
        self.canvas.create_text(270, 180, text="                   Game Over!\n \
        Press any key to continue", font='Helvetica -30 bold', tags='text')

    def restart(self, event):
        self.canvas.delete("food", "snake", "text")
        self.canvas.unbind_all('<Key>')

        # to initialize the snake in the range of (191,191,341,341)                
        r = random.randrange(191, 191 + 15 * 10, self.step)
        self.snakeX = [r, r + self.step, r + self.step * 2]
        self.snakeY = [r, r, r]

        # to initialize the moving direction
        self.snakeDirection = 'left'
        self.snakeMove = [-1, 0]

        # reset the score to zero 
        self.gamescore = -10
        self.draw_score()

        # to initialize the game (food and snake)
        self.draw_food()
        self.draw_snake()

        # to play the game
        self.play()


SnakeGame()

值得注意的是关于Python3中tkinter将键绑定到按钮的方式

#python 3.x
#键盘事件
canvas.bind_all("<KeyPress>",echo_event)
#如果绑定指定的键盘,则"<Key>" 或者"<KeyPress>"都可以,具体到指定键的话后面加入下划线和指定的键就好了,如:绑定小写字母t和Left键
canvas.bind_all("<KeyPress-t>",echo_event)
canvas.bind_all("<KeyPress-Left>",echo_event)
#鼠标事件
canvas.bind_all("<Double-Button-1>",echo_event)
canvas.bind_all("<Button-1>",echo_event)
canvas.bind_all("<Button-2>",echo_event)
canvas.bind_all("<Button-3>",echo_event)

详细绑定信息可以看Python Tkinter command和bind事件处理(绑定)用法详解

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值