游戏开发丨基于Pygame的AI版贪吃蛇小游戏

news2024/11/18 16:49:57

文章目录

  • 写在前面
  • 需求分析
  • 程序设计
  • 程序分析
  • 运行结果
  • 系列文章
  • 写在后面

写在前面

本期内容

  • 基于pygame的AI版贪吃蛇小游戏

所需环境

  • python
  • pycharm或anaconda
  • pygame

下载地址

  • https://download.csdn.net/download/m0_68111267/88789665

需求分析

本游戏使用Pygame模块开发,不需要玩家操纵贪吃蛇,贪吃蛇会自动吃掉屏幕上随机出现的食物,每吃一个食物贪吃蛇长度增加一节。如果贪吃蛇撞到屏幕边缘或自己的身体,则游戏结束。游戏界面包括游戏区域和得分显示区域。

程序设计

import pygame
import sys
from random import randint

# 蛇运动的场地长宽
HEIGHT = 25
WIDTH = 25

SCREEN_X = HEIGHT * 25
SCREEN_Y = WIDTH * 25

FIELD_SIZE = HEIGHT * WIDTH

# 蛇头总是位于snake数组的第一个元素
HEAD = 0

# 用来代表不同东西的数字,由于矩阵上每个格子会处理成到达食物的路径长度,
# 因此这三个变量间需要有足够大的间隔(>HEIGHT*WIDTH)
FOOD = 0
UNDEFINED = (HEIGHT + 1) * (WIDTH + 1)
SNAKE = 2 * UNDEFINED

# 由于snake是一维数组,所以对应元素直接加上以下值就表示向四个方向移动
LEFT = -1
RIGHT = 1
UP = -WIDTH
DOWN = WIDTH

# 错误码
ERR = -1111

# 用一维数组来表示二维的东西
# board表示蛇运动的矩形场地
# 初始化蛇头在(1,1)的地方,第0行,HEIGHT行,第0列,WIDTH列为围墙,不可用
# 初始蛇长度为1
board = [0] * FIELD_SIZE
snake = [0] * (FIELD_SIZE + 1)
snake[HEAD] = 1 * WIDTH + 1
snake_size = 1
……(完整代码请下载后查看)

程序分析

这段代码是一个基于Python和pygame库实现的贪吃蛇游戏的核心逻辑部分。游戏在一个25x25大小的网格上进行,其中每个格子都有一个对应的索引值,用于表示蛇的位置、食物位置以及地图上的可达性。

首先,定义了一些全局变量,如游戏区域尺寸(HEIGHT, WIDTH)、屏幕尺寸(SCREEN_X, SCREEN_Y)、场地大小(FIELD_SIZE)以及方向常量LEFT, RIGHT, UP, DOWN等。蛇和临时蛇的位置信息分别存储在一维数组snake和tmpsnake中,初始时蛇长度为1,位于(1,1)的位置。同时设置了食物food的初始位置,并且定义了FOOD、UNDEFINED和SNAKE三个特殊的数值,用来在二维矩阵board中区分食物、未探索区域及蛇体。

游戏中包含多个关键函数:

  1. is_cell_free(idx, psize, psnake):检查给定索引idx处的单元格是否为空,即不被蛇身覆盖。
  2. is_move_possible(idx, move):判断蛇能否向给定方向move移动。
  3. board_reset(psnake, psize, pboard):重置地图状态,将蛇体和食物标记出来,并将其他空地设置为可到达的未知距离。
  4. board_refresh(pfood, psnake, pboard):采用广度优先搜索算法更新地图中的路径长度,计算从每个非蛇体单元格到食物的最短距离。
  5. choose_shortest_safe_move(psnake, pboard)choose_longest_safe_move(psnake, pboard):根据当前地图数据,选择距离食物最近或最远的安全移动方向。
  6. is_tail_inside()follow_tail():通过虚拟操作判断蛇头是否可以朝蛇尾方向移动以避免死路,并找到这个方向。
  7. any_possible_move():当无明确安全方向时,随机选择一个可行的方向。
  8. shift_array(arr, size):移动数组元素,模拟蛇的身体沿指定方向移动。
  9. new_food():生成新的食物位置,确保不在蛇体内。
  10. make_move(pbest_move):执行实际的蛇移动操作,包括增加蛇长、更新蛇头位置、调整蛇身以及处理吃到食物的情况。
  11. virtual_shortest_move():进行一次虚拟移动,尝试寻找最短路径吃到食物并更新虚拟地图状态。
  12. find_safe_way():结合虚拟运行结果判断蛇与食物间的路径情况,并确定安全的下一步移动方向。

