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

phcharm贪吃蛇小游戏后续一(代码1,2,3前文已发)

代码4

上篇博文中实现方块在网格线中移动,但我们发现方块并没有刚好在网格线边缘移动(会在线上),同时方块如果比作蛇头的话,一般老的贪吃蛇游戏只会90度转弯,此前的代码左右或上下相当于180度,加以修改(判断如果方块左或右移动,只允许按键上下移动,同理...),改完后方块会按照网格线移动

90

import pygame
import sys
import randompygame.init()  # 初始化pygame
clock = pygame.time.Clock()
size = width, height = 960, 640  # 窗口大小
screen = pygame.display.set_mode(size)
game_speed = 120
color = 0, 0, 0  # 设置背景颜色
color2 = 33, 33, 33
square_color = 33, 255, 33  # 小方块颜色
square_color2 = 0, 0, 0# square_x, square_y = 0, 0   # 小方块坐标
# speed=0.05 # 方块速度
# square_speed_x,square_speed_y=speed,0
# square_size = 20   # 小方块大小
CELL_SIZE = 20
square_rect = pygame.Rect(0, 0, CELL_SIZE, CELL_SIZE)
UP, DOWN, LEFT, RIGHT = (0, -1), (0, 1), (-1, 0), (1, 0)
square_direction = RIGHT  # 定义一个初始方向
square_turn = RIGHT
while True:for event in pygame.event.get():  # 遍历所有事件if event.type == pygame.QUIT:  # 如果单击关闭窗口,则退出sys.exit()  # 执行退出操作elif event.type == pygame.KEYDOWN:if square_direction in [LEFT, RIGHT]:if event.key == pygame.K_UP:square_turn = UPelif event.key == pygame.K_DOWN:square_turn = DOWNelif square_direction in [UP, DOWN]:if event.key == pygame.K_LEFT:square_turn = LEFTelif event.key == pygame.K_RIGHT:square_turn = RIGHTif square_rect.x % CELL_SIZE == 0 and square_rect.y % CELL_SIZE == 0:square_direction = square_turnsquare_rect = square_rect.move(square_direction)# 防止小方块移出左右边界if square_rect.left < 0:square_rect.left = 0elif square_rect.right > width:square_rect.right = widthif square_rect.top < 0:square_rect.top = 0elif square_rect.bottom > height:square_rect.bottom = height# 终端看坐标print(square_rect.x, square_rect.y, square_direction[0], square_direction[1])screen.fill(color)  # 填充颜色# pygame.draw.rect(screen, square_color,square_rect)for i in range(CELL_SIZE, width, CELL_SIZE):pygame.draw.line(screen, color2, (i, 0), (i, height))for i in range(CELL_SIZE, height, CELL_SIZE):pygame.draw.line(screen, color2, (0, i), (width, i))screen.fill(square_color, square_rect)screen.fill(square_color2, square_rect.inflate(-4, -4))  # 可以放大或缩小图形pygame.display.flip()  # 更新显示clock.tick(game_speed)
pygame.quit()

 代码5

要生成蛇的身体,为了更加精准的控制移动的时间间隔,继续优化代码

终端显示游戏结束

蛇身

咬到蛇身或撞墙也显示游戏结束

