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

使用Python+pygame实现贪吃蛇小游戏

使用Python+pygame贪吃蛇小游戏

使用第三方库pygame,关于Python中pygame游戏模块的安装使用可见 https://blog.csdn.net/cnds123/article/details/119514520

给出两种实现。

第一种

运行效果如下:

游戏源码如下:

import pygame
import sys
import random# 初始化pygame
pygame.init()# 设置屏幕大小
screen_size = (640, 480)
screen = pygame.display.set_mode(screen_size)# 设置游戏标题
pygame.display.set_caption("贪吃蛇:按p键暂停/继续")# 定义颜色
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)# 蛇的初始位置
snake_pos = [[100, 100], [80, 100], [60, 100]]# 食物的初始位置
food_pos = [300, 300]# 蛇的初始速度
snake_speed = [20, 0]# 初始化分数
score = 0# 创建字体对象
font = pygame.font.Font(None, 36)# 游戏暂停标志
paused = False# 主循环
while True:# 处理游戏事件for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()elif event.type == pygame.KEYDOWN:if event.key == pygame.K_p:  # 按 P 键暂停或继续paused = not pausedif not paused:if event.key == pygame.K_UP and snake_speed != [0, 20]:snake_speed = [0, -20]elif event.key == pygame.K_DOWN and snake_speed != [0, -20]:snake_speed = [0, 20]elif event.key == pygame.K_LEFT and snake_speed != [20, 0]:snake_speed = [-20, 0]elif event.key == pygame.K_RIGHT and snake_speed != [-20, 0]:snake_speed = [20, 0]if not paused:# 更新蛇的位置snake_pos.insert(0, [snake_pos[0][0] + snake_speed[0], snake_pos[0][1] + snake_speed[1]])# 检查蛇头是否碰到墙壁,如果是则“经过墙壁”if snake_pos[0][0] < 0:snake_pos[0][0] = screen_size[0]-20elif snake_pos[0][0] >= screen_size[0]:snake_pos[0][0] = 0elif snake_pos[0][1] < 0:snake_pos[0][1] = screen_size[1]-20elif snake_pos[0][1] >= screen_size[1]:snake_pos[0][1] = 0# 检查蛇头是否碰到食物if snake_pos[0] == food_pos:food_pos = [random.randrange(1, screen_size[0] // 20) * 20, random.randrange(1, screen_size[1] // 20) * 20]score += 1  # 计分else:snake_pos.pop()# 绘制游戏界面screen.fill(WHITE)for pos in snake_pos:pygame.draw.rect(screen, GREEN, pygame.Rect(pos[0], pos[1], 20, 20))pygame.draw.rect(screen, RED, pygame.Rect(food_pos[0], food_pos[1], 20, 20))# 显示得分score_text = font.render("Score: " + str(score), True, (0, 0, 0))screen.blit(score_text, (10, 10))# 如果游戏暂停,则显示暂停提示if paused:pause_text = font.render("Paused. Press P to continue.", True, (0, 0, 0))screen.blit(pause_text, (screen_size[0] // 2 - pause_text.get_width() // 2, screen_size[1] // 2 - pause_text.get_height() // 2))pygame.display.flip()  # 更新屏幕显示# 控制游戏速度pygame.time.Clock().tick(6)

第二种

就不给出运行效果图了,你可以运行看看。

下面给出另一种实现源码:

