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基于queue和threading实现多线程下载实例
Oct 08 Python
Python正则替换字符串函数re.sub用法示例
Jan 19 Python
mac下给python3安装requests库和scrapy库的实例
Jun 13 Python
python 反向输出字符串的方法
Jul 16 Python
Django添加KindEditor富文本编辑器的使用
Oct 24 Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
Nov 30 Python
python实现给scatter设置颜色渐变条colorbar的方法
Dec 13 Python
Python 使用 Pillow 模块给图片添加文字水印的方法
Aug 30 Python
wxPython多个窗口的基本结构
Nov 19 Python
基于Python的OCR实现示例
Apr 03 Python
Python引入多个模块及包的概念过程解析
Sep 21 Python
python中pow函数用法及功能说明
Dec 04 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
Discuz板块横排显示图片的实现方法
2007/05/28 PHP
PHP实现的多文件上传类及用法示例
2016/05/06 PHP
PHP实现大数(浮点数)取余的方法
2017/02/18 PHP
Perl Substr()函数及函数的应用
2015/12/16 Javascript
详解从angular-cli:1.0.0-beta.28.3升级到@angular/cli:1.0.0
2017/05/22 Javascript
鼠标拖动改变DIV等网页元素的大小的实现方法
2017/07/06 Javascript
vue中动态绑定表单元素的属性方法
2018/02/23 Javascript
详解Vue的watch中的immediate与watch是什么意思
2019/12/30 Javascript
在Vue中实现随hash改变响应菜单高亮
2020/03/09 Javascript
[02:42]2014DOTA2国际邀请赛 三冰专访:我会打到Ti20
2014/07/13 DOTA
[56:00]DOTA2上海特级锦标赛主赛事日 - 4 胜者组决赛Secret VS Liquid第一局
2016/03/05 DOTA
[01:36]极致酷炫!TI9典藏宝瓶+撼地者至宝展示
2019/06/11 DOTA
python的正则表达式re模块的常用方法
2013/03/09 Python
Python中用format函数格式化字符串的用法
2015/04/08 Python
Python功能键的读取方法
2015/05/28 Python
Python中不同进制的语法及转换方法分析
2016/07/27 Python
Python实现简单http服务器
2018/04/12 Python
pandas 对series和dataframe进行排序的实例
2018/06/09 Python
Python 中的range(),以及列表切片方法
2018/07/02 Python
python脚本监控Tomcat服务器的方法
2018/07/06 Python
浅谈python在提示符下使用open打开文件失败的原因及解决方法
2018/11/30 Python
python飞机大战pygame游戏背景设计详解
2019/12/17 Python
pytorch点乘与叉乘示例讲解
2019/12/27 Python
pytorch:model.train和model.eval用法及区别详解
2020/02/20 Python
python实现定时发送邮件
2020/12/23 Python
索尼巴西商店:Sony巴西
2019/06/21 全球购物
在网络中有两台主机A和B,并通过路由器和其他交换设备连接起来,已经确认物理连接正确无误,怎么来测试这两台机器是否连通?如果不通,怎么来判断故障点?怎么排
2014/01/13 面试题
程序员跳槽必看面试题总结
2013/06/28 面试题
工程项目经理岗位职责
2013/12/15 职场文书
毕业生自我鉴定实例
2014/01/21 职场文书
严以律己专题学习研讨会发言材料
2015/11/09 职场文书
2016优秀护士求职自荐信
2016/01/28 职场文书
《兰兰过桥》教学反思
2016/02/20 职场文书
SQL SERVER存储过程用法详解
2022/02/24 SQL Server
python微信智能AI机器人实现多种支付方式
2022/04/12 Python
TypeScript实用技巧 Nominal Typing名义类型详解
2022/09/23 Javascript