【游戏制作】使用Python创建一个美观的贪吃蛇游戏,附完整代码

目录

前言

项目运行结果

项目简介

环境配置

代码实现

主体结构

主要功能详解

界面和菜单

控制蛇的移动

食物生成和碰撞检测

游戏结束

运行游戏

总结


前言

贪吃蛇游戏是一款经典的电脑游戏,许多人都曾经玩过。今天我们将使用Python和ttkbootstrap库来实现一个具有美观界面的贪吃蛇游戏,并添加一些额外的功能,使其更具吸引力。

项目运行结果

项目简介

我们的贪吃蛇游戏将包括以下功能:

  1. 游戏场地是一片矩形区域,蛇可以在这片区域中自由移动。
  2. 使用tkinterCanvas控件来绘制蛇、食物和游戏区域。
  3. 游戏开始时会随机生成一条蛇和一个食物,蛇会自动移动。
  4. 通过方向键控制蛇的移动方向。
  5. 当蛇吃到食物时,蛇身长度增加,并重新生成一个食物。
  6. 当蛇撞到墙壁、石块或自己时,游戏结束。
  7. 随着得分增加,游戏速度逐渐加快。
  8. 添加游戏菜单,包括暂停、继续、退出等功能。
  9. 添加查看历史记录、查看当前日期和时间、查看开发者信息、修改主题和窗口大小等功能。
  10. 使用ttkbootstrap来美化游戏界面。

环境配置

在开始编写代码之前,我们需要确保安装了必要的库。我们将使用tkinterttkbootstrap库。

pip install ttkbootstrap

代码实现

主体结构

我们首先创建一个SnakeGame类,包含所有游戏逻辑和界面设置。以下是完整的代码实现:

 

import tkinter as tk
from tkinter import messagebox, Menu, Toplevel, Text, simpledialog, StringVar
import random
import ttkbootstrap as ttk
from ttkbootstrap.constants import *
import datetimeclass SnakeGame:def __init__(self, root):self.root = rootself.root.title("贪吃蛇游戏")self.root.geometry("600x400")# 使用ttkbootstrap主题self.style = ttk.Style("cosmo")self.canvas = tk.Canvas(self.root, bg="white", height=400, width=600)self.canvas.pack()self.snake = [(20, 20), (20, 40), (20, 60)]self.food = Noneself.direction = "Down"self.running = Trueself.score = 0self.level = 1self.speed = 200self.create_menu()self.create_food()self.bind_keys()self.update()def create_menu(self):menubar = Menu(self.root)self.root.config(menu=menubar)game_menu = Menu(menubar, tearoff=0)menubar.add_cascade(label="游戏", menu=game_menu)game_menu.add_command(label="暂停", command=self.pause)game_menu.add_command(label="继续", command=self.resume)game_menu.add_separator()game_menu.add_command(label="退出", command=self.root.quit)help_menu = Menu(menubar, tearoff=0)menubar.add_cascade(label="帮助", menu=help_menu)help_menu.add_command(label="游戏帮助", command=self.show_help)# 历史记录菜单history_menu = Menu(menubar, tearoff=0)history_menu.add_command(label="查看历史记录", command=self.show_history)menubar.add_cascade(label="历史记录", menu=history_menu)# 查看菜单view_menu = Menu(menubar, tearoff=0)view_menu.add_command(label="查看日期", command=self.show_date)view_menu.add_command(label="查看开发者", command=self.show_developer)menubar.add_cascade(label="查看", menu=view_menu)# 修改菜单edit_menu = Menu(menubar, tearoff=0)# 修改主题子菜单theme_menu = Menu(edit_menu, tearoff=0)style = ttk.Style()theme_names = style.theme_names()  # 以列表的形式返回多个主题名for theme_name in theme_names:theme_menu.add_command(label=theme_name, command=lambda t=theme_name: self.change_theme(t))edit_menu.add_cascade(label="修改主题", menu=theme_menu)# 修改窗口大小功能edit_menu.add_command(label="修改窗口大小", command=self.change_window_size)menubar.add_cascade(label="修改", menu=edit_menu)def change_theme(self, theme_name):style = ttk.Style()style.theme_use(theme_name)def change_window_size(self):size = simpledialog.askstring("设置窗口大小", "请输入窗口大小(如800x600):")if size:self.root.geometry(size)def create_food(self):if self.food:self.canvas.delete(self.food)x = random.randint(0, 29) * 20y = random.randint(0, 19) * 20self.food = self.canvas.create_rectangle(x, y, x+20, y+20, fill="red")def bind_keys(self):self.root.bind("<Up>", self.go_up)self.root.bind("<Down>", self.go_down)self.root.bind("<Left>", self.go_left)self.root.bind("<Right>", self.go_right)self.root.bind("<space>", self.pause_resume)self.root.bind("j", self.speed_up)def go_up(self, event):if self.direction != "Down":self.direction = "Up"def go_down(self, event):if self.direction != "Up":self.direction = "Down"def go_left(self, event):if self.direction != "Right":self.direction = "Left"def go_right(self, event):if self.direction != "Left":self.direction = "Right"def pause_resume(self, event):if self.running:self.pause()else:self.resume()def speed_up(self, event):if self.speed > 50:self.speed -= 50def pause(self):self.running = Falsedef resume(self):self.running = Trueself.update()def show_help(self):messagebox.showinfo("游戏帮助", "这是一个贪吃蛇游戏。使用方向键来控制蛇的移动,吃到豆子增加分数和长度。避免撞到墙壁或蛇身。")def show_history(self):history_window = Toplevel(self.root)history_window.title("历史记录")history_window.geometry("320x420")history_text = Text(history_window, wrap="word")history_text.pack(expand=1, fill="both")for record in self.history:history_text.insert("end", record + "\n")def show_date(self):current_date = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")messagebox.showinfo("当前日期和时间", current_date)def show_developer(self):messagebox.showinfo("开发者信息", "开发者: B站 优秀稳妥的小光")def update(self):if self.running:self.move_snake()self.check_collisions()self.check_food()self.root.after(self.speed, self.update)def move_snake(self):head_x, head_y = self.snake[0]if self.direction == "Up":new_head = (head_x, head_y - 20)elif self.direction == "Down":new_head = (head_x, head_y + 20)elif self.direction == "Left":new_head = (head_x - 20, head_y)elif self.direction == "Right":new_head = (head_x + 20, head_y)self.snake = [new_head] + self.snake[:-1]self.canvas.delete("snake")for segment in self.snake:self.canvas.create_rectangle(segment[0], segment[1], segment[0] + 20, segment[1] + 20, fill="green", tags="snake")def check_collisions(self):head_x, head_y = self.snake[0]if head_x < 0 or head_x >= 600 or head_y < 0 or head_y >= 400 or len(self.snake) != len(set(self.snake)):self.game_over()def check_food(self):if self.canvas.coords(self.food) == [self.snake[0][0], self.snake[0][1], self.snake[0][0] + 20, self.snake[0][1] + 20]:self.snake.append(self.snake[-1])self.score += 1if self.score % 5 == 0:self.level += 1self.speed -= 20self.create_food()def game_over(self):self.running = Falsemessagebox.showinfo("游戏结束", f"你的得分是 {self.score}")self.root.quit()if __name__ == "__main__":root = ttk.Window(themename="cosmo")game = SnakeGame(root)root.mainloop()