import pygame
import time
import random# 设置蛇的速度
snake_speed = 15# 窗口颜色
white = pygame.Color(255, 255, 255)# 蛇的颜色
green = pygame.Color(0, 255, 0)# 食物的颜色
red = pygame.Color(255, 0, 0)# 初始化pygame
pygame.init()# 初始化游戏窗口
window = pygame.display.set_mode((720, 480))# FPS(帧率)控制器
fps = pygame.time.Clock()# 定义蛇的默认位置
snake_position = [100, 50]# 定义蛇身体的前四个块
snake_body = [[100, 50], [90, 50], [80, 50], [70, 50]]# 食物位置
food_position = [random.randrange(1, 72) * 10, random.randrange(1, 48) * 10]# 蛇吃到食物时
food_spawn = True# 设置默认的蛇的方向为向右
direction = 'RIGHT'# 初始分数
score = 0def game_over():# 设置字体以显示分数#font = pygame.font.SysFont(None, 26)                font = pygame.font.Font("C:\\Windows\\Fonts\\simsun.ttc", 26) #显示中文文字score_text = font.render('得分: ' + str(score), True, green)window.blit(score_text, [320, 240])# 显示信息again_text = font.render('游戏结束!按任意键重新开始', True, red)  # 修改颜色变量为whitewindow.blit(again_text, [160, 280])pygame.display.flip()  # 使用 flip() 来更新整个屏幕# 等待用户按键然后重新开始游戏waiting_for_input = Truewhile waiting_for_input:for event in pygame.event.get():if event.type == pygame.KEYDOWN:waiting_for_input = Falseelif event.type == pygame.QUIT:pygame.quit()quit()# 游戏重新开始main()# 游戏的主逻辑
def main():global direction, food_position, food_spawn, score# 重置游戏score = 0snake_position = [100, 50]snake_body = [[100, 50], [90, 50], [80, 50], [70, 50]]direction = 'RIGHT'food_position = [random.randrange(1, 72) * 10, random.randrange(1, 48) * 10]food_spawn = Truewhile True:# 处理按键事件for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()quit()elif event.type == pygame.KEYDOWN:if event.key == pygame.K_UP and direction != 'DOWN':direction = 'UP'if event.key == pygame.K_DOWN and direction != 'UP':direction = 'DOWN'if event.key == pygame.K_LEFT and direction != 'RIGHT':direction = 'LEFT'if event.key == pygame.K_RIGHT and direction != 'LEFT':direction = 'RIGHT'# 移动蛇if direction == 'UP':snake_position[1] -= 10if direction == 'DOWN':snake_position[1] += 10if direction == 'LEFT':snake_position[0] -= 10if direction == 'RIGHT':snake_position[0] += 10# 蛇身体增长机制snake_body.insert(0, list(snake_position))if snake_position[0] == food_position[0] and snake_position[1] == food_position[1]:score += 1food_spawn = Falseelse:snake_body.pop()if not food_spawn:food_position = [random.randrange(1, 72) * 10, random.randrange(1, 48) * 10]food_spawn = True# 图形界面window.fill(white)for pos in snake_body:pygame.draw.rect(window, green, pygame.Rect(pos[0], pos[1], 10, 10))pygame.draw.rect(window, red, pygame.Rect(food_position[0], food_position[1], 10, 10))# 游戏结束条件if snake_position[0] < 0 or snake_position[0] > 710 or snake_position[1] < 0 or snake_position[1] > 470:game_over()break  # 结束游戏后跳出循环for block in snake_body[1:]:if snake_position[0] == block[0] and snake_position[1] == block[1]:game_over()break  # 结束游戏后跳出循环# 更新显示pygame.display.update()# 每秒帧数/刷新率fps.tick(snake_speed)# 运行主函数
if __name__ == "__main__":main()

OK! 

http://www.lryc.cn/news/281550.html

相关文章:

  • SpringBoot 全局异常统一处理:BindException(绑定异常)
  • ucloud轻量云(wordpress)配置ssl
  • 电脑/设备网络共享给其他设备上网
  • vue之虚拟滚动
  • Redis学习指南(11)-Redis的有序集合数据类型介绍
  • Spring的纯注解配置
  • numpy 筛选多段数据
  • 【Kotlin】协程的字节码原理
  • 区间预测 | Matlab实现LSSVM-ABKDE的最小二乘支持向量机结合自适应带宽核密度估计多变量回归区间预测
  • 基于深度学习的实例分割的Web应用
  • 20240115如何在线识别俄语字幕?
  • Flink 处理函数(1)—— 基本处理函数
  • Linux系统下编译MPlayer
  • 事务的ACID属性是什么?为什么它们很重要?
  • 计算机毕业设计 基于Java的手机销售网站的设计与实现 Java实战项目 附源码+文档+视频讲解
  • Redis相关命令详解及其原理
  • go语言中的GoMock
  • DIFFWAVE: A VERSATILE DIFFUSION MODEL FOR AUDIO SYNTHESIS (Paper reading)
  • 排序算法8----归并排序(非递归)(C)
  • Golang 里的 context
  • PHP短链接url还原成长链接
  • redis原理(三)redis命令
  • 教程:在Django中实现微信授权登录
  • YOLOv5改进 | 主干篇 | 12月份最新成果TransNeXt特征提取网络(全网首发)
  • 【java八股文】之计算机网络系列篇
  • SpringAMQP的使用
  • MATLAB - 使用运动学 DH 参数构建机械臂
  • 2024年腾讯云新用户优惠云服务器价格多少?
  • 如何在原型中实现继承和多态
  • MySQL/Oracle 的 字符串拼接