python实现贪吃蛇小游戏


Posted in Python onMarch 21, 2020

关于编写游戏,是博主非常向往的东西(博主喜爱游戏),编写游戏得一步一步的走!今天我简单的编写一下非常经典的游戏贪吃蛇!!!!

效果图:

python实现贪吃蛇小游戏

首先引入pygame模块

pip install pygame

关于编写贪吃蛇有如下几个步骤!依次思考

1、设置背景大小,即游戏框大小,---像素(px)

2、设置颜色,蛇的颜色,背景颜色,豆子的颜色

#pygame游戏库,sys操控python运行的环境
import pygame,sys,random
#这个模块包含所有pygame所使用的常亮
from pygame.locals import *
#1,定义颜色变量
#0-255 0黑色 255白色
redColor = pygame.Color(255,0,0)
#背景为黑色
blackColor = pygame.Color(0,0,0)
#贪吃蛇为白色
whiteColor = pygame.Color(255,255,255)

3、设置蛇的初始位置和长度,豆子的初始位置及被吃后随机出现的位置(如下),及蛇的速度

4、设置按键,控制蛇的上下左右

5、设置蛇通过与豆子的位置重合判断是否吃了豆子,此时蛇长度加一,豆子消失同时随机出现

6、设置开始函数(1,,3,4,5都可以设置在开始函数里),结束函数,并判断死亡方式,及游戏结束方式(直接退出,或者游戏结束)

def main():
 #初始化pygame
 pygame.init()
 #定义一个变量来控制速度
 fpsClock=pygame.time.Clock()
 #创建pygame显示层,创建一个界面
 playsurface=pygame.display.set_mode((640,480))
 pygame.display.set_caption('贪吃蛇')
 #初始化变量
 #贪吃蛇初始坐标位置 (先以100,100为基准)
 snakePosition = [100,100]
 #初始化贪吃蛇的长度列表中有个元素就代表有几段身体
 snakeBody = [[100,100],[80,100],[60,100]]
 #初始化目标方向额位置
 targetPosition = [300,300]
 #目标方块的标记 目的:判断是否吃掉了这个目标方块1 就是没有吃 0就是吃掉
 targetflag = 1
 #初始化方向 --》往右
 direction = 'right'
 #定义一个方向变量(人为控制 按键)
 changeDirection = direction
def gameover(): #游戏结束
 pygame.quit()
 sys.exit()

关于游戏运行可以当做一个时间,通过不断地循环是蛇不断地前进(设置按键,凭个人喜好按键)

while True:
 
  for event in pygame.event.get(): #从队列中获取事件
   if event.type == QUIT:
    pygame.quit()
    sys.exit()
   elif event.type == KEYDOWN:
    if event.key == K_d:
     changeDirection = 'right'
    if event.key == K_a:
     changeDirection = 'left'
    if event.key ==K_w:
     changeDirection = 'up'
    if event.key ==K_s:
     changeDirection = 'down'
     #对应键盘上的esc文件
    if event.key == K_ESCAPE:
     pygame.event.post(pygame.event.Event(QUIT))

确定方向!当蛇在运行时不可掉头!不可前后,左后!

#确定方向
  if changeDirection =='left' and not direction =='right':
   direction = changeDirection
  if changeDirection =='right' and not direction =='left':
   direction = changeDirection
  if changeDirection =='up' and not direction =='down':
   direction = changeDirection
  if changeDirection =='down' and not direction =='up':
   direction = changeDirection

这里通过像素的加减确定蛇头的移动向上或向下加减20px相当于向上下移动一步

#根据方向移动蛇头
  if direction =='right':
   snakePosition[0] +=20
  if direction =='left':
   snakePosition[0] -=20
  if direction =='up':
   snakePosition[1] -=20
  if direction =='down':
   snakePosition[1] +=20
  #增加蛇的长度
  snakeBody.insert(0,list(snakePosition))
  #如果贪吃蛇和目标方块的位置重合
  if snakePosition[0] == targetPosition[0] and snakePosition[1] ==targetPosition[1]:
   targetflag= 0
  else:
   snakeBody.pop()
  if targetflag ==0:
   x = random.randrange(1,32)
   y = random.randrange(1,24)
   targetPosition = [int(x*20),int(y*20)]
   targetflag =1
  #填充背景颜色
  playsurface.fill(blackColor)

设置蛇与豆子的颜色长宽

