150行python代码实现贪吃蛇游戏


Posted in Python onApril 24, 2020

上篇博文我们实现了两百行代码实现贪吃蛇游戏,这次我们来实现一个代码量更加少,功能却更加完整的

python代码实现贪吃蛇游戏,具体代码与文件可以访问我的GitHub地址获取

游戏截图

150行python代码实现贪吃蛇游戏

动图

150行python代码实现贪吃蛇游戏

贪吃蛇python代码

"""贪吃蛇"""

import random
import sys
import time
import pygame
from pygame.locals import *
from collections import deque

SCREEN_WIDTH = 600  # 屏幕宽度
SCREEN_HEIGHT = 480  # 屏幕高度
SIZE = 20    # 小方格大小
LINE_WIDTH = 1   # 网格线宽度

# 游戏区域的坐标范围
SCOPE_X = (0, SCREEN_WIDTH // SIZE - 1)
SCOPE_Y = (2, SCREEN_HEIGHT // SIZE - 1)

# 食物的分值及颜色
FOOD_STYLE_LIST = [(10, (255, 100, 100)), (20, (100, 255, 100)), (30, (100, 100, 255))]

LIGHT = (100, 100, 100)
DARK = (200, 200, 200)  # 蛇的颜色
BLACK = (0, 0, 0)   # 网格线颜色
RED = (200, 30, 30)   # 红色,GAME OVER 的字体颜色
BGCOLOR = (40, 40, 60)  # 背景色


def print_text(screen, font, x, y, text, fcolor=(255, 255, 255)):
 imgText = font.render(text, True, fcolor)
 screen.blit(imgText, (x, y))


# 初始化蛇
def init_snake():
 snake = deque()
 snake.append((2, SCOPE_Y[0]))
 snake.append((1, SCOPE_Y[0]))
 snake.append((0, SCOPE_Y[0]))
 return snake


def create_food(snake):
 food_x = random.randint(SCOPE_X[0], SCOPE_X[1])
 food_y = random.randint(SCOPE_Y[0], SCOPE_Y[1])
 while (food_x, food_y) in snake:
  # 如果食物出现在蛇身上,则重来
  food_x = random.randint(SCOPE_X[0], SCOPE_X[1])
  food_y = random.randint(SCOPE_Y[0], SCOPE_Y[1])
 return food_x, food_y


def get_food_style():
 return FOOD_STYLE_LIST[random.randint(0, 2)]


def main():
 pygame.init()
 screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
 pygame.display.set_caption('贪吃蛇')

 font1 = pygame.font.SysFont('SimHei', 24) # 得分的字体
 font2 = pygame.font.Font(None, 72) # GAME OVER 的字体
 fwidth, fheight = font2.size('GAME OVER')

 # 如果蛇正在向右移动,那么快速点击向下向左,由于程序刷新没那么快,向下事件会被向左覆盖掉,导致蛇后退,直接GAME OVER
 # b 变量就是用于防止这种情况的发生
 b = True

 # 蛇
 snake = init_snake()
 # 食物
 food = create_food(snake)
 food_style = get_food_style()
 # 方向
 pos = (1, 0)

 game_over = True
 start = False  # 是否开始,当start = True,game_over = True 时,才显示 GAME OVER
 score = 0   # 得分
 orispeed = 0.5  # 原始速度
 speed = orispeed
 last_move_time = None
 pause = False  # 暂停

 while True:
  for event in pygame.event.get():
   if event.type == QUIT:
    sys.exit()
   elif event.type == KEYDOWN:
    if event.key == K_RETURN:
     if game_over:
      start = True
      game_over = False
      b = True
      snake = init_snake()
      food = create_food(snake)
      food_style = get_food_style()
      pos = (1, 0)
      # 得分
      score = 0
      last_move_time = time.time()
    elif event.key == K_SPACE:
     if not game_over:
      pause = not pause
    elif event.key in (K_w, K_UP):
     # 这个判断是为了防止蛇向上移时按了向下键,导致直接 GAME OVER
     if b and not pos[1]:
      pos = (0, -1)
      b = False
    elif event.key in (K_s, K_DOWN):
     if b and not pos[1]:
      pos = (0, 1)
      b = False
    elif event.key in (K_a, K_LEFT):
     if b and not pos[0]:
      pos = (-1, 0)
      b = False
    elif event.key in (K_d, K_RIGHT):
     if b and not pos[0]:
      pos = (1, 0)
      b = False

  # 填充背景色
  screen.fill(BGCOLOR)
  # 画网格线 竖线
  for x in range(SIZE, SCREEN_WIDTH, SIZE):
   pygame.draw.line(screen, BLACK, (x, SCOPE_Y[0] * SIZE), (x, SCREEN_HEIGHT), LINE_WIDTH)
  # 画网格线 横线
  for y in range(SCOPE_Y[0] * SIZE, SCREEN_HEIGHT, SIZE):
   pygame.draw.line(screen, BLACK, (0, y), (SCREEN_WIDTH, y), LINE_WIDTH)

  if not game_over:
   curTime = time.time()
   if curTime - last_move_time > speed:
    if not pause:
     b = True
     last_move_time = curTime
     next_s = (snake[0][0] + pos[0], snake[0][1] + pos[1])
     if next_s == food:
      # 吃到了食物
      snake.appendleft(next_s)
      score += food_style[0]
      speed = orispeed - 0.03 * (score // 100)
      food = create_food(snake)
      food_style = get_food_style()
     else:
      if SCOPE_X[0] <= next_s[0] <= SCOPE_X[1] and SCOPE_Y[0] <= next_s[1] <= SCOPE_Y[1] \
        and next_s not in snake:
       snake.appendleft(next_s)
       snake.pop()
      else:
       game_over = True

  # 画食物
  if not game_over:
   # 避免 GAME OVER 的时候把 GAME OVER 的字给遮住了
   pygame.draw.rect(screen, food_style[1], (food[0] * SIZE, food[1] * SIZE, SIZE, SIZE), 0)

  # 画蛇
  for s in snake:
   pygame.draw.rect(screen, DARK, (s[0] * SIZE + LINE_WIDTH, s[1] * SIZE + LINE_WIDTH,
           SIZE - LINE_WIDTH * 2, SIZE - LINE_WIDTH * 2), 0)

  print_text(screen, font1, 30, 7, f'速度: {score//100}')
  print_text(screen, font1, 450, 7, f'得分: {score}')

  if game_over:
   if start:
    print_text(screen, font2, (SCREEN_WIDTH - fwidth) // 2, (SCREEN_HEIGHT - fheight) // 2, 'GAME OVER', RED)

  pygame.display.update()


if __name__ == '__main__':
 main()

更多有趣的经典小游戏实现专题,分享给大家:

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

Python 相关文章推荐
Python实现动态添加类的属性或成员函数的解决方法
Jul 16 Python
Python装饰器的函数式编程详解
Feb 27 Python
Windows下python2.7.8安装图文教程
May 26 Python
pycharm设置注释颜色的方法
May 23 Python
解决tensorflow1.x版本加载saver.restore目录报错的问题
Jul 26 Python
解决Python plt.savefig 保存图片时一片空白的问题
Jan 10 Python
pyqt5实现俄罗斯方块游戏
Jan 11 Python
python3 小数位的四舍五入(用两种方法解决round 遇5不进)
Apr 11 Python
Keras—embedding嵌入层的用法详解
Jun 10 Python
python安装读取grib库总结(推荐)
Jun 24 Python
从零开始的TensorFlow+VScode开发环境搭建的步骤(图文)
Aug 31 Python
Matplotlib绘制混淆矩阵的实现
May 27 Python
用 Python 制作地球仪的方法
Apr 24 #Python
解决python中显示图片的plt.imshow plt.show()内存泄漏问题
Apr 24 #Python
基于打开pycharm有带图片md文件卡死问题的解决
Apr 24 #Python
解决Opencv+Python cv2.imshow闪退问题
Apr 24 #Python
python实现五子棋程序
Apr 24 #Python
opencv python 图片读取与显示图片窗口未响应问题的解决
Apr 24 #Python
jupyter notebook oepncv 显示一张图像的实现
Apr 24 #Python
You might like
MySql中正则表达式的使用方法描述
2008/07/30 PHP
PHP数据库连接mysql与mysqli对比分析
2016/01/04 PHP
PHP清除缓存的几种方法总结
2017/09/12 PHP
php实现微信支付之现金红包
2018/05/30 PHP
PHP封装的mysqli数据库操作类示例
2019/02/16 PHP
js如何设置在iframe框架中指定div不显示
2013/12/04 Javascript
手机平板等移动端适配跳转URL的js代码
2014/01/25 Javascript
js数组操作常用方法
2014/05/08 Javascript
jQuery中hasClass()方法用法实例
2015/01/06 Javascript
使用AngularJS实现可伸缩的页面切换的方法
2015/06/19 Javascript
Bootstrap按钮下拉菜单组件详解
2016/05/10 Javascript
Vue学习笔记进阶篇之多元素及多组件过渡
2017/07/19 Javascript
vue-cli启动本地服务局域网不能访问的原因分析
2018/01/22 Javascript
vue ssr 指南详读
2018/06/29 Javascript
NodeJS 实现多语言的示例代码
2018/09/11 NodeJs
Vue实现渲染数据后控制滚动条位置(推荐)
2019/12/09 Javascript
如何在vue中使用jointjs过程解析
2020/05/29 Javascript
[59:30]VG vs LGD 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
Python两个内置函数 locals 和globals(学习笔记)
2016/08/28 Python
Python语言描述最大连续子序列和
2017/12/05 Python
python+selenium 鼠标事件操作方法
2019/08/24 Python
python协程gevent案例 爬取斗鱼图片过程解析
2019/08/27 Python
Python3+selenium实现cookie免密登录的示例代码
2020/03/18 Python
浅谈django 模型类使用save()方法的好处与注意事项
2020/03/28 Python
matplotlib绘制正余弦曲线图的实现
2021/02/22 Python
HTML5单页面手势滑屏切换原理分析
2017/07/10 HTML / CSS
Tea Collection官网:一家位于旧金山的童装公司
2020/08/07 全球购物
WEB控件可以激发服务端事件,请谈谈服务端事件是怎么发生并解释其原理?自动传回是什么?为什么要使用自动传回?
2012/02/21 面试题
西式婚礼证婚词
2014/01/12 职场文书
一年级班主任寄语
2014/01/19 职场文书
人事专员岗位职责范本
2014/03/04 职场文书
2015年元旦促销方案书
2014/12/09 职场文书
给女朋友道歉的话大全
2015/01/20 职场文书
Python - 10行代码集2000张美女图
2021/05/23 Python
css常用字体属性与背景属性介绍
2022/02/28 HTML / CSS
Python学习之异常中的finally使用详解
2022/03/16 Python