主要功能详解

界面和菜单

我们使用了ttkbootstrap来创建美观的界面和菜单。菜单栏包含了游戏控制、查看信息、修改主题等功能。以下是创建菜单的代码:

def create_menu(self):menubar = Menu(self.root)self.root.config(menu=menubar)game_menu = Menu(menubar, tearoff=0)menubar.add_cascade(label="游戏", menu=game_menu)game_menu.add_command(label="暂停", command=self.pause)game_menu.add_command(label="继续", command=self.resume)game_menu.add_separator()game_menu.add_command(label="退出", command=self.root.quit)help_menu = Menu(menubar, tearoff=0)menubar.add_cascade(label="帮助", menu=help_menu)help_menu.add_command(label="游戏帮助", command=self.show_help)# 历史记录菜单history_menu = Menu(menubar, tearoff=0)history_menu.add_command(label="查看历史记录", command=self.show_history)menubar.add_cascade(label="历史记录", menu=history_menu)# 查看菜单view_menu = Menu(menubar, tearoff=0)view_menu.add_command(label="查看日期", command=self.show_date)view_menu.add_command(label="查看开发者", command=self.show_developer)menubar.add_cascade(label="查看", menu=view_menu)# 修改菜单edit_menu = Menu(menubar, tearoff=0)# 修改主题子菜单theme_menu = Menu(edit_menu, tearoff=0)style = ttk.Style()theme_names = style.theme_names()  # 以列表的形式返回多个主题名for theme_name in theme_names:theme_menu.add_command(label=theme_name, command=lambda t=theme_name: self.change_theme(t))edit_menu.add_cascade(label="修改主题", menu=theme_menu)# 修改窗口大小功能edit_menu.add_command(label="修改窗口大小", command=self.change_window_size)menubar.add_cascade(label="修改", menu=edit_menu)
控制蛇的移动

通过绑定键盘事件来控制蛇的移动方向:

def bind_keys(self):self.root.bind("<Up>", self.go_up)self.root.bind("<Down>", self.go_down)self.root.bind("<Left>", self.go_left)self.root.bind("<Right>", self.go_right)self.root.bind("<space>", self.pause_resume)self.root.bind("j", self.speed_up)
食物生成和碰撞检测

在游戏中,蛇需要不断地吃到食物来增加长度。以下是生成食物和检测碰撞的代码:

def create_food(self):if self.food:self.canvas.delete(self.food)x = random.randint(0, 29) * 20y = random.randint(0, 19) * 20self.food = self.canvas.create_rectangle(x, y, x+20, y+20, fill="red")def check_food(self):if self.canvas.coords(self.food) == [self.snake[0][0], self.snake[0][1], self.snake[0][0] + 20, self.snake[0][1] + 20]:self.snake.append(self.snake[-1])self.score += 1if self.score % 5 == 0:self.level += 1self.speed -= 20self.create_food()
游戏结束

当蛇撞到墙壁或自身时,游戏结束:

def game_over(self):self.running = Falsemessagebox.showinfo("游戏结束", f"你的得分是 {self.score}")self.root.quit()

运行游戏

将上述代码保存为一个Python文件并运行,即可开始玩贪吃蛇游戏。通过菜单栏可以进行暂停、继续、退出等操作,也可以查看历史记录、当前日期和开发者信息等。

总结

通过本项目,我们不仅实现了一个功能完整的贪吃蛇游戏,还学会了如何使用ttkbootstrap来美化界面。希望这个项目对你有所帮助,享受编程的乐趣吧!

 

交流扩列在主页加WX 

 

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/50489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql注意事项(一)

Mysql注意事项&#xff08;一&#xff09; 最近回顾了一下MySQL&#xff0c;发现了一些MySQL需要注意的事项&#xff0c;同时也作为学习笔记&#xff0c;记录下来。–2020年05月13日 1、通配符* 检索所有的列。 不建议使用 通常&#xff0c;除非你确定需要表中的每个列&am…

51单片机-第四节-定时器

一、定时器&#xff1a; 1.介绍&#xff1a; 单片机内部实现的计时系统。 作用&#xff1a;代替长时间Daley&#xff0c;提高cpu效率。 数量&#xff1a;至少2个&#xff0c;T0&#xff0c;T1&#xff0c;T2等。其中T0&#xff0c;T1为所有51单片机共有&#xff0c;T2等为不…

爬虫提速!用Python实现多线程下载器!

✨ 内容&#xff1a; 在网络应用中&#xff0c;下载速度往往是用户体验的关键。多线程下载可以显著提升下载速度&#xff0c;通过将一个文件分成多个部分并行下载&#xff0c;可以更高效地利用带宽资源。今天&#xff0c;我们将通过一个实际案例&#xff0c;学习如何用Python实…

typecho仿某度响应式主题Xaink

新闻类型博客主题&#xff0c;简洁好看&#xff0c;适合资讯类、快讯类、新闻类博客建站&#xff0c;响应式设计&#xff0c;支持明亮和黑暗模式 直接下载 zip 源码->解压后移动到 Typecho 主题目录->改名为xaink->启用。 演示图&#xff1a; 下载链接&#xff1a; t…

【proteus经典项目实战】51单片机用计数器中断实现100以内的按键计数并播放音乐

一、简介 一个基于8051微控制器的计数器系统&#xff0c;该系统能够通过按键输入递增计数&#xff0c;并且能够在达到100时归零。该系统将使用计数器中断和外部中断来实现其功能。 51单片机因其简单易用和成本效益高&#xff0c;成为电子爱好者和学生的首选平台。通过编程单片…

最新风车IM即时聊天源码及完整视频教程2024年7月版

堡塔面板 试验性Centos/Ubuntu/Debian安装命令 独立运行环境&#xff08;py3.7&#xff09; 可能存在少量兼容性问题 不断优化中 curl -sSO http://io.bt.sy/install/install_panel.sh && bash install_panel.sh 1.宝塔环境如下: Nginx 1.20 Tomcat 8 MySQL 8.0 R…

构造+有序集合,CF 1023D - Array Restoration

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1023D - Array Restoration 二、解题报告 1、思路分析 先考虑合法性检查&#xff1a; 对于数字x&#xff0c;其最左位置和最右位置 之间如果存在数字比x小&#xff0c;则非法 由于q次操作&#xff0c;第q…

GPT-4o mini:AI技术的平民化革命

目录 引言一、GPT-4o mini简介二、性能表现三、技术特点四、价格与市场定位五、应用场景六、安全性与可靠性七、未来展望八、代码示例结语 引言 在人工智能的浪潮中&#xff0c;大模型技术一直是研究和应用的热点。然而&#xff0c;高昂的成本和复杂的部署常常让许多企业和开发…