for position in snakeBody:
   #第一个参数serface指定一个serface编辑区,在这个区域内绘制
   #第二个参数color:颜色
   #第三个参数:rect:返回一个矩形(xy),(width,height)
   #第四个参数:width:表示线条的粗细 width0填充 实心
   #化蛇
   pygame.draw.rect(playsurface,redColor,Rect(position[0],position[1],20,20))
   pygame.draw.rect(playsurface, whiteColor, Rect(targetPosition[0], targetPosition[1], 20, 20))

将上面的所作为显示到桌面,通过下面的方法实现

pygame.display.flip()

判断游戏结束

if snakePosition[0] > 620 or snakePosition[0] < 0:
   gameover()
  elif snakePosition[1] >460 or snakePosition[1] <0:
   gameover()
  #控制游戏速度
  fpsClock.tick(2)

基本的贪吃蛇步骤如上,如果要是添加得分或者开始和结束界面都凭自身能力了,大佬们肯定是洒洒水了

以下是完整代码

#pygame游戏库,sys操控python运行的环境
import pygame,sys,random
#这个模块包含所有pygame所使用的常亮
from pygame.locals import *
#1,定义颜色变量
#0-255 0黑色 255白色
redColor = pygame.Color(255,0,0)
#背景为黑色
blackColor = pygame.Color(0,0,0)
#贪吃蛇为白色
whiteColor = pygame.Color(255,255,255)
 
 
#定义游戏结束的函数
def gameover():
 pygame.quit()
 sys.exit()
#定义main函数--》定义我们的入口函数
def main():
 #初始化pygame
 pygame.init()
 #定义一个变量来控制速度
 fpsClock=pygame.time.Clock()
 #创建pygame显示层,创建一个界面
 playsurface=pygame.display.set_mode((640,480))
 pygame.display.set_caption('贪吃蛇')
 #初始化变量
 #贪吃蛇初始坐标位置 (先以100,100为基准)
 snakePosition = [100,100]
 #初始化贪吃蛇的长度列表中有个元素就代表有几段身体
 snakeBody = [[100,100],[80,100],[60,100]]
 #初始化目标方向额位置
 targetPosition = [300,300]
 #目标方块的标记 目的:判断是否吃掉了这个目标方块1 就是没有吃 0就是吃掉
 targetflag = 1
 #初始化方向 --》往右
 direction = 'right'
 #定义一个方向变量(人为控制 按键)
 changeDirection = direction
 while True:
 
  for event in pygame.event.get(): #从队列中获取事件
   if event.type == QUIT:
    pygame.quit()
    sys.exit()
   elif event.type == KEYDOWN:
    if event.key == K_d:
     changeDirection = 'right'
    if event.key == K_a:
     changeDirection = 'left'
    if event.key ==K_w:
     changeDirection = 'up'
    if event.key ==K_s:
     changeDirection = 'down'
     #对应键盘上的esc文件
    if event.key == K_ESCAPE:
     pygame.event.post(pygame.event.Event(QUIT))
 
  #确定方向
  if changeDirection =='left' and not direction =='right':
   direction = changeDirection
  if changeDirection =='right' and not direction =='left':
   direction = changeDirection
  if changeDirection =='up' and not direction =='down':
   direction = changeDirection
  if changeDirection =='down' and not direction =='up':
   direction = changeDirection
 
  #根据方向移动蛇头
  if direction =='right':
   snakePosition[0] +=20
  if direction =='left':
   snakePosition[0] -=20
  if direction =='up':
   snakePosition[1] -=20
  if direction =='down':
   snakePosition[1] +=20
  #增加蛇的长度
  snakeBody.insert(0,list(snakePosition))
  #如果贪吃蛇和目标方块的位置重合
  if snakePosition[0] == targetPosition[0] and snakePosition[1] ==targetPosition[1]:
   targetflag= 0
  else:
   snakeBody.pop()
  if targetflag ==0:
   x = random.randrange(1,32)
   y = random.randrange(1,24)
   targetPosition = [int(x*20),int(y*20)]
   targetflag =1
  #填充背景颜色
  playsurface.fill(blackColor)
  for position in snakeBody:
   #第一个参数serface指定一个serface编辑区,在这个区域内绘制
   #第二个参数color:颜色
   #第三个参数:rect:返回一个矩形(xy),(width,height)
   #第四个参数:width:表示线条的粗细 width0填充 实心
   #化蛇
   pygame.draw.rect(playsurface,redColor,Rect(position[0],position[1],20,20))
   pygame.draw.rect(playsurface, whiteColor, Rect(targetPosition[0], targetPosition[1], 20, 20))
 
  #更新显示到屏幕表面
  pygame.display.flip()
  #判断是否游戏结束
  if snakePosition[0] > 620 or snakePosition[0] < 0:
   gameover()
  elif snakePosition[1] >460 or snakePosition[1] <0:
   gameover()
  #控制游戏速度
  fpsClock.tick(2)