import pygame
import sys
import random# 设置常数
CELL_SIZE = 20
UP, DOWN, LEFT, RIGHT = (0, -CELL_SIZE), (0, CELL_SIZE), (-CELL_SIZE, 0), (CELL_SIZE, 0)# 初始化
pygame.init()  # 初始化pygame
pygame.display.set_caption('贪吃蛇')# 窗口对象
clock = pygame.time.Clock()
size = width, height = 960, 640  # 窗口大小
screen = pygame.display.set_mode(size)
game_field = screen.get_rect()  # <rect(0,0,960,640)>蛇能运行的整个范围
game_speed = 60
color = 0, 0, 0  # 设置背景颜色
color2 = 33, 33, 33
playing=True# Snake蛇
square_color = 33, 255, 33  # 小方块颜色
square_color2 = 0, 0, 0
square_color3=255,0,0
square_rect = pygame.Rect(0, 0, CELL_SIZE, CELL_SIZE)
square_direction = RIGHT  # 定义一个初始方向
square_turn = RIGHT
square_speed = 10  # 每秒走几个格子
square_delay = 1000 / square_speed  # 蛇运动的间隔
square_time2move = pygame.time.get_ticks() + square_delay
square_body=[pygame.Rect(0,0,0,0)]*40  # 蛇的身体
while True:for event in pygame.event.get():  # 遍历所有事件if event.type == pygame.QUIT:  # 如果单击关闭窗口,则退出sys.exit()  # 执行退出操作elif event.type == pygame.KEYDOWN:if square_direction in [LEFT, RIGHT]:if event.key == pygame.K_UP:square_turn = UPelif event.key == pygame.K_DOWN:square_turn = DOWNelif square_direction in [UP, DOWN]:if event.key == pygame.K_LEFT:square_turn = LEFTelif event.key == pygame.K_RIGHT:square_turn = RIGHT# 更新数据#1.移动蛇if pygame.time.get_ticks() >= square_time2move:square_time2move = pygame.time.get_ticks() + square_delaysquare_body=[square_rect]+square_body   #增加一节身体square_body.pop()    #截取尾部square_direction = square_turnsquare_rect = square_rect.move(square_direction)#2.判断游戏是否结束if playing:#撞墙if not game_field.contains(square_rect):playing=False#撞身体for cell in square_body:if square_rect==cell:playing = Falseif not playing:print('游戏结束!!!')# 更新画面if playing:# 终端看坐标output = "坐标:%r 速度:%r 范围:%r FPS:%0.2f 时间:%r"print(output % (square_rect, square_direction, game_field.contains(square_rect), clock.get_fps(), pygame.time.get_ticks()))# 填充颜色screen.fill(color)# 画格子for i in range(CELL_SIZE, width, CELL_SIZE):pygame.draw.line(screen, color2, (i, 0), (i, height))for i in range(CELL_SIZE, height, CELL_SIZE):pygame.draw.line(screen, color2, (0, i), (width, i))# 画蛇# 1.画头screen.fill(square_color, square_rect)screen.fill(square_color3, square_rect.inflate(-4, -4))  # 可以放大或缩小图形# 2.画身体for cell in square_body:screen.fill(square_color,cell)screen.fill(square_color2, cell.inflate(-4,-4))# 更新窗口内容pygame.display.flip()  # 更新显示clock.tick(game_speed)# 退出
pygame.quit()

 

至此我们已经实现蛇身移动

我们可以想象到后续代码量很多,这种编程方式面向过程,不便于理解和代码的重复利用率,灵活性

所以我们将重新打乱面向对象去编程,这里不要感到繁琐,

面向对象去写后更加便于我们理解和后续学习

面向过程

 

 面向对象

 

 

 

 后续会发布面向对象的代码,制作不易,点个关注

本人也是根据哔哩哔哩视频学习


http://www.mrgr.cn/news/64159.html

相关文章:

  • 实习冲刺Day11
  • 【STM32】SD卡
  • ASO如何低预算进行优化
  • 深入解密 K 均值聚类:从理论基础到 Python 实践
  • 【AIGC】2024-arXiv-Lumiere:视频生成的时空扩散模型
  • 基于SpringBoot的宠物健康咨询系统的设计与实现
  • CesiumJS 案例 P18:检测文本、删除所有文本、隐藏与显示文本、改变文本
  • 二维码中怎么存入文件?文件二维码活码的3步制作技巧
  • CAD图纸防泄密|哪些措施可以加密公司图纸?五个宝藏方法分享,2024必读!
  • 无人机维护保养、部件修理更换技术详解
  • Python 列表的定义语法
  • 【毫米波雷达(四)】车载毫米波雷达下线EOL标定流程
  • 【VUE+DRF】案例升级
  • 国产服务器部署1.获取银河麒麟V10服务器。首先挂gpt数据盘
  • Apache-Seata 拯救分布式系统数据一致性的开源神器
  • vcruntime140.dll如何修复,六种解决vcruntime140.dll的方法分享
  • Python-创建并调用自定义文件中的模块/函数
  • 如何绘制带有误差线的堆叠柱状图
  • 【C语言】文件操作
  • 2021 icpc南京(A,M,C,H,J,D)
  • Java和C++有什么区别?JVM不是跨平台的?JVM是用什么语言编写的?
  • 前端性能优化 | 响应式布局、响应式图片最全解析
  • 智能呼叫中心详细介绍
  • 消息队列mq有哪些缺点?
  • 【Python】进程、线程、协程篇 (无偿分享一份全套的 Python 学习资料)
  • 真题与解析 202212三级 青少年软件编程(Python)考级