每个初学写代码的人可能都想在学习了一些基础知识后,希望能够写出一点拿得出手,秀的出来,但又在自己能力范围内的东西(没错,说的是我自己)。

本人是个在读大学生,python小白,就想完成个多年前“自己写出个游戏的梦想”,选择了好像不难的贪吃蛇。

写之前,因为有用C试写过贪吃蛇,所以有个大概方向与思路,但python和C毕竟还是有点区别的,所以先是查阅了很多现有的大佬写的贪吃蛇小游戏,牛吗?都很牛,但就是太牛了啊,牛到我这种小白真看不太懂,各种创建类,然后用什么pygame里面的某些我看不懂的又没有解释的变量,然后写出了华丽、灵活的小蛇在屏幕上乱舞,但我除了复制代码,我真看不懂啊!

万一我拿复制的代码装X的时候,别人问我这行的解释,我可咋办?

所以这篇文章就教你怎么用python写出一个简易的,但五脏俱全的贪吃蛇小游戏。我保证每步不重复的步骤都有最白话的注释,说了这么多废话,我们开始一步步开始吧!

首先写贪吃蛇的基本思路:

1.安装python的pygame模块

2.设置游戏窗口信息

3.画出小蛇、画出蛇爱吃的食物

4.让小蛇能跟着方向键随意舞动,并且在我们不变方向键的时候它会朝着最后一次的方向一直移动

5.蛇该死的时候还是得死的,比如“咬蛇自尽”,“撞墙示冤”而死

6.运行,然后发个pyq,文案我都帮你想好了“古有图灵人工智能,今有新秀写蛇玩蛇,计算机革命,非我无能,实属无志”(忘记押韵了,sorry)

好了让我们正式开始!(好多废话,现在才开始)

第一步:安装pygame

首先去python的官网https://www.lfd.uci.edu/~gohlke/pythonlibs/#pygame

选择适合你的python版本的pygame,比如我的python是3.7的,系统是win64位的就选择

然后把下载下来的文件放到全英文目录下(可以直接放C盘),然后在cmd里面进入C盘

然后输入pip install pygame-1.9.6-cp37-cp37m-win_amd64.whl(把install后面的一串改成你自己下载的文件的名字,然后回车就开始安装了)安装完后,可以在python里面输入import pygame如果没有报错,那就完成了万里长征的第一里了!

然后就可以在python里面使用pygame了

注意,在使用pygame之前一定要先输入

我个人的理解是:初始化 pygame模块,确保pygame模块完整可用

第二步:设置游戏窗口信息

创建一个窗口

设置窗口的长度与宽度,窗口长度从左往右0-XXX,宽度从上往下0-XXX

设置窗口标题

汇总一下第二步

运行就会出现一个黑框啦!

第三步:画出小蛇和食物

先有鸡还是先有蛋,先有蛇还是先有食物?这值得思考(个P)

3.1画蛇!

先给画布和蛇一个颜色,我喜欢Blue,就画一个小蓝蛇吧

蓝色的RGB,喜欢什么颜色可以直接百度XX色的RGB
给画布的颜色

蛇是不是要有蛇头和蛇身?

蛇头坐标
蛇身坐标,初始蛇只有三节
可以把蛇画出来了,rect表示画的是矩形组成的蛇,喜欢圆形可以用circle,10*10表示画出的矩形尺寸

食物只有一节,所以只要有一个坐标就行,但食物要是随机产生的

汇总一下第三步:

得到了小蓝蛇和食物(好刺激,如果只要图片的话,已经可以发pyq了!)

不能止步!我要玩蛇!

第四步:让蛇能跟着你的方向键动起来!动起来~

首先我们用1234分别表示上下左右

1-上 2-下 3-左 4-右

我们以“上”为例

不要把蛇的移动想得太复杂了,刚开始我想蛇的移动是整个蛇发生了位移,就要改变所有蛇身的坐标,这也太麻烦了吧!

其实仔细想一下,蛇在移动的时候,是不是其实只有蛇头和蛇尾发生了变化!

当蛇往上移动的时候,新蛇头的位置就变成了旧蛇头上面的那一格!原有的蛇不发生变化,只是多出来一个新的蛇头取代了旧蛇头(旧蛇头变成了蛇身)

物理学家迈尔说过:能量是守恒的!

既然多出了个蛇头,相应的蛇尾只要删掉就完成了蛇的移动!

当然有小天才要问了“如果刚好我上移的时候吃到了食物怎么办?”

根据守恒,食物没了,就得长在蛇身上,那我们前面说的蛇头的变化还是照旧,只是蛇尾我们不用删掉,就完成了蛇的增长了!

并且食物被吃后要产生新的食物下次接着吃!

