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 15 Python
用Python的pandas框架操作Excel文件中的数据教程
Mar 31 Python
Python作用域用法实例详解
Mar 15 Python
Python中的sort()方法使用基础教程
Jan 08 Python
浅谈用VSCode写python的正确姿势
Dec 16 Python
python删除某个字符
Mar 19 Python
好的Python培训机构应该具备哪些条件
May 23 Python
浅谈Python的list中的选取范围
Nov 12 Python
python try 异常处理(史上最全)
Mar 07 Python
python模拟鼠标点击和键盘输入的操作
Aug 04 Python
python批量图片处理简单示例
Aug 06 Python
解决使用python print打印函数返回值多一个None的问题
Apr 09 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
如何在PHP中使用Oracle数据库(5)
2006/10/09 PHP
PHP 实现多服务器共享 SESSION 数据
2009/08/15 PHP
PHP strtok()函数的优点分析
2010/03/02 PHP
qq登录,新浪微博登录接口申请过程中遇到的问题
2014/07/22 PHP
php支持断点续传、分块下载的类
2016/05/02 PHP
jQuery 操作下拉列表框实现代码
2010/02/22 Javascript
ExtJS中设置下拉列表框不可编辑的方法
2014/05/07 Javascript
最短的IE判断var ie=!-[1,]分析
2014/05/28 Javascript
jQuery+Ajax实现无刷新分页
2015/10/30 Javascript
JS中dom0级事件和dom2级事件的区别介绍
2016/05/05 Javascript
在Vue组件上动态添加和删除属性方法
2018/02/23 Javascript
详解Vue.directive 自定义指令
2019/03/27 Javascript
一文读懂ES7中的javascript修饰器
2019/05/06 Javascript
JS简单数组排序操作示例【sort方法】
2019/05/17 Javascript
学习RxJS之JavaScript框架Cycle.js
2019/06/17 Javascript
Vue中通过Vue.extend动态创建实例的方法
2019/08/13 Javascript
python字符串加密解密的三种方法分享(base64 win32com)
2014/01/19 Python
在Python中定义和使用抽象类的方法
2016/06/30 Python
python爬虫获取淘宝天猫商品详细参数
2020/06/23 Python
一篇文章彻底搞懂Python中可迭代(Iterable)、迭代器(Iterator)与生成器(Generator)的概念
2019/05/13 Python
Python计算一个点到所有点的欧式距离实现方法
2019/07/04 Python
Python 使用 prettytable 库打印表格美化输出功能
2019/12/26 Python
Python for循环与getitem的关系详解
2020/01/02 Python
PyCharm永久激活方式(推荐)
2020/09/22 Python
css3实现冲击波效果的示例代码
2018/01/11 HTML / CSS
以实惠的价格轻松租车,免费取消:Easyrentcars
2019/07/16 全球购物
bonprix荷兰网上商店:便宜的服装、鞋子和家居用品
2020/07/04 全球购物
Lookfantastic澳大利亚官网:英国知名美妆购物网站
2021/01/07 全球购物
Aosom西班牙:家具在线商店
2020/06/11 全球购物
路德维希•贝克(LUDWIG BECK)中文官网:德国大型美妆百货
2020/09/19 全球购物
android面试问题与答案
2016/12/27 面试题
《可爱的动物》教学反思
2014/02/22 职场文书
会计的岗位职责
2014/03/15 职场文书
社区平安建设汇报材料
2014/08/14 职场文书
瞿秋白纪念馆观后感
2015/06/10 职场文书
php解析非标准json、非规范json的方式实例
2022/05/10 PHP