主循环中,程序不断检测用户输入事件(如退出或按下空格键重新开始),并依据上述函数计算出最佳移动方向,然后更新蛇的位置。如果蛇碰到自身或其他不可移动区域,则游戏结束,显示“YOU DEAD!”提示,并告知玩家按空格键重新开始。同时,实时显示当前分数(score)。

最后,main() 函数包含了游戏的初始化、事件处理、画面渲染和游戏逻辑更新等内容,构成了整个贪吃蛇游戏的核心框架。

运行结果

AI_snake

系列文章

序号目录直达链接
1入门实战丨基于Tkinter的简易计算器https://want595.blog.csdn.net/article/details/131731173
2入门实战丨基于Tkinter的生日管理系统https://want595.blog.csdn.net/article/details/131731380
3数据库实战丨基于Tkinter+MySQL的学生成绩管理系统https://want595.blog.csdn.net/article/details/130992721
4数据库实战丨基于Tkinter+MySQL的梅西生涯数据管理系统https://want595.blog.csdn.net/article/details/130995564
5Web实战丨基于Django与Bootstrap的在线计算器https://want595.blog.csdn.net/article/details/134424381
6Web实战丨基于django+html+css的在线购物商城https://want595.blog.csdn.net/article/details/135466052
7Web实战丨基于django+html+css+js的电子商务网站https://want595.blog.csdn.net/article/details/135506809
8Web实战丨基于Django与HTML的用户登录验证系统https://want595.blog.csdn.net/article/details/135513413
9Web实战丨基于django+html+css+js的学院门户网站https://want595.blog.csdn.net/article/details/135511066
10Web实战丨基于Django与HTML的新闻发布系统https://want595.blog.csdn.net/article/details/135519824
11Web实战丨基于django+html+css+js的在线博客网站https://want595.blog.csdn.net/article/details/135536765
12……

写在后面

我是一只有趣的兔子,感谢你的喜欢!

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

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

相关文章

Docker 和 Kubernetes:容器化时代的崛起与演变

在过去的十年间,容器化技术彻底改变了软件开发和部署的面貌。 Docker 的登场无疑是这场变革的催化剂,它将应用和服务的打包、分发、部署流程标准化,让开发者的生活变得更加简单。 紧随其后,Kubernetes 作为容器编排的领军者&#…

【Java 数据结构】二叉树

二叉树 1. 树型结构(了解)1.1 概念1.2 概念(重要)1.3 树的表示形式(了解)1.4 树的应用 2. 二叉树(重点)2.1 概念2.2 两种特殊的二叉树2.3 二叉树的性质2.4 二叉树的存储2.5 二叉树的…

026-安全开发-PHP应用模版引用Smarty渲染MVC模型数据联动RCE安全

026-安全开发-PHP应用&模版引用&Smarty渲染&MVC模型&数据联动&RCE安全 #知识点: 1、PHP新闻显示-数据库操作读取显示 2、PHP模版引用-自写模版&Smarty渲染 3、PHP模版安全-RCE代码执行&三方漏洞 演示案例: ➢新闻列表&…

详解OpenHarmony各部分文件在XR806上的编译顺序

大家好,今天我们来谈一谈编程时一个很有趣的话题——编译顺序。我知道,一提到编译可能大家会感到有点儿头疼,但请放心,我不会让大家头疼的。我们要明白,在开始写代码之前,了解整个程序的编译路径是十分有必…

1.24CNN(基本框架),RNN(简单RNN,LSTM,GRU简要)两个参考论文

目录 CNN RNN 3种RNN模型 简单RNN LSTM (长短期记忆模型) GRU 参考论文 CNN CNN是卷积神经网络 提取图片特征 、 在输出阶段可以使用sigmoid函数返回01值 RNN 3种RNN模型 简单RNN H就是每层神经元所产生的一个输出信号,输出…

【AI视野·今日NLP 自然语言处理论文速览 第七十六期】Fri, 12 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Fri, 12 Jan 2024 Totally 60 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Axis Tour: Word Tour Determines the Order of Axes in ICA-transformed Embeddings Authors Hiroaki Yamagi…

STM32学习笔记(三) —— GPIO点亮LED

1.GPIO简介 GPIO,全称是General-purpose input/output(通用输入输出)。在单片机中是表示能被控制的引脚,能检测输入信号的高低电平,也能输出高低电平控制外部设备。STM32F103RCT6一共有64个引脚,其中有51个…

【国产MCU】-认识CH32V307及开发环境搭建