基于DMASM镜像的DMDSC共享存储集群部署

DMv8镜像模式共享存储集群部署 环境说明 操作系统&#xff1a;centos7.6 服务器&#xff1a;2台虚拟机 达梦数据库版本&#xff1a;达梦V8 安装前准备工作 参考文档《DM8共享存储集群》-第11、12章节 参考文档《DM8_Linux服务脚本使用手册》 1、系统环境(all nodes) 1…

学生党蓝牙耳机什么牌子的比较好?四大高性价比蓝牙耳机推荐

作为学生党&#xff0c;如果在有限的预算内选到一款合适自己的蓝牙耳机&#xff0c;那我们的生活和学习会增加很多的乐趣和便利&#xff0c;那面对市面上百元到千元不等的蓝牙耳机&#xff0c;学生党蓝牙耳机什么牌子的比较好&#xff1f;身为一名蓝牙耳机重度依赖者&#xff0…

AES算法分析:加密解密

✨主题简介 &#x1f510; 随着信息安全的重要性日益凸显&#xff0c;数据加密成为保护隐私和敏感信息的关键手段。本期我们将带你用Python实现AES加密解密&#xff0c;掌握这一强大的数据保护技术&#xff01; &#x1f4da;内容介绍 &#x1f50d; AES&#xff08;Advanced…

结构型设计模式-组合模式

一、组合模式 对于这个图片肯定会非常熟悉&#xff0c;上图我们可以看做是一个文件系统&#xff0c;对于这样的结构我们称之为树形结构。在树形结构中可以通过调用某个方法来遍历整个树&#xff0c;当我们找到某个叶子节点后&#xff0c;就可以对叶子节点进行相关的操作。可以将…

开始尝试从0写一个项目--前端(三)

器材管理板块 添加器材管理导航 src\views\home\Home.vue src\router\index.js src\views\equipment\Equipment.vue <template><div>hello!</div></template> 测试 搜索导航分页查询 src\views\equipment\Equipment.vue <template><div&…

Discourse 备份和恢复中有关附件的问题

下面的这个问题是在官方论坛上网友问的内容是&#xff1a; 我想问一下&#xff0c;备份和附件分别挂载了不同的S3 备份的时候会把附件的S3里面的内容也都一起备份了吗&#xff1f;如果不选择包含上传的图片和附件&#xff0c;那么恢复备份的时候&#xff0c;附件用的S3里面的内…

【区块链+绿色低碳】雄韬智慧锂电储能管理系统 | FISCO BCOS应用案例

雄韬智慧锂电储能管理系统&#xff08;Energy Management System&#xff0c;以下简称 EMS&#xff09;是雄韬集团响应国家实现新型电力 系统建设&#xff0c;助力“碳达峰、碳中和”目标而自主开发的创新智慧锂电储能系统。 系统采用了 FISCO BCOS 联盟链&#xff0c;融合了物…

Java 8 中 20 个高频面试题及答案

文章目录 前言20 道高频题问题 1&#xff1a;给定一个整数列表&#xff0c;使用 Stream 函数找出列表中所有的偶数&#xff1f;问题 2&#xff1a;给定一个整数列表&#xff0c;使用 Stream 函数找出所有以 1 开头的数字&#xff1f;问题 3&#xff1a;如何使用 Stream 函数在给…

【C++题解】1782. 字符图形2-星号倒直角

问题&#xff1a;1782. 字符图形2-星号倒直角 类型&#xff1a;嵌套循环、图形输出 题目描述&#xff1a; 打印字符图形。 输入&#xff1a; 一个整数&#xff08; 0<n<10 &#xff09;。 输出&#xff1a; 一个字符图形。 样例&#xff1a; 输入&#xff1a; 3…

微信Android一面凉经(2024)

微信Android一面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《微信Android一面凉经(2024)》。 面试职位: 微信-客户端开发工程师-基础功能(广州) And…

D语言

提起编程语言&#xff0c;相信大家第一时间想到的肯定都是C,但是相信资历较大的程序员们都不会忘记D语言 D语言自 1999 年发布至今已发展了 20 年 它既拥有 Java 那样强大的表现力 又具有 C 相当的性能 却因为 2.x 版本破坏性升级 导致社区大量核心开发者将其放弃。 2010 年——…

Ubuntu22.04系统安装nodejs 14 保姆级教程

下载软件包 从NodeSource 的官方源下载并安装 Node.js 14.x 版本的软件包&#xff0c;适用于 Debian 和 Ubuntu 系统&#xff1a; curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash - 更新软件源 更新软件源 sudo apt-get update 下载bodejs14 下载nodejs14 sud…