看下代码:

其它移动方向同理:

现在蛇各个方向移动的代码完成了,那么怎么让她和我们的方向键联系起来呢?

这里要用到pygame内置的“监听事件信息”

监听所有事件信息
获取键盘按键信息

同时要注意当我们想要改变小蓝蛇的移动方向时,如果原来移动方向是“上”,我们就不能让蛇往下移动,同理原左的时候不能变成向右。

同时因为小蓝蛇一直在移动,所以画布需要一直刷新变化,需要控制一下刷新的频率

创建时钟对象 (可以控制游戏循环频率)

第五步:同时在移动的时候不能让蛇无所畏惧吧,该死的时候还是得死的

有两种死亡情况:

1.含冤撞墙而死

2.怀才不遇咬蛇自尽

将死亡触发条件添加进移动函数中

汇总一下目前代码:

看下运行结果:

知乎视频​www.zhihu.com

可以看到现在的这条蛇就不再是一条普通的蛇了!

他会向各个方向冲锋尝试,有时也会一个方向不转弯,也会因为过于执拗撞墙而死,或者因为不谨慎跌入进自己挖的坑!

他现在是哲学蛇!

当然我们也可以继续添加一些元素,让这个贪吃蛇看起来更完整。

附加1:添加游戏初始界面与结束界面

设置游戏开始界面包括图像、文字等(字体包可以百度一下自己电脑的的字体都放在哪里,我的是在C:WindowsFonts选择一个中文字体放进与py档同目录下即可)

通过监听按键信息,达成按任意键进入游戏的要求

其中蒂芙尼蓝的RGB为:Tiffanyblue=(129,216,209)
在进入正式游戏前加载初始界面
结束界面与初始界面设置基本相同,
将结束函数替换原先的死亡退出语句

初始界面:

结束界面:

附加2:添加得分信息

得分情况可以在每次移动吃到食物后得分+1即可,比较简单,然后再用于与初始结束界面相同的绘制文字的方法绘制出来即可。

每个方向都添加score = score + 1
在主程序中添加显示成绩语句(刷新画布前)其中Red = (255,0,0)

初始与结束界面图片:

最终运行结果:

知乎视频​www.zhihu.com

本人纯属python小白,当最终看到这条骚动的小蓝蛇时,内心还是有点难以抑制的喜悦的,希望各位在自己尝试后也能有所收获!

同时贪吃蛇还有很多的元素可以添加,比如设置不同按钮选择进入“无敌模式”或者现在的会死亡的模式,结束时不直接退出,而是可以选择重新开始等,期待大家的进一步完善!

代码的冗余度,规范性等还有很大的问题,但确实已经用心啦,能力所限,还望各位包涵包涵,也期待各位对其中代码的改进,与对错误的批评指正。

我在梦中听见图灵说过“贪吃蛇都写出来了,LOL、魔兽等还会远吗?”

附上完整程序代码:

import pygame   #载入pygame模块
import random   #载入random模块pygame.init() #初始化 pygame模块,确保pygame模块完整可用#设置游戏窗口的基本信息
length = 600   #窗口长度
width = 600   #窗口宽度
score = 0   #初始成绩
window = pygame.display.set_mode((length,width))   #设置窗口的长度与宽度
pygame.display.set_caption('我想玩一下蛇')   #设置窗口标题blue=(0,0,255)   #蓝色RGB
black=(0,0,0)   #黑色RGB
Tiffanyblue=(129,216,209)   #蒂芙尼蓝的RGB
Red=(255,0,0)   #红色RGB#给出蛇的坐标
head=[300,300]#蛇头的坐标
snake=[[300,300], [290,300], [280,300]]#蛇身体的三个矩形的坐标#随机给出食物的坐标
food_rd=[random.randrange(1, 60) * 10, random.randrange(1, 60) * 10]#游戏开始与游戏结束界面
#设置游戏开始界面
def start(window):font = pygame.font.Font('simhei.ttf', 30)   #设置字体与字号prompt = font.render('按任意键开始玩蛇,按ESC可退出', 1 , Tiffanyblue)   #设置文本内容和字体颜色startimage = pygame.image.load('start.jpg')   #加载图像window.blit(prompt, (90, 400))   #绘制出字体window.blit(startimage, (55, 50))   #绘制出加载的图像pygame.display.update()   #刷新while True:  #进行按键监听  for event in pygame.event.get():  #获取所有事件信息if event.type == pygame.QUIT:   #如果用户鼠标点击了窗口的Xpygame.quit()   #终止程序exit()   #终止程序elif event.type == pygame.KEYDOWN:#获取键盘按键信息if event.key == pygame.K_ESCAPE:   #终止程序pygame.quit()   #终止程序else:return 0   #结束初始界面,开始玩蛇
#设置游戏结束界面
def over(window):font = pygame.font.Font('simhei.ttf', 25)prompt = font.render('蛇都不会玩???自己按ESC或者点X退出吧', 1 , Tiffanyblue)startimage = pygame.image.load('over.jpg')window.blit(prompt, (70, 400))window.blit(startimage, (50, 50))pygame.display.update()while True:  for event in pygame.event.get():  if event.type == pygame.QUIT:pygame.quit()exit()   elif event.type == pygame.KEYDOWN:if event.key == pygame.K_ESCAPE:pygame.quit() exit()#贪吃蛇死亡的两种情况
#含冤撞墙而死
def hit_wall(head):if head[0] >= length or head[0]<0 or head[1] >= width or head[1] < 0:   #如果蛇头坐标超出四周的界线return 1   #撞墙发生else:return 0
#因怀才不遇咬蛇自尽
def hit_snake():if snake[0] in snake[1:]:   #如果蛇头坐标与身体中坐标重合return 1   #咬蛇自尽发生else:return 0#控制蛇的移动
def movesnake (direction):global food_rd   #声明全局变量(在函数中有赋值时使用)global scoreif direction == 1:   #如果移动方向为上head[1] = head[1] - 10   #Y轴坐标-10snake.insert(0, list(head))   #插入新的头部坐标if head != food_rd:   #如果没有吃到食物snake.pop(-1)   #删去最后一个元素else:   #头部坐标等于食物坐标时即吃到食物,不删除末尾元素即完成增长score = score + 1food_rd = [random.randrange(1, 50) * 10, random.randrange(1, 50) * 10]   #食物被吃后随机产生新食物elif direction == 2:head[1] = head[1] + 10snake.insert(0, list(head))if head != food_rd:snake.pop(-1)else:score = score + 1food_rd = [random.randrange(1, 60) * 10, random.randrange(1, 60) * 10]elif direction == 3:head[0] = head[0] - 10snake.insert(0, list(head))if head != food_rd:snake.pop(-1)else:score = score + 1food_rd = [random.randrange(1, 60) * 10, random.randrange(1, 60) * 10]elif direction == 4:       head[0] = head[0] + 10snake.insert(0, list(head))if head != food_rd:snake.pop(-1)else:score = score + 1food_rd = [random.randrange(1, 60) * 10, random.randrange(1, 60) * 10]#蛇在移动中该死的时候还是要死的if hit_snake() or hit_wall(head):   #如果蛇撞到自身或者撞到墙over(window)   #进入结束界面        speed = pygame.time.Clock()   #创建时钟对象 (可以控制游戏循环频率)
direction = 4   #初始化移动方向为右
start(window)   #进入初始界面
#主程序
while True:for event in pygame.event.get():#获取所有事件信息if event.type == pygame.QUIT: #如果用户鼠标点击了窗口的Xpygame.quit()             #终止pygame程序   exit()                    #终止所有程序   if event.type == pygame.KEYDOWN:   #获取键盘按键信息if event.key == pygame.K_ESCAPE:   #如果按键ESCpygame.quit()exit()if direction != 2 and event.key == pygame.K_UP:   #如果原始方向不是下,并且现在按键为上direction = 1   #方向改变为上   elif direction != 1 and event.key == pygame.K_DOWN:direction = 2elif direction != 4 and event.key == pygame.K_LEFT:direction = 3             elif direction != 3 and event.key == pygame.K_RIGHT:direction = 4movesnake(direction)   #根据按键方向移动蛇window.fill(black)   #给窗口绘制黑色的画布pygame.draw.rect(window,blue,pygame.Rect(food_rd[0],food_rd[1],10,10))   #画出食物#画出小蓝蛇for i in snake:   pygame.draw.rect(window, blue, pygame.Rect(i[0], i[1], 10, 10))#显示成绩font = pygame.font.Font('simhei.ttf', 25)score_show = font.render('得分: %s' % score, 1 , Red)   #格式化输出得分信息window.blit(score_show, (500, 20))pygame.display.update()   #刷新界面speed.tick(10)   #FPS(数值越大蛇移动的速度越快)

