【编程6】贪吃蛇游戏(python+pygame)
效果图~新鲜出炉
- 开始界面
- 游戏中
- 结束界面
一、pygame模块概览
模块名称 | 功能 |
---|---|
pygame.cdrom | 访问光驱 |
pygame.cursors | 加载光标 |
pygame.display | 访问显示设备 |
pygame.draw | 绘制形状、线和点 |
pygame.event | 管理事件 |
pygame.font | 使用字体 |
pygame.image | 加载和存储图片 |
pygame.joystick | 使用游戏手柄或类似的东西 |
pygame.key | 读取键盘按键 |
pygame.mixer | 声音 |
pygame.mouse | 鼠标 |
pygame.movie | 播放视频 |
pygame.music | 播放音频 |
pygame.overlay | 访问高级视频叠加 |
pygame | 目前学习的 |
pygame.rect | 管理矩形区域 |
pygame.sndarray | 操作声音数据 |
pygame.sprite | 操作移动图像 |
pygame.surface | 管理图像和屏幕 |
pygame.surfarray | 管理点阵图像数据 |
pygame.time | 管理时间和帧信息 |
pygame.transform | 缩放和移动图像 |
二、核心代码
思路
- 首页面:会涉及图片和文字提示的显示,进入(任意键)或退出(ESC)游戏;
- 游戏页面:主要涉及食物的创建绘制,蛇的移动和显示,蛇是否吃到食物或者是否撞到边界或自身,再者就是音效的实现(背景音乐+gameover音效);
- 结束页面:会涉及图片和文字提示的显示,重来(任意键)或退出(ESC)游戏。
核心代码
- 主函数
def main():pygame.init()# 创建Pygame时钟对象,控制每个循环多长时间运行一次。# 例如:snake_speed_clock(60)代表每秒内循环要运行的 60 次# 每秒60个循环(或帧)时,每个循环需要1000/60=16.66ms(大约17ms)如果循环中的代码运行时间超过17ms,# 在clock指出下一次循环时当前循环将无法完成。snake_speed_clock = pygame.time.Clock()screen = pygame.display.set_mode((windows_width, windows_height))screen.fill(white)pygame.display.set_caption("贪吃蛇~")show_start_info(screen)while True:music()running_game(screen, snake_speed_clock)show_end_info(screen)
- 游戏运行代码
def running_game(screen,snake_speed_clock):start_x = random.randint(3, map_width - 8) #开始位置start_y = random.randint(3, map_height - 8)snake_coords = [{'x': start_x, 'y': start_y}, #初始贪吃蛇{'x': start_x - 1, 'y': start_y},{'x': start_x - 2, 'y': start_y}]direction = RIGHT # 开始时向右移动food = get_random_location() #实物随机位置while True:for event in pygame.event.get():if event.type == QUIT:terminate()elif event.type == KEYDOWN:if (event.key == K_LEFT or event.key == K_a) and direction != RIGHT:direction = LEFTelif (event.key == K_RIGHT or event.key == K_d) and direction != LEFT:direction = RIGHTelif (event.key == K_UP or event.key == K_w) and direction != DOWN:direction = UPelif (event.key == K_DOWN or event.key == K_s) and direction != UP:direction = DOWNelif event.key == K_ESCAPE:terminate()move_snake(direction, snake_coords) #移动蛇ret = snake_is_alive(snake_coords)if not ret:gameover_music()break #蛇死了. 游戏结束snake_is_eat_food(snake_coords, food) #判断蛇是否吃到食物screen.fill(BG_COLOR)draw_snake(screen, snake_coords)draw_food(screen, food)show_score(screen, len(snake_coords) - 3)pygame.display.update()snake_speed_clock.tick(snake_speed) #控制fps
- 食物绘制
def draw_food(screen, food):x = food['x'] * cell_sizey = food['y'] * cell_sizeappleRect = pygame.Rect(x, y, cell_size, cell_size)pygame.draw.rect(screen, red, appleRect)
- 贪吃蛇绘制
def draw_snake(screen, snake_coords):for coord in snake_coords:x = coord['x'] * cell_sizey = coord['y'] * cell_sizewormSegmentRect = pygame.Rect(x,y,cell_size,cell_size)pygame.draw.rect(screen, dark_blue, wormSegmentRect)wormInnerSegmentRect = pygame.Rect(x+4,y+4,cell_size - 8, cell_size - 8)pygame.draw.rect(screen, blue, wormInnerSegmentRect)
- 移动贪吃蛇
def move_snake(direction, snake_coords):if direction == UP:newHead = {'x':snake_coords[HEAD]['x'], 'y':snake_coords[HEAD]['y'] - 1}elif direction == DOWN:newHead = {'x':snake_coords[HEAD]['x'], 'y':snake_coords[HEAD]['y'] + 1}elif direction == LEFT:newHead = {'x':snake_coords[HEAD]['x'] - 1, 'y':snake_coords[HEAD]['y']}elif direction == RIGHT:newHead = {'x':snake_coords[HEAD]['x'] + 1, 'y':snake_coords[HEAD]['y']}snake_coords.insert(0, newHead)
- 判断蛇死没有死
def snake_is_alive(snake_coords):tag = True# 头坐标超出地图范围if(snake_coords[HEAD]['x'] == -1 \or snake_coords[HEAD]['x'] == map_width \or snake_coords[HEAD]['y'] == -1 \or snake_coords[HEAD]['y'] == map_height):tag = False# 头坐标等于身体某节坐标for snake_body in snake_coords[1:]:if snake_body['x'] == snake_coords[HEAD]['x'] and snake_body['y'] == snake_coords[HEAD]['y']:tag = Falsereturn tag
- 判断蛇是否吃到食物
def snake_is_eat_food(snake_coords, food):if(snake_coords[HEAD]['x'] == food['x'] and snake_coords[HEAD]['y'] == food['y']):## 重新生成食物food['x'] = random.randint(0, map_width - 1)food['y'] = random.randint(0, map_height - 1)else:# 如果没有吃到实物, 就向前移动, 那么尾部一格删掉del snake_coords[-1]
- 随机生成食物
def get_random_location():return {'x':random.randint(0, map_width - 1),'y':random.randint(0, map_height - 1)}
- 开始信息显示
def show_start_info(screen):# 创建Font字体对象,使用render方法写字font = pygame.font.Font("simsun.ttc", 40)tip = font.render('按任意键开始游戏', True,(65,105,255))# 加载图片gamestart = pygame.image.load('startlogo.jpg').convert()# 通过blit方法输出在屏幕上screen.blit(gamestart,(140, 30))screen.blit(tip,(240, 550))## 刷新屏幕pygame.display.update()while True: # 监听键盘for event in pygame.event.get():if event.type == QUIT:terminate()elif event.type == KEYDOWN: # 任意键按下returnif (event.key == K_ESCAPE): # 若为ESC,则终止程序terminate()else:return
- 声音设置
def music():pygame.mixer.init()pygame.mixer.music.load('111.mp3')pygame.mixer.music.play(1, 0)def gameover_music():pygame.mixer.init()pygame.mixer.music.load('gameover.mp3')pygame.mixer.music.play(1,0)
- 结束信息显示
def show_end_info(screen):font = pygame.font.Font("simsun.ttc", 40)tip = font.render("按ESC退出游戏,按任意键重新开始游戏",True,(65,105,255))# gamestart = pygame.image.load('gameover.png')# screen.blit(gamestart,(60, 0))screen.blit(tip,(80, 300))pygame.display.update()while True:for event in pygame.event.get():if event.type == QUIT:terminate()elif event.type == KEYDOWN:if event.key == K_ESCAPE:terminate()else:return
- 成绩信息显示
def show_score(screen, score):font = pygame.font.Font("simsun.ttc", 30)scoreSurf = font.render("得分:%s" % score, True, green)scoreRect = scoreSurf.get_rect()scoreRect.topleft = (windows_width - 120, 10)screen.blit(scoreSurf,scoreRect)
- 程序终止
def terminate():pygame.quit()sys.exit()
【编程6】贪吃蛇游戏(python+pygame)相关推荐
- 【课件】使用Python写贪吃蛇游戏(pygame)
使用Python写贪吃蛇游戏(pygame) 课件地址:https://blog.csdn.net/a772304419/article/details/130087202 本地路径: cd /D/W ...
- java gui怎么做游戏_Java GUI编程之贪吃蛇游戏简单实现方法【附demo源码下载】
本文实例讲述了Java GUI编程之贪吃蛇游戏简单实现方法.分享给大家供大家参考,具体如下: 例子简单,界面简陋 请见谅 项目结构如下 Constant.jvava 代码如下: package sna ...
- 使用C语言gtk编程一个贪吃蛇游戏设计与实现
使用C语言以及gtk编程设计一个贪吃蛇游戏. 功能需求: (1)窗口界面设计:创建各种窗口和按钮标签等: (2)小蛇移动控制:按键盘上的上下左右键控制小蛇上下左右移动: (3)游戏进程控制:若小蛇碰到 ...
- 计算机课程编程设计贪吃蛇游戏设计,c语言课程设计报告--贪吃蛇游戏系统
c语言课程设计报告--贪吃蛇游戏系统 院 系 计算机科学技术学院 班 级 组 长 学 号 指导教师 2017 年 3 月 2 日 C 语言语言基础课程设计基础课程设计 贪贪贪贪吃吃吃吃蛇蛇蛇蛇游游游游 ...
- python贪吃蛇最简单代码_利用python实现简易版的贪吃蛇游戏(面向python小白)
引言 作为python 小白,总是觉得自己要做好百分之二百的准备,才能开始写程序.以至于常常整天在那看各种语法教程,学了几个月还是只会print('hello world'). 这样做效率太低,正确的 ...
- jquery实现上下左右键盘监听_python 使用pygame工具包实现贪吃蛇游戏(多彩版)
今天我们用python和python的工具包pygame来编写一个贪吃蛇的小游戏 贪吃蛇游戏功能介绍 贪吃蛇的游戏规则如下: 通过上下左右键或者WASD键来移动蛇来,让它吃到食物,每吃到食物,蛇的长度 ...
- java gui怎么做游戏_Java中关于GUI实现贪吃蛇游戏的简单方法
这篇文章主要介绍了Java GUI编程之贪吃蛇游戏简单实现方法,详细分析了贪吃蛇游戏的具体实现步骤与相关注意事项,并附带demo源码供读者下载参考,需要的朋友可以参考下 本文实例讲述了Java GUI ...
- C++入门——实现贪吃蛇游戏
参考 <C和C++游戏趣味编程> 贪吃蛇游戏 键盘控制小蛇上.下.左.右移动,迟到食物后长度加1:蛇头碰到自身或窗口边缘,游戏失败 程序框架 #include <graphics.h ...
- 学生学python编程---实现贪吃蛇小游戏+源码
学生学python编程---实现贪吃蛇小游戏+源码 前言 主要设计 1.蛇的表示 2.蛇怎么移动? 3.玩家控制小蛇移动功能的实现 4.如何判定游戏结束? 应用知识点 1.python知识点 1.1 ...
- 初入Python(一) Pygame贪吃蛇游戏的编写与改进
贪吃蛇游戏是一款简单耐玩的休闲益智类游戏,利用pygame可以实现轻松编写,不需要辅佐图片等等元素,可以直接利用涂色方块表示,吃果子变长的原理也很容易实现,将body分为一块一块,每块有自己的位置属性 ...
最新文章
- 10个必会的 PyCharm 技巧
- Nacos-Nacos和Eureka的对比
- 计算机网络(二十五)-IP数据报格式
- Flutter抖动动画、颤抖动画、Flutter文字抖动效果
- mysql weblogic_weblogic连mysql的问题
- C#学习之ObjectOriented、Record
- SET FOREIGN_KEY_CHECKS = 0
- 视频教程-【曾贤志】Excel函数视频教程-Office/WPS
- MMD-MikuMikuDance简易教程(包含软件、资源下载、MME特效中文说明、等等)
- java音乐播放器脚本之家,HTML5音乐播放器skPlayer
- c programe language learn notes 3
- 互联网大厂校招大战:华为研究生年薪最高到45万,腾讯offer数增四成
- 加拿大签证材料(一家三口)
- “目标-用户-指标”——企业开源运营之道|瞰道@谭中意
- 人机交互(HCI)界面设计(笔记)
- 网易云音乐基于用户的推荐系统
- 2018---2019 数学四班张子琪 C语言设计总结
- 海信电视power android,海信电视工厂模式中“To Fac”设置“U”、“M”参数不完全对比...
- 高位在前低位在后是啥意思_详解MACD指标的死叉卖点:低位死叉+高位死叉+零轴附近死叉...
- Axue8.0基础使用篇
热门文章
- html获取鼠标按键数,鼠标在IE、Firefox和Opera点击键所对应的数字代码
- pc工具不支持stb的加密方式_如何选择加密狗?九大标准
- sscanf fscanf函数格式化输入遇到\n问题
- python上传文件到windows_python自动化-WinSpy+pywin32文件上传操作
- 发生了变化 触发器函数不能读它_2013年1月18日调试触发器“表发生了变化,触发器或函数不能读它”的出现原因,以及解决方案...
- java poi导入50万数据_java从oracle读取50万条数据写入Excel中抛GC overhead limit exc
- 注意力机制在softmax时需要除以一个根号8的作用
- 中文与Unicode码互转(utf-8)
- 梯度下降中的学习率的作用
- SGDRegressor