100行代码,使用 Pygame 制作一个贪吃蛇小游戏!
作者 | 周萝卜
来源 | 萝卜大杂烩
相信我们大家都玩过贪吃蛇游戏,今天我们就从头一起来写一个贪吃蛇小游戏,只需要100多行的代码就完成了。
用到的 Pygame 函数
贪吃蛇小游戏用到的函数
功能 | 描述 |
---|---|
init() | 初始化 pygame |
display.set_mode() | 以元组或列表为参数创建窗口 |
update() | 更新屏幕 |
quit() | 用于取消初始化的 pygame |
set_caption() | 在屏幕的顶部设置文字 |
event.get() | 返回所有事件的列表 |
Surface.fill() | 使用纯色填充屏幕 |
time.Clock() | 追踪时间 |
font.Font() | 设置字体 |
创建屏幕
我们使用函数 display.set_mode() 来创建 pygame 窗口,同时我们还要在程序的开始和结尾处进行 init() 和 quit() 函数,以保证程序可以正确开始和结束。
import pygame
pygame.init()
dis=pygame.display.set_mode((400,300))
pygame.display.update()
pygame.quit()
quit()
这要我们运行程序,就可以得到如下:
但是这要的代码,我们的程序创建只会一闪而过,下面我们增加一些代码,来保持住程序窗口
import pygame
pygame.init()
dis=pygame.display.set_mode((400,300))
pygame.display.update()
pygame.display.set_caption('Snake game by Edureka')
game_over=False
while not game_over:for event in pygame.event.get():print(event) # 打印出所有事件pygame.quit()
quit()
我们增加了游戏窗口的名称,同时还可以在 Python 控制台中看到我们在 pygame 窗口上操作时的所有事件
下面我们来增加关闭响应事件
pygame.init()
dis = pygame.display.set_mode((400, 300))
pygame.display.update()
pygame.display.set_caption('贪吃蛇')
game_over = False
while not game_over:for event in pygame.event.get():if event.type==pygame.QUIT:game_over=Truepygame.quit()
quit()
至此我们的游戏窗口就设置好了,下面就可以来画 snake 了
创建 snake
我们首先创建一些颜色变量,用来表示 snake,food,screen 等
pygame.init()
dis = pygame.display.set_mode((400, 300))
pygame.display.update()
pygame.display.set_caption('贪吃蛇')blue=(0,0,255)
red=(255,0,0)game_over = False
while not game_over:for event in pygame.event.get():if event.type==pygame.QUIT:game_over=Truepygame.draw.rect(dis, blue, [200, 150, 10, 10])pygame.display.update()pygame.quit()
quit()
这样,一只(条)贪吃蛇就创建完成了,就是那个小蓝点儿
使 snake 动起来
为了实现 snake 的移动,我们需要用到的关键事件是 KEYDOWN,它包含四个 key 值,K_UP, K_DOWN, K_LEFT, 和 K_RIGHT,分别表示向上、向下、向左和向右
pygame.init()
pygame.display.set_caption('贪吃蛇')
white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)dis = pygame.display.set_mode((800, 600))game_over = Falsex1 = 300
y1 = 300x1_change = 0
y1_change = 0clock = pygame.time.Clock()while not game_over:for event in pygame.event.get():if event.type == pygame.QUIT:game_over = Trueif event.type == pygame.KEYDOWN:if event.key == pygame.K_LEFT:x1_change = -10y1_change = 0elif event.key == pygame.K_RIGHT:x1_change = 10y1_change = 0elif event.key == pygame.K_UP:y1_change = -10x1_change = 0elif event.key == pygame.K_DOWN:y1_change = 10x1_change = 0x1 += x1_changey1 += y1_changedis.fill(white)pygame.draw.rect(dis, black, [x1, y1, 10, 10])pygame.display.update()clock.tick(30)pygame.quit()
quit()
我这里创建了 x1_change 和 y1_change 变量来更新 x 和 y 坐标,使得我们的 snake 可以移动起来
处理 Game Over
对于贪吃蛇游戏来说,如果 snake 移动出了游戏屏幕,那么游戏就已经失败了,下面我们就来处理这部分逻辑
import pygame
import timepygame.init()
pygame.display.set_caption('贪吃蛇')
white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)dis_width = 600
dis_height = 400
dis = pygame.display.set_mode((dis_width, dis_width))game_over = Falsex1 = dis_width / 2
y1 = dis_height / 2snake_block = 10x1_change = 0
y1_change = 0clock = pygame.time.Clock()
snake_speed = 30font_style = pygame.font.Font("C:/Windows/Fonts/STFANGSO.TTF", 20)def message(msg, color):mesg = font_style.render(msg, True, color)dis.blit(mesg, [dis_width / 2, dis_height / 2])while not game_over:for event in pygame.event.get():if event.type == pygame.QUIT:game_over = Trueif event.type == pygame.KEYDOWN:if event.key == pygame.K_LEFT:x1_change = -snake_blocky1_change = 0elif event.key == pygame.K_RIGHT:x1_change = snake_blocky1_change = 0elif event.key == pygame.K_UP:y1_change = -snake_blockx1_change = 0elif event.key == pygame.K_DOWN:y1_change = snake_blockx1_change = 0if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:game_over = Truex1 += x1_changey1 += y1_changedis.fill(white)pygame.draw.rect(dis, black, [x1, y1, snake_block, snake_block])pygame.display.update()clock.tick(snake_speed)message("你失败了,请重新开始游戏!", red)
pygame.display.update()
time.sleep(2)pygame.quit()
quit()
增加食物
既然是贪吃蛇,当然要投食了,下面我们就来处理食物
import pygame
import time
import randompygame.init()
pygame.display.set_caption('贪吃蛇')white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)
blue = (0, 0, 255)dis_width = 800
dis_height = 600dis = pygame.display.set_mode((dis_width, dis_height))clock = pygame.time.Clock()snake_block = 10
snake_speed = 30font_style = pygame.font.Font("C:/Windows/Fonts/STFANGSO.TTF", 20)def message(msg, color):mesg = font_style.render(msg, True, color)dis.blit(mesg, [dis_width / 3, dis_height / 3])def gameLoop(): # creating a functiongame_over = Falsegame_close = Falsex1 = dis_width / 2y1 = dis_height / 2x1_change = 0y1_change = 0foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0foody = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0while not game_over:while game_close == True:dis.fill(white)message("你失败了,请重新开始游戏!", red)pygame.display.update()for event in pygame.event.get():if event.type == pygame.KEYDOWN:if event.key == pygame.K_q:game_over = Truegame_close = Falseif event.key == pygame.K_c:gameLoop()for event in pygame.event.get():if event.type == pygame.QUIT:game_over = Trueif event.type == pygame.KEYDOWN:if event.key == pygame.K_LEFT:x1_change = -snake_blocky1_change = 0elif event.key == pygame.K_RIGHT:x1_change = snake_blocky1_change = 0elif event.key == pygame.K_UP:y1_change = -snake_blockx1_change = 0elif event.key == pygame.K_DOWN:y1_change = snake_blockx1_change = 0if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:game_close = Truex1 += x1_changey1 += y1_changedis.fill(white)pygame.draw.rect(dis, blue, [foodx, foody, snake_block, snake_block])pygame.draw.rect(dis, black, [x1, y1, snake_block, snake_block])pygame.display.update()if x1 == foodx and y1 == foody:print("Good!")clock.tick(snake_speed)pygame.quit()quit()gameLoop()
我这里创建了一个函数 gameLoop 作为我们的主函数,同时还初始化了 snake 的食物,还同时增加了键盘 c 和 q 关键字,来重新开始游戏和退出游戏
snake 的成长
下面我们就开始在 snake 吃掉食物之后,增加 snake 的长度,这也是游戏的基本规则
import pygame
import time
import randompygame.init()
pygame.display.set_caption('贪吃蛇')
font_style = pygame.font.Font("C:/Windows/Fonts/STFANGSO.TTF", 20)
score_font = pygame.font.Font("C:/Windows/Fonts/STCAIYUN.TTF", 30)white = (255, 255, 255)
yellow = (255, 255, 102)
black = (0, 0, 0)
red = (213, 50, 80)
green = (0, 255, 0)
blue = (50, 153, 213)dis_width = 600
dis_height = 400dis = pygame.display.set_mode((dis_width, dis_height))clock = pygame.time.Clock()snake_block = 10
snake_speed = 15def our_snake(snake_block, snake_list):for x in snake_list:pygame.draw.rect(dis, black, [x[0], x[1], snake_block, snake_block])def message(msg, color):mesg = font_style.render(msg, True, color)dis.blit(mesg, [dis_width / 6, dis_height / 3])def gameLoop():game_over = Falsegame_close = Falsex1 = dis_width / 2y1 = dis_height / 2x1_change = 0y1_change = 0snake_List = []Length_of_snake = 1foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0while not game_over:while game_close == True:dis.fill(blue)message("你失败了,请重新开始游戏!", red)pygame.display.update()for event in pygame.event.get():if event.type == pygame.KEYDOWN:if event.key == pygame.K_q:game_over = Truegame_close = Falseif event.key == pygame.K_c:gameLoop()for event in pygame.event.get():if event.type == pygame.QUIT:game_over = Trueif event.type == pygame.KEYDOWN:if event.key == pygame.K_LEFT:x1_change = -snake_blocky1_change = 0elif event.key == pygame.K_RIGHT:x1_change = snake_blocky1_change = 0elif event.key == pygame.K_UP:y1_change = -snake_blockx1_change = 0elif event.key == pygame.K_DOWN:y1_change = snake_blockx1_change = 0if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:game_close = Truex1 += x1_changey1 += y1_changedis.fill(blue)pygame.draw.rect(dis, green, [foodx, foody, snake_block, snake_block])snake_Head = []snake_Head.append(x1)snake_Head.append(y1)snake_List.append(snake_Head)if len(snake_List) > Length_of_snake:del snake_List[0]for x in snake_List[:-1]:if x == snake_Head:game_close = Trueour_snake(snake_block, snake_List)pygame.display.update()if x1 == foodx and y1 == foody:foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0Length_of_snake += 1clock.tick(snake_speed)pygame.quit()quit()gameLoop()
展示得分
最后我们来显示得分,毕竟对于游戏来说,玩家的得分还是很重要的
import pygame
import time
import randompygame.init()
pygame.display.set_caption('贪吃蛇')
font_style = pygame.font.Font("C:/Windows/Fonts/STFANGSO.TTF", 20)
score_font = pygame.font.Font("C:/Windows/Fonts/STCAIYUN.TTF", 30)white = (255, 255, 255)
yellow = (255, 255, 102)
black = (0, 0, 0)
red = (213, 50, 80)
green = (0, 255, 0)
blue = (50, 153, 213)dis_width = 600
dis_height = 400dis = pygame.display.set_mode((dis_width, dis_height))clock = pygame.time.Clock()snake_block = 10
snake_speed = 15def Your_score(score):value = score_font.render("Your Score: " + str(score), True, yellow)dis.blit(value, [0, 0])def our_snake(snake_block, snake_list):for x in snake_list:pygame.draw.rect(dis, black, [x[0], x[1], snake_block, snake_block])def message(msg, color):mesg = font_style.render(msg, True, color)dis.blit(mesg, [dis_width / 6, dis_height / 3])def gameLoop():game_over = Falsegame_close = Falsex1 = dis_width / 2y1 = dis_height / 2x1_change = 0y1_change = 0snake_List = []Length_of_snake = 1foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0while not game_over:while game_close == True:dis.fill(blue)message("你失败了,请重新开始游戏!", red)Your_score(Length_of_snake - 1)pygame.display.update()for event in pygame.event.get():if event.type == pygame.KEYDOWN:if event.key == pygame.K_q:game_over = Truegame_close = Falseif event.key == pygame.K_c:gameLoop()for event in pygame.event.get():if event.type == pygame.QUIT:game_over = Trueif event.type == pygame.KEYDOWN:if event.key == pygame.K_LEFT:x1_change = -snake_blocky1_change = 0elif event.key == pygame.K_RIGHT:x1_change = snake_blocky1_change = 0elif event.key == pygame.K_UP:y1_change = -snake_blockx1_change = 0elif event.key == pygame.K_DOWN:y1_change = snake_blockx1_change = 0if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:game_close = Truex1 += x1_changey1 += y1_changedis.fill(blue)pygame.draw.rect(dis, green, [foodx, foody, snake_block, snake_block])snake_Head = []snake_Head.append(x1)snake_Head.append(y1)snake_List.append(snake_Head)if len(snake_List) > Length_of_snake:del snake_List[0]for x in snake_List[:-1]:if x == snake_Head:game_close = Trueour_snake(snake_block, snake_List)Your_score(Length_of_snake - 1)pygame.display.update()if x1 == foodx and y1 == foody:foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0Length_of_snake += 1clock.tick(snake_speed)pygame.quit()quit()gameLoop()
这里创建了一个 Your_score 函数来记录玩家得分
这样,我们就完成了一个简易的贪吃蛇小游戏了
最后的最后,我们再给游戏添加音乐背景,让游戏的时光更加惬意吧
# 播放音乐
pygame.init()
pygame.mixer.music.load(r"Game.mp3")
pygame.mixer.music.play()
往
期
回
顾
资讯
AI天气预测准确度高于气象台
资讯
AI 生成的代码可信吗?
资讯
机器人越像人越好?
资讯
机器人能帮助缝制T恤吗?
分享
点收藏
点点赞
点在看
相关文章:

Ubuntu + VirtualBox + windows xp互相访问
2019独角兽企业重金招聘Python工程师标准>>> 1 在ubuntu中安装最新版virtualbox,并且同时安装增强插件 2 设置xp网络位桥接网络 3 启动虚拟机中xp系统 4 关闭虚拟机中xp防火墙 virtualbox原来如此的爽,太方便了 第二天到公司使用网络的时候,基…

cocoapods使用教程
#####一、什么是CocoaPods CocoaPods是一个用来帮助我们管理第三方依赖库的工具。 #####二、安装cocoaPods 1.移除现有Ruby默认源 $gem sources --remove https://rubygems.org/ 复制代码2.使用新的源 $gem sources -a https://ruby.taobao.org/ 复制代码3.验证新源是否替…

Memcached安装以及PHP的调用
一:安装libevent 由于memcached安装时,需要使用libevent类库,所以先安装libevent 1.下载 #wget http://www.monkey.org/~provos/libevent-2.0.12-stable.tar.gz 2.解压缩 #tar xzfv libevent-2.0.12-stable.tar.gz 3.进入目录 #cd l…

matplotlib 可视化必知必会富文本绘制方法
作者 | 费弗里来源 | Python大数据分析本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes1 简介长久以来,在使用matplotlib进行绘图时,一直都没有比较方便的办法像R中的ggtext那样,向图像中插入整…