# 启动入口函数
if __name__ =='__main__':
 main()

运行结果:

python实现贪吃蛇小游戏

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用Flask框架获取用户IP地址的方法
Mar 21 Python
Python实现控制台进度条功能
Jan 04 Python
Python计算两个日期相差天数的方法示例
May 23 Python
详解python里使用正则表达式的全匹配功能
Oct 19 Python
Python实现的单向循环链表功能示例
Nov 10 Python
分数霸榜! python助你微信跳一跳拿高分
Jan 08 Python
Python3实现的字典遍历操作详解
Apr 18 Python
TENSORFLOW变量作用域(VARIABLE SCOPE)
Jan 10 Python
Python 使用 environs 库定义环境变量的方法
Feb 25 Python
python 爬虫 实现增量去重和定时爬取实例
Feb 28 Python
Pyqt5 关于流式布局和滚动条的综合使用示例代码
Mar 24 Python
Django ORM判断查询结果是否为空,判断django中的orm为空实例
Jul 09 Python
将python图片转为二进制文本的实例
Jan 24 #Python
python实现五子棋小游戏
Mar 25 #Python
PyQt5实现五子棋游戏(人机对弈)
Mar 24 #Python
Python制作exe文件简单流程
Jan 24 #Python
PyQt5实现类似别踩白块游戏
Jan 24 #Python
实例讲解Python脚本成为Windows中运行的exe文件
Jan 24 #Python
python随机在一张图像上截取任意大小图片的方法
Jan 24 #Python
You might like
搜索引擎技术核心揭密
2006/10/09 PHP
PHP错误Warning: Cannot modify header information - headers already sent by解决方法
2014/09/27 PHP
PHP处理数组和XML之间的互相转换
2016/06/02 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
基于jquery的文章中所有图片width大小批量设置方法
2013/08/01 Javascript
JavaScript prototype 使用介绍
2013/08/29 Javascript
如何动态的导入js文件具体该怎么实现
2014/01/14 Javascript
JS 实现列表与多选框选择附预览动画
2014/10/29 Javascript
jQuery pjax 应用简单示例
2018/09/20 jQuery
基于vue开发微信小程序mpvue-docs跳转页面功能
2019/04/10 Javascript
[38:51]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-CDEC
2014/05/22 DOTA
[01:04:01]2014 DOTA2华西杯精英邀请赛5 24 DK VS VG
2014/05/25 DOTA
[01:10:57]Liquid vs OG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python判断字符串与大小写转换
2015/06/08 Python
python实现备份目录的方法
2015/08/03 Python
Python信息抽取之乱码解决办法
2017/06/29 Python
python微信好友数据分析详解
2018/11/19 Python
python使用xlsxwriter实现有向无环图到Excel的转换
2018/12/12 Python
Python namedtuple命名元组实现过程解析
2020/01/08 Python
Python爬虫库BeautifulSoup的介绍与简单使用实例
2020/01/25 Python
Python小白垃圾回收机制入门
2020/06/09 Python
django filter过滤器实现显示某个类型指定字段不同值方式
2020/07/16 Python
日本最大美瞳直送网:Morecontact(中文)
2019/04/03 全球购物
戴森香港官方网站:Dyson香港
2021/02/11 全球购物
电脑教师的教学自我评价
2013/11/26 职场文书
小学语文国培感言
2014/03/04 职场文书
蟋蟀的住宅教学反思
2014/04/26 职场文书
机械操作工岗位职责
2014/08/08 职场文书
远程培训的心得体会
2014/09/01 职场文书
三严三实心得体会范文
2014/10/13 职场文书
房屋租房协议书范本
2014/12/04 职场文书
2015年入党决心书
2015/02/05 职场文书
2015年保送生自荐信
2015/03/24 职场文书
义卖募捐活动总结
2015/05/09 职场文书
2016五四青年节活动总结范文
2016/04/06 职场文书
CSS实现漂亮的时钟动画效果的实例代码
2021/03/30 HTML / CSS