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实现字符串和日期相互转换的方法
May 13 Python
使用相同的Apache实例来运行Django和Media文件
Jul 22 Python
python 数据清洗之数据合并、转换、过滤、排序
Feb 12 Python
Python网络编程 Python套接字编程
Sep 13 Python
聊聊Python中的pypy
Jan 12 Python
Python 爬取携程所有机票的实例代码
Jun 11 Python
python八皇后问题的解决方法
Sep 27 Python
pandas分区间,算频率的实例
Jul 04 Python
Python批量启动多线程代码实例
Feb 18 Python
Python基于Webhook实现github自动化部署
Nov 28 Python
python Autopep8实现按PEP8风格自动排版Python代码
Mar 02 Python
python plt.plot bar 如何设置绘图尺寸大小
Jun 01 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
获得Google PR值的PHP代码
2007/01/28 PHP
php入门小知识
2008/03/24 PHP
php中的三元运算符使用说明
2011/07/03 PHP
php json_encode()函数返回json数据实例代码
2014/10/10 PHP
PHP框架自动加载类文件原理详解
2017/06/06 PHP
php+jQuery实现的三级导航栏下拉菜单显示效果
2017/08/10 PHP
在laravel框架中实现封装公共方法全局调用
2019/10/14 PHP
javascript中的undefined 与 null 的区别  补充篇
2010/03/17 Javascript
js获取单元格自定义属性值的代码(IE/Firefox)
2010/04/05 Javascript
jQuery+PHP打造滑动开关效果
2014/12/16 Javascript
javascript中的3种继承实现方法
2016/01/27 Javascript
javascript先序遍历DOM树的方法
2016/02/27 Javascript
JavaScript对象数组排序实例方法浅析
2016/06/15 Javascript
jQuery插件HighCharts实现的2D对数饼图效果示例【附demo源码下载】
2017/03/09 Javascript
vue表单绑定实现多选框和下拉列表的实例
2017/08/12 Javascript
微信小程序实现卡片左右滑动效果的示例代码
2019/05/01 Javascript
JavaScript中的函数式编程详解
2020/08/22 Javascript
一起深入理解js中的事件对象
2021/02/06 Javascript
[01:02:34]TFT vs VGJ.T Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
[02:01]2018完美盛典-开场舞《双子星》
2018/12/16 DOTA
Python 实现Windows开机运行某软件的方法
2018/10/14 Python
简单了解Python读取大文件代码实例
2019/12/18 Python
Python爬虫基于lxml解决数据编码乱码问题
2020/07/31 Python
详解numpy.ndarray.reshape()函数的参数问题
2020/10/13 Python
阿迪达斯西班牙官方网站:adidas西班牙
2016/07/21 全球购物
新加坡第一大健康与美容零售商:屈臣氏新加坡(Watsons Singapore)
2020/12/11 全球购物
西部世纪面试题
2014/12/05 面试题
入党积极分子思想汇报
2014/01/02 职场文书
澳大利亚商务邀请函
2014/01/17 职场文书
职工趣味运动会方案
2014/02/10 职场文书
视光学毕业生自荐书范文
2014/02/13 职场文书
公司离职证明范本
2014/10/17 职场文书
优秀教育工作者事迹材料
2014/12/24 职场文书
2015年财务部年度工作总结
2015/05/19 职场文书
Python利用机器学习算法实现垃圾邮件的识别
2021/06/28 Python
Golang 语言控制并发 Goroutine的方法
2021/06/30 Golang