Android如何使用读写cookie的方法
http://www.cnblogs.com/cosiray/archive/2012/06/25/2562117.html 可以使用SharedPreferences或者SQLite来保存用户信息 private static HashMap<String,String> CookieContinernew HashMap<String,String>() ;/*** 保存Cookie* param resp*/public void SaveCoo…

js 创建一条通用链表
js 创建一条通用链表什么是「链表科普」?链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。什么是「顺序存储结构科普」?在计算机中用一组地址连续的存储单元依次存储线性表的各个数据…

预训练时代微调新范式,高性能加速2800%,NLPer赶紧看过来!
导读PaddleNLP 是兼具科研学习和产业实践能力的 Python NLP 工具包,提供中文领域丰富的预训练模型和部署工具,被高校、企业开发者广泛应用。近日,PaddleNLP v2.1正式发布,为开发者带来三项重要更新:开箱即用的工业级NL…

图片服务器的url hash架构
什么是urlhash架构 url hash架构对url进行一次hash算法,然后通过hash结果找到对应的服务器。因为针对单一个url的hash结果是一样的,所以理论上这个url会被永久分配到固定的一台服务器上。另外因为经过了hash算法,所以分配url就很均匀…

Android系统--TouchEvent的处理流程
TouchEvent的处理流程就是TouchEvent在View树中的传递的过程:这个过程分为2步:第一步,ACTION_DOWN在View树中寻找处理TouchEvent的View;第二步,剩余的ACTION_XXX在View树传递给目标View; 第一步,ACTION_DOWN在View树中…

