当前位置: 首页 > news >正文

贪吃蛇游戏的编程之旅:在Windows PyCharm中使用Python

在电脑游戏的发展史中,贪吃蛇游戏无疑是其中的经典之作。许多人对其简单而上瘾的游戏玩法念念不忘。对编程爱好者来说,重新编写一个贪吃蛇游戏不仅是对青春回忆的一种致敬,也是一个极佳的学习机会。本文将引导你在Windows系统的PyCharm环境下,使用Python和pygame库来实现这个经典游戏。

前置准备:安装Pygame

首先,确保你的电脑上已经安装了Python。接着,在PyCharm中安装pygame库。这是一个流行的Python库,专为编写游戏而设计。在PyCharm的终端中输入以下命令来安装:

pip install pygame
创建游戏窗口

启动新项目后,创建一个新的Python文件,例如命名为 snake_game.py。游戏的第一步是设置游戏窗口。Pygame库允许你轻松定义窗口的大小和标题:

import pygamepygame.init()
width, height = 640, 480
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption('贪吃蛇游戏')
定义游戏元素

接下来,定义游戏中的基本元素:蛇的位置、食物的位置以及蛇的身体。为了让蛇移动,我们需要定义一个方向并根据键盘输入来更新这个方向:

snake_pos = [100, 50]
snake_body = [[100, 50], [90, 50], [80, 50]]
food_pos = [random.randrange(1, (width//10)) * 10, random.randrange(1, (height//10)) * 10]
food_spawn = True
direction = 'RIGHT'
change_to = direction
游戏逻辑

游戏的核心逻辑包括处理键盘事件、更新蛇的位置、处理食物的生成与消耗,以及检测游戏结束的条件:

for event in pygame.event.get():if event.type == pygame.KEYDOWN:if event.key == pygame.K_RIGHT:change_to = 'RIGHT'elif event.key == pygame.K_LEFT:change_to = 'LEFT'elif event.key == pygame.K_UP:change_to = 'UP'elif event.key == pygame.K_DOWN:change_to = 'DOWN'# 更新蛇的位置
if direction == 'RIGHT':snake_pos[0] += 10
elif direction == 'LEFT':snake_pos[0] -= 10
elif direction == 'UP':snake_pos[1] -= 10
elif direction == 'DOWN':snake_pos[1] += 10
游戏结束和计分

游戏结束的条件是蛇撞到自己或游戏边界。同时,每次吃到食物时,蛇的长度增加,分数也相应增加:

if snake_pos[0] < 0 or snake_pos[0] > width-10 or snake_pos[1] < 0 or snake_pos[1] > height-10:game_over()
for block in snake_body[1:]:if snake_pos[0] == block[0] and snake_pos[1] == block[1]:game_over()
渲染和刷新

最后,游戏需要不断刷新屏幕以显示最新的游戏状态。Pygame的 display.update() 函数负责这一功能。设置适当的帧率可以使游戏运行平滑:

pygame.display.update()
clock.tick(10)  # 控制游戏速度
总代码和运行结果
import pygame
import random
import sys
import time  # 导入所需的模块pygame.init()# 游戏窗口设置
width, height = 640, 480
screen = pygame.display.set_mode((width, height))
clock = pygame.time.Clock()
pygame.display.set_caption('贪吃蛇游戏')# 颜色定义
black = (0, 0, 0)
white = (255, 255, 255)
red = (255, 0, 0)
green = (0, 255, 0)# 贪吃蛇初始设置
snake_pos = [100, 50]
snake_body = [[100, 50], [90, 50], [80, 50]]
food_pos = [random.randrange(1, (width // 10)) * 10, random.randrange(1, (height // 10)) * 10]
food_spawn = True
direction = 'RIGHT'
change_to = direction# 游戏分数
score = 0# 设置速度
speed = 10# 路径 to the custom font file
font_path = 'C:\\Windows\\Fonts\\SIMSUNB.TTF'  # Modify this path as necessarydef game_over():my_font = pygame.font.Font(font_path, 90)  # Use the custom fontgame_over_surface = my_font.render('你输了', True, red)game_over_rect = game_over_surface.get_rect()game_over_rect.midtop = (width / 2, height / 4)screen.blit(game_over_surface, game_over_rect)show_score(0)pygame.display.flip()time.sleep(2)pygame.quit()sys.exit()def show_score(choice=1):s_font = pygame.font.Font(font_path, 24)  # Use the custom fonts_surface = s_font.render('分数 : {0}'.format(score), True, black)s_rect = s_surface.get_rect()if choice == 1:s_rect.midtop = (width / 10, 15)else:s_rect.midtop = (width / 2, height / 1.25)screen.blit(s_surface, s_rect)# 游戏主循环
while True:for event in pygame.event.get():if event.type == pygame.KEYDOWN:if event.key == pygame.K_RIGHT:change_to = 'RIGHT'if event.key == pygame.K_LEFT:change_to = 'LEFT'if event.key == pygame.K_UP:change_to = 'UP'if event.key == pygame.K_DOWN:change_to = 'DOWN'if event.type == pygame.QUIT:pygame.quit()sys.exit()# 确定方向if change_to == 'RIGHT' and not direction == 'LEFT':direction = 'RIGHT'if change_to == 'LEFT' and not direction == 'RIGHT':direction = 'LEFT'if change_to == 'UP' and not direction == 'DOWN':direction = 'UP'if change_to == 'DOWN' and not direction == 'UP':direction = 'DOWN'# 移动蛇头if direction == 'RIGHT':snake_pos[0] += 10if direction == 'LEFT':snake_pos[0] -= 10if direction == 'UP':snake_pos[1] -= 10if direction == 'DOWN':snake_pos[1] += 10# 蛇身体增长机制snake_body.insert(0, list(snake_pos))if snake_pos[0] == food_pos[0] and snake_pos[1] == food_pos[1]:score += 10food_spawn = Falseelse:snake_body.pop()if not food_spawn:food_pos = [random.randrange(1, (width // 10)) * 10, random.randrange(1, (height // 10)) * 10]food_spawn = True# 绘制所有元素screen.fill(white)for pos in snake_body:pygame.draw.rect(screen, green, pygame.Rect(pos[0], pos[1], 10, 10))pygame.draw.rect(screen, red, pygame.Rect(food_pos[0], food_pos[1], 10, 10))# 如果蛇撞到边界或自己if snake_pos[0] < 0 or snake_pos[0] > width - 10 or snake_pos[1] < 0 or snake_pos[1] > height - 10:game_over()for block in snake_body[1:]:if snake_pos[0] == block[0] and snake_pos[1] == block[1]:game_over()show_score()pygame.display.update()clock.tick(speed)

在这里插入图片描述

通过这些步骤,你可以在自己的电脑上重新创造经典的贪吃蛇游戏。这不仅仅是一个怀旧之旅,更是一个展示如何从头到尾构建一个完整游戏项目的绝佳示例。无论你是编程新手还是希望复习基础知识的老手,编写一个像贪吃蛇这样的简单游戏都是一个很好的开始。

相关文章:

  • 【代码随想录】【算法训练营】【第28天】 [93]复原IP地址 [78]子集 [90]子集II
  • 【html】简单网页模板源码
  • 主流物联网协议客户端开源库介绍(mqtt,coap,websocket,httphttps,tcp及udp)
  • 关于头条项目经验的总结
  • Java 8 Stream 用法大全
  • 眼在手上的手眼标定(matlab+python)实测精度±1mm
  • 网络编程之XDP技术介绍
  • VFS:8.fd管理-fs/file.c源码阅读
  • Rockmongo详解:高效管理MongoDB的图形化利器
  • SM201,SM203主控模块备件
  • 算法——二分查找
  • 开关电源中电感设计
  • R语言探索与分析14-美国房价及其影响因素分析
  • Codeforces Round 951 (Div. 2) D. Fixing a Binary String 题解
  • Linux系统之部署Blog-Index导航页
  • @angular/forms 源码解析之双向绑定
  • AHK 中 = 和 == 等比较运算符的用法
  • Akka系列(七):Actor持久化之Akka persistence
  • CSS盒模型深入
  • go append函数以及写入
  • JavaScript 基本功--面试宝典
  • Java反射-动态类加载和重新加载
  • JS 面试题总结
  • node-glob通配符
  • React+TypeScript入门
  • Vue 2.3、2.4 知识点小结
  • Vue 重置组件到初始状态
  • Web Storage相关
  • 高度不固定时垂直居中
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 基于 Babel 的 npm 包最小化设置
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 坑!为什么View.startAnimation不起作用?
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 如何胜任知名企业的商业数据分析师?
  • 首页查询功能的一次实现过程
  • 学习HTTP相关知识笔记
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​Redis 实现计数器和限速器的
  • # 计算机视觉入门
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #QT(一种朴素的计算器实现方法)
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (zhuan) 一些RL的文献(及笔记)
  • (回溯) LeetCode 40. 组合总和II
  • (六)Flink 窗口计算
  • (七)Appdesigner-初步入门及常用组件的使用方法说明
  • (四)汇编语言——简单程序
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (五)关系数据库标准语言SQL
  • (详细文档!)javaswing图书管理系统+mysql数据库