python圆形按钮_小白用python写个贪吃蛇给小白看相关推荐

  1. 手机java做贪吃蛇_如何用Java写一个贪吃蛇游戏

    这是一位拓胜学员用Java写贪吃蛇游戏的心得:今天课程设计终于结束了自己学java没以前学C+那么用功了觉得我学习在哪里都是个开口向上的抛物线,现在应该在右半边吧,好了进入正题. 写java贪吃蛇也是 ...

  2. qt绘制运动物体_手写QT贪吃蛇,小白高薪捷径-Qt开发

    1. C/C++初学者的困惑 很多C/C++初学者,自学了很多年,考了很多证,开发水平仍停留在控制台小项目上,就业更是遥遥无期,进退两难. C/C++的最强大的地方,当然是开发高性能框架.高性能服务器 ...

  3. 贪吃蛇博弈算法python_算法应用实践:如何用Python写一个贪吃蛇AI

    原标题:算法应用实践:如何用Python写一个贪吃蛇AI 前言 这两天在网上看到一张让人涨姿势的图片,图片中展示的是贪吃蛇游戏, 估计大部分人都玩过.但如果仅仅是贪吃蛇游戏,那么它就没有什么让人涨姿势 ...

  4. 用 Python 写个贪吃蛇,保姆级教程

    本文基于 Windows 环境开发,适合 Python 新手 下面我们就一起用 Python 实现一个简单有趣的命令行贪吃蛇小游戏,启动命令: .私信小编01即可获取大量Python学习教程 git ...

  5. python写一个游戏多少代码-使用Python写一个贪吃蛇游戏实例代码

    我在程序中加入了分数显示,三种特殊食物,将贪吃蛇的游戏逻辑写到了SnakeGame的类中,而不是在Snake类中. 特殊食物: 1.绿色:普通,吃了增加体型 2.红色:吃了减少体型 3.金色:吃了回到 ...

  6. python游戏脚本实例-使用Python写一个贪吃蛇游戏实例代码

    我在程序中加入了分数显示,三种特殊食物,将贪吃蛇的游戏逻辑写到了SnakeGame的类中,而不是在Snake类中. 特殊食物: 1.绿色:普通,吃了增加体型 2.红色:吃了减少体型 3.金色:吃了回到 ...

  7. python游戏贪吃蛇_Python写的贪吃蛇游戏例子_python

    这篇文章主要介绍了Python写的贪吃蛇游戏例子,练手作品,又好玩又可以学到东西,需要的朋友可以参考下 第一次用Python写这种比较实用且好玩的东西,权当练手吧 游戏说明: * P键控制" ...

  8. python的pygame库使用方法_python基础教程使用Python第三方库pygame写个贪吃蛇小游戏...

    今天看到几个关于pygame模块的博客和视频,感觉非常有趣,这里照猫画虎写了一个贪吃蛇小游戏,目前还有待完善,但是基本游戏功能已经实现,下面是代码: # 导入模块 import pygame impo ...

  9. 情人节用python写个贪吃蛇安慰自己

      这几天除了吃就是睡(不知道为啥,吃饱就想睡),从大年三十到现在感觉啥都没做,写个代码安慰安慰自己吧哈哈哈哈.给大家分享几部最近看的电影(要学英语的一定要get起来)--<彩虹照耀>&l ...

最新文章

  1. MySQL组内排序取最大值
  2. 微信小程序——小程序的能力
  3. javascript DOM innerHTML createElement createTextNode
  4. 【我所认知的BIOS】—gt; uEFI AHCI Driver(5) — 第一个protocol最终要開始安装了
  5. mysql记录相互关系查询_MySQL关系表查询两个表的数据
  6. 业务专题篇:AB测试实验设计与评估
  7. SAP Spartacus ProductService.get的几个调用场景
  8. java 反射 速度_Java 反射获取类方法速率和实现方式
  9. 沃尔沃XC40纯电版官宣降价至29.9万元起
  10. 关于 android 中 edittext 特殊字符过滤和字符长度限制的最优方法
  11. jmx为啥开了额外两个随机端口?
  12. 芒果db怎么连mysql_MongoDB 芒果数据库的使用
  13. 油猴脚本的安装、配置及使用方法
  14. BeanShell用法笔记
  15. xml的三种解析方法
  16. 使用PhantomJS网页截图
  17. 主流量化交易策略:统计套利交易策略
  18. 数学建模MathType输入平方的三种模式
  19. WIN7 WIN10 资源管理器不能自动刷新的解决方法
  20. 21考研:你是为了什么考研?

热门文章

  1. Spring MVC学习总结(18)——SpringMVC事务Transactional注解使用总结
  2. Docker学习总结(10)——10分钟玩转Docker
  3. 气缸标识上vr什么意思_汽车VR传感器是什么意思?
  4. 反向微分运放电路波形_做到这三步,轻松实现运放电路稳定性
  5. linux动态调试工具od,OllyDBG(OD动态调试工具)
  6. android app攻击与防范论文,基于Android平台的应用程序安全保护研究与应用
  7. MARKDOWN使用小计
  8. Intellij IDEA神器常用技巧六-Debug详解
  9. oozie中时间EL表达式
  10. Prometheus Alertmanager 报警模块