认识CH32V307及开发环境搭建 文章目录 认识CH32V307及开发环境搭建1、CH32V307介绍2、开发环境搭建3、程序固件下载1、CH32V307介绍 CH32V307是沁恒推出的一款基于32位RISC-V设计的互联型微控制器,配备了硬件堆栈区、快速中断入口,在标准RISC-V基础上大大提高了中断响应速度…

Matlab进阶绘图第40期—堆叠蝴蝶图

堆叠蝴蝶图是蝴蝶图的一种变形。 堆叠蝴蝶图一般由左右两个横向堆叠图组合而成,可以很直观地展示两种数据各组分之间的差异。 本文使用自制的Butterfly小工具进行堆叠蝴蝶图的绘制,先来看一下成品效果: 特别提示:本期内容『数据…

密码加密——MD5与BCryptPasswordEncoder

目录 一、问题 二、密码加密 1、MD5密码加密 2、BCryptPasswordEncoder加密(推荐) 2.1 特点 2.2 使用步骤 一、问题 在数据库表中的密码都是明文存储的,安全性太低 需求: 将密码加密后存储,提高安全性 二、密码加密…

Shell中正则表达式

1.正则表达式介绍 1、正则表达式---通常用于判断语句中,用来检查某一字符串是否满足某一格式 2、正则表达式是由普通字符与元字符组成 3、普通字符包括大小写字母、数字、标点符号及一些其他符号 4、元字符是指在正则表达式中具有特殊意义的专用字符&#xff0c…

翻译: GPT-4 Vision通过量身定制的推荐来增强应用的用户体验 升级Streamlit五

GPT-4 Vision 系列: 翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式一翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式二翻译: GPT-4 Vision静态图表转换为动态数据可视化 升级Streamlit 三翻译: GPT-4 Vision从图像转换为完全可编辑的表格 升级St…

游戏开发丨基于Panda3D的迷宫小球游戏

文章目录 写在前面Panda3D程序设计程序分析运行结果系列文章写在后面 写在前面 本期内容 基于panda3d的迷宫中的小球游戏 所需环境 pythonpycharm或anacondapanda3d 下载地址 https://download.csdn.net/download/m0_68111267/88792121 Panda3D Panda3D是一种开放源代码…

JUC并发编程-四大函数式接口、Stream 流式计算、ForkJoin并行执行任务

12. 四大函数式接口 新时代的程序员:lambda表达式、链式编程、函数式接口、Stream流式计算 函数式接口:只有一个方法的接口,可以有一些默认的方法 如:Runnable接口函数 1)Function 函数型接口 public class Functio…

SpringBoot项目实现热部署的配置方法

SpringBoot项目实现热部署的配置方法 1、什么是热部署? 热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用。 2、什么是SpringBoot热部署? SpringBoot热部署就是在项目正在运行的时候修改代码, 却不需要重新启动…

QT 使用XML保存操作记录

文章目录 1 实现程序保存操作记录的思路2 XML文档基本结构3 QDomDocument实现XML读写3.1 QDomDocument实现生成XML文件3.2 QDomDocument实现读取XML文件 4 QXmlStreamWriter实现读写4.1 QXmlStreamWriter实现生成XML4.2 QXmlStreamWriter实现读取XML 1 实现程序保存操作记录的思…

(五)MySQL的备份及恢复

1、MySQL日志管理 在数据库保存数据时,有时候不可避免会出现数据丢失或者被破坏,这样情况下,我们必须保证数据的安全性和完整性,就需要使用日志来查看或者恢复数据了 数据库中数据丢失或被破坏可能原因: 误删除数据…

二进制安全虚拟机Protostar靶场(6)堆的简单介绍以及实战 heap1

前言 这是一个系列文章&#xff0c;之前已经介绍过一些二进制安全的基础知识&#xff0c;这里就不过多重复提及&#xff0c;不熟悉的同学可以去看看我之前写的文章 程序静态分析 https://exploit.education/protostar/heap-one/#include <stdlib.h> #include <unis…

笔记本键盘卸载或自动跳出字符故障或按键无效修复办法

首先&#xff0c;在Windows 10操作系统中&#xff0c;您可以在笔记本电脑桌面上找到"计算机"图标&#xff0c;并使用鼠标右键点击它。然后选择"属性"选项。 打开系统属性后&#xff0c;您会看到右上角有一个"设备管理器"选项。请点击它来打开设…

Vim实战:使用Vim实现图像分类任务(一)

文章目录 摘要安装包安装timm 数据增强Cutout和MixupEMA项目结构编译安装Vim环境环境安装过程安装库文件 计算mean和std生成数据集 摘要 论文&#xff1a;https://arxiv.org/pdf/2401.09417v1.pdf 翻译&#xff1a; 近年来&#xff0c;随着深度学习的发展&#xff0c;视觉模型…