搜索引擎中的URL散列
散列(hash)也就是哈希,是信息存储和查询所用的一项基本技术。在搜索引擎中网络爬虫在抓取网页时为了对网页进行有效地排重必须对URL进行散列,这样才能快速地排除已经抓取过的网页。最理想的状态是对联网上所有的网页都分配一个哈希…

c++各种数据类型表示范围
符号属性 长度属性 基本型 所占位数 取值范围 输入符举例 输出符举例 -- -- char 8 -2^7 ~ 2^7-1 %c %c、%d、%usigned -- char 8 -2^7 ~ 2^7-1 %c …

原来Python用得好,工作这么好找
Python是多数平台上写脚本和快速开发应用的编程语言,适用场景非常广,Web开发、大数据分析、机器学习、自动化运维/测试,甚至日常工作中的各种各样的问题都能用Python来解决。Python不仅可以批量处理上百个Excel、Word、PDF文件,工…

Litmus代码质量平台实践总结
背景代码质量在项目开发中是一个很重要的地方,更好的质量的代码,能够产生更少的bug,也能使开发人员更不容易犯错,产品的质量得到提升。那么怎么定义代码质量,怎么测量以及如何展现就成为我们内部平台Litmus的主要探索领…

到底什么是hash?它起什么作用?
从emule诞生到现在也已经有了两年左右时间了,随着emule的普及,喜欢他的人也越来越多,但是由于emule对技术相应有一个门槛,不像bt那么容易上手,所以很多朋友很长时间以来一直都有这样或那样的疑问,今天是周末…

20个精美图表,教你玩转 Pyecharts 可视化
作者 |俊欣来源 |关于数据分析与可视化本篇文章我们将继续聚焦c模块并且用它来绘制精美的图表,希望读者在看完之后会有不少收获01内嵌饼状图内接一个环状的饼图,里面还有一个饼状的图(Pie().add(series_name"访问来源",data_pair[list(z) for …

【SICP练习】136 练习3.67
练习3-67 原文 Exercise 3.67. Modify the pairs procedure so that (pairs integers integers) will produce the stream of all pairs of integers (i,j) (without the condition i < j). Hint: You will need to mix in an additional stream. 代码 (define (all-pairs s…

glibc方式安装mysql
下载安装包 mysql-5.6.38-linux-glibc2.12-x86_64.tar.gz创建mysql用户useradd -r mysql -s /sbin/nologin解压文件tar -zxvf mysql-5.6.38-linux-glibc2.12-x86_64.tar.gz -C /opt/改名mv /opt/mysql-5.6.38-linux-glibc2.12-x86_64/ /opt/mysql-5.6创建数据目录mkdir /data更…

淘宝网7年变化图--建议非美工UED人员也看看
从2003年开始,这么几年间淘宝网首页截图,UED美工和开发人员都可以看看。图片来自www.infoq.com网站 的PPT

Github 一夜爆火:这份金九银十 Java 面试手册我给跪了
这几天给筒子们整理了一份《Java面试手册》,106页,目前大约6万字左右,初衷也很简单,就是希望在面试的时候能够帮助到大家,减轻大家的负担和节省时间。废话不多说,本手册目前为第一版,后续慢慢也…

a different object with the same identifier value was already associated with the session
当出现a different object with the same identifier value was already associated with the session时,一般是因为在hibernate中同一个session里面有了两个相同标识但是是不同实体。 我直接将接受需要比较的id的list<ab>换成了list<object[]>,再直接将…
【转】unity3d 在UGUI中制作自适应调整大小的滚动布局控件
转自 http://blog.csdn.net/rcfalcon/article/details/43459387 在游戏中,我们很多地方需要用到scroll content的概念:我们需要一个容器,能够指定布局方式(比如横排排列、竖排排列、网格排列)等。然后我们向其中填充内…

(转)径向模糊效果shader
转自:http://blog.csdn.net/xoyojank/article/details/5146297 最先在这里看到:http://www.gamerendering.com/2008/12/20/radial-blur-filter/ 这效果在鬼泣4中切换场景时见过, 极品飞车12的运动模糊也有这种感觉. 原理: 确定一个中心点(如0.5, 0.5), 跟当前像素连…

初次体验hiphop-php
facebook在github上发布了hiphop-php的源代码。之前听说这玩意能把php代码翻译成c代码,然后带来巨大的性能提升,所以第一时间编译了一份hiphop-php。 我的机器环境是 Centos 5.3 x86_648G内存Intel(R) Xeon(R) CPU E5420 2.50GHz 安装注意事项 编译…

MySQL之父等国际数据库掌门人齐聚,1024 程序员节全体大会重磅官宣!
10月23-24日,由CSDN、长沙市政府及多家机构联合主办的第二届“长沙中国1024程序员节”(1024.csdn.net)将盛大举行。今年程序员节活动囊括:岳麓书院尖峰对话,2021技术英雄会,9场热门技术主题论坛/专场、第16…

通过yum安装配置lamp
1、安装httpdyum install httpd创建测试文件cd /var/www/htmlvim index.php加入以下内容<html><head><title>PHP Page</title></head><body><h1>PHP start</h1> <?phpphpinfo(); ?><h1>PHP end</h1> <…

PHP“Cannot use object of type stdClass as array”
php再调用json_decode从字符串对象生成json对象时,如果使用[]操作符取数据,会得到下面的错误错误:Cannot use object of type stdClass as array产生原因:展开 -PHP$res json_decode($res);$res[key]; //把 json_decode() 后的对…

RMAN_学习笔记1_RMAN Structure概述和体系结构
2014-12-23 Created By BaoXinjian 一、摘要 是一种用于集备份(backup)、还原(restore)和恢复(recover)数据库于一体的Oracle 工具,支持命令行及图形界面操作 能够备份整个数据库、表空间、数据文件、控制文件、归档文件以及Spfile参数文件。 支持增量数据块级别的备…

全球缺芯大潮中,以软代硬能否另辟蹊径?
在5G和人工智能的技术浪潮如约而至以后,业内人士无不对IoT产业的未来报以极大的期待。以人工智能和家居设备为基础,再加上算力与网络支持,有理由相信未来IoT相关产业必将迎来爆发。然而今年,席卷全球的芯片产能不足问题影响到了各…

Xtrabackup实现数据的备份与恢复
Xtrabackup介绍Xtrabackup是由percona开源的免费数据库热备份软件,它能对InnoDB数据库和XtraDB存储引擎的数据库非阻塞地备份(对于MyISAM的备份同样需要加表锁);mysqldump备份方式是采用的逻辑备份,其最大的缺陷是备份…

最简单的CI框架入门示例--数据库取数据
这个写给初学者看,这是最简单可以调通的例子,网上很多例子其实初学者本地跑不通,缺这少那。 1.下载CI框架(自己找)2.配置 database.php配置: 为数据库服务器设置 connection 参数: $db[defau…