首页 > 编程语言 >基于python的贪吃蛇小游戏

基于python的贪吃蛇小游戏

时间:2024-09-05 23:24:12浏览次数:10  
标签:head python self direction food game 小游戏 snake 贪吃蛇

游戏规则

在这里插入图片描述

1.玩家控制蛇在屏幕上移动(上下左右方向键),目标是吃到随机出现的食物。
2.每次吃到食物后,蛇的长度会增加。
3.游戏难度逐渐增加,蛇的移动速度会随着长度的增加而加快。
4.如果蛇撞到自己或碰到墙壁,游戏结束。

代码

import tkinter as tk
import random
from tkinter import messagebox

class SnakeGame:
    def __init__(self, root):
        self.root = root
        self.root.title("贪吃蛇游戏")

        # 游戏参数
        self.game_width = 400
        self.game_height = 400
        self.snake_size = 20
        self.snake_speed = 200  # 初始速度(毫秒)
        self.food_eaten = 0  # 吃到的食物数量

        # 创建画布
        self.canvas = tk.Canvas(root, width=self.game_width, height=self.game_height, bg="black")
        self.canvas.pack()

        # 初始化蛇和食物
        self.snake = [(100, 100), (80, 100), (60, 100)]  # 初始蛇的位置
        self.direction = "Right"  # 初始方向
        self.food = self.create_food()

        # 绑定按键
        self.root.bind("<KeyPress>", self.change_direction)

        # 开始游戏
        self.running = True
        self.update_game()

    # 创建食物
    def create_food(self):
        while True:
            x = random.randint(0, (self.game_width // self.snake_size) - 1) * self.snake_size
            y = random.randint(0, (self.game_height // self.snake_size) - 1) * self.snake_size
            if (x, y) not in self.snake:
                return (x, y)

    # 更新游戏状态
    def update_game(self):
        if self.running:
            self.move_snake()
            self.check_collisions()
            self.draw_elements()
            self.root.after(self.snake_speed, self.update_game)

    # 改变方向
    def change_direction(self, event):
        if event.keysym == "Up" and self.direction != "Down":
            self.direction = "Up"
        elif event.keysym == "Down" and self.direction != "Up":
            self.direction = "Down"
        elif event.keysym == "Left" and self.direction != "Right":
            self.direction = "Left"
        elif event.keysym == "Right" and self.direction != "Left":
            self.direction = "Right"

    # 移动蛇
    def move_snake(self):
        head_x, head_y = self.snake[0]

        if self.direction == "Up":
            head_y -= self.snake_size
        elif self.direction == "Down":
            head_y += self.snake_size
        elif self.direction == "Left":
            head_x -= self.snake_size
        elif self.direction == "Right":
            head_x += self.snake_size

        new_head = (head_x, head_y)
        self.snake = [new_head] + self.snake[:-1]

        # 吃到食物
        if new_head == self.food:
            self.snake.append(self.snake[-1])  # 增长蛇身
            self.food = self.create_food()
            self.food_eaten += 1  # 记录吃到的食物数量
            if self.snake_speed > 50:
                self.snake_speed -= 5  # 吃到食物后加快速度

    # 检查碰撞
    def check_collisions(self):
        head_x, head_y = self.snake[0]

        # 碰到墙壁
        if head_x < 0 or head_x >= self.game_width or head_y < 0 or head_y >= self.game_height:
            self.game_over()

        # 撞到自己
        if (head_x, head_y) in self.snake[1:]:
            self.game_over()

    # 绘制蛇和食物
    def draw_elements(self):
        self.canvas.delete("all")
        for x, y in self.snake:
            self.canvas.create_rectangle(x, y, x + self.snake_size, y + self.snake_size, fill="green")
        food_x, food_y = self.food
        self.canvas.create_oval(food_x, food_y, food_x + self.snake_size, food_y + self.snake_size, fill="red")

    # 游戏结束
    def game_over(self):
        self.running = False
        self.show_game_over_message()

    # 显示游戏结束信息
    def show_game_over_message(self):
        messagebox.showinfo("游戏结束", f"你一共吃了 {self.food_eaten} 个食物!")
        self.root.quit()  # 关闭程序

# 创建窗口并启动游戏
root = tk.Tk()
game = SnakeGame(root)
root.mainloop()

标签:head,python,self,direction,food,game,小游戏,snake,贪吃蛇
From: https://blog.csdn.net/C7211BA/article/details/141944403

相关文章

  • 【Python篇】PyQt5 超详细教程——由入门到精通(中篇一)
    文章目录PyQt5入门级超详细教程前言第4部分:事件处理与信号槽机制4.1什么是信号与槽?4.2信号与槽的基本用法4.3信号与槽的基础示例代码详解:4.4处理不同的信号代码详解:4.5自定义信号与槽代码详解:4.6信号槽的高级用法4.7总结第5部分:文件对话框与文件处理5.1什么......
  • [python][selenium] Web UI自动化页面切换iframe框架
    关联文章:WebUI自动化8种页面元素定位方式1、切换iframe的方法:switch_to.frame  方法的入参有4种:  1.1、id  1.2、name  1.3、index索引  1.4、iframe元素对象2、返回主文档(最外层的页面)的方法:switch_to.default_content()3、返回到上一级iframe的方法:switch_to.p......
  • Python中的“类的属性与方法”:解锁面向对象编程的奥秘
    在这个充满数据的世界里,Python作为一门强大的编程语言,已经成为了许多开发者的首选工具。而在Python中,类的属性与方法则是构建复杂系统不可或缺的一部分。它们不仅能够帮助我们更好地组织代码,还能提高程序的可读性和维护性。今天,就让我们一起探索类的属性与方法的魅力所在,从基础到进......
  • Python中的继承艺术:解锁代码复用的无限可能
    在编程的世界里,代码复用一直是一个备受关注的话题。而Python,作为一门优雅且强大的编程语言,提供了多种方式来帮助我们实现这一目标。其中,“继承”作为面向对象编程的一个核心概念,在Python中扮演着至关重要的角色。它不仅能够简化代码结构,提高开发效率,还能增强程序的可维护性和可扩展......
  • PYthon基础入门 day01——PYthon基础语法(上)
    目录一.注释二.语句结束符和分行符1.语句结束符2.分行符三.行和缩进四.变量及数据类型1.变量2.数据类型3.数字(Numbers)数据类型4.字符串(String)5.列表(List)6.元组(Tuple)7.字典(Dictionary)五.数据类型的转换六.标识符与关键字1.标识符2.关键字一.注释在PYthon中......
  • 基于java语言的点击方块小游戏
    游戏玩法目标:玩家需要在限时内点击尽可能多的方块。规则:游戏启动后,屏幕上会随机出现一个移动的方块;玩家点击方块得分,方块会重新随机出现在另一个位置;游戏限时为30秒,时间结束时显示总分。代码importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;import......
  • python中*args和**kwargs的理解
    python中*args和**kwargs的理解打包(pack):*args是把多个位置参数打包成元组,**kwargs是把多个关键字参数打包成字典。拆分(unpack):*args是把打包了的参数拆成单个的,依次赋值给函数的形参,**kwargs是把字典的键值拆成单个的,依次赋值给函数的形参。#*args,*作用,有两个:打包参数和拆分......
  • 通过三元运算符让 Python 代码更简洁高效
    目录什么是三元运算符?三元运算符的基本用法三元运算符的实际应用场景深入理解:三元运算符与普通`if-else`的比较三元运算符的注意事项三元运算符在实际项目中的应用总结在编程中,代码的可读性和效率是两个至关重要的因素。而Python,作为一种以简洁和易读著称的编......
  • 【全网最全】2024年数学建模国赛C题保奖思路+成品论文+matlab/python代码等(后续会更新
    您的点赞收藏是我继续更新的最大动力!一定要点击末文的卡片,那是获取资料的入口!解题思路数据读取:使用Pandas库读取Excel文件中的数据。数据清洗:检查数据是否完整,处理可能的重复项或异常值。数据分析:基于地块类型、面积等特征进行基本的数据分析,例如统计每种地块类型的总面积......
  • python学习总结之面向对象
    1.面向对象(上)1.1定义面向对象编程:oop[objectorientedprogramming]是一种python的编程思路;面向过程:就是我们一开始学习的,按照解决问题的步骤去写代码【根据业务逻辑去写代码】,在思考问题的时候,首先分析'怎么按照步骤去实现'然后将问题解决拆解成若干个步骤,并将这些步骤对......