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


Posted in Python onApril 24, 2020

本文实例为大家分享了python实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下

这次我们来写一个贪吃蛇游戏

下面贴出具体代码

import pygame
import time
import numpy as np
# 此模块包含游戏所需的常量
from pygame.locals import *

# 设置棋盘的长宽
BOARDWIDTH = 48
BOARDHEIGHT = 28
# 分数
score = 0



class Food(object):
 def __init__(self):
 self.item = (4, 5)

 # 画出食物
 def _draw(self, screen, i, j):
 color = 255, 0, 255
 radius = 10
 width = 10
 # i:1---34 j:1---25
 position = 10 + 20 * i, 10 + 20 * j
 # 画出半径为 10 的粉色实心圆
 pygame.draw.circle(screen, color, position, radius, width)

 # 随机产生食物
 def update(self, screen, enlarge, snack):
 if enlarge:
  self.item = np.random.randint(1, BOARDWIDTH - 2), np.random.randint(1, BOARDHEIGHT - 2)
  while self.item in snack.item:
  self.item = np.random.randint(1, BOARDWIDTH - 2), np.random.randint(1, BOARDHEIGHT - 2)
 self._draw(screen, self.item[0], self.item[1])


# 贪吃蛇
class Snack(object):
 def __init__(self):
 # self.item = [(3, 25), (2, 25), (1, 25), (1,24), (1,23),
 # (1,22), (1,21), (1,20), (1,19), (1,18), (1,17), (1,16)]
 # x 水平方向 y 竖直方向
 # 初始方向竖直向上
 self.item = [(3, 25), (2, 25), (1, 25), (1, 24), ]
 self.x = 0
 self.y = -1

 def move(self, enlarge):
 # enlarge 标记贪吃蛇有没有吃到食物
 if not enlarge:
  # 吃到食物删除尾部元素
  self.item.pop()
 # 新蛇头的坐标为旧蛇头坐标加上移动方向的位移
 head = (self.item[0][0] + self.x, self.item[0][1] + self.y)
 # 将新的蛇头坐标插入在 list 最前面
 self.item.insert(0, head)

 def eat_food(self, food):
 global score
 # snack_x,snack_y 蛇头坐标
 # food_x, food_y 食物坐标
 snack_x, snack_y = self.item[0]
 food_x, food_y = food.item
 # 比较蛇头坐标与食物坐标
 if (food_x == snack_x) and (food_y == snack_y):
  score += 100
  return 1
 else:
  return 0

 def toward(self, x, y):
 # 改变蛇头朝向
 if self.x * x >= 0 and self.y * y >= 0:
  self.x = x
  self.y = y

 def get_head(self):
 # 获取蛇头坐标
 return self.item[0]

 def draw(self, screen):
 # 画出贪吃蛇
 # 蛇头为半径为 15 的红色实心圆
 radius = 15
 width = 15
 # i:1---34 j:1---25
 color = 255, 0, 0
 # position 为图形的坐标
 position = 10 + 20 * self.item[0][0], 10 + 20 * self.item[0][1]
 pygame.draw.circle(screen, color, position, radius, width)
 # 蛇身为半径为 10 的黄色实心圆
 radius = 10
 width = 10
 color = 255, 255, 0
 for i, j in self.item[1:]:
  position = 10 + 20 * i, 10 + 20 * j
  pygame.draw.circle(screen, color, position, radius, width)


# 初始界面
def init_board(screen):
 board_width = BOARDWIDTH
 board_height = BOARDHEIGHT
 color = 10, 255, 255
 width = 0
 # width:x, height:y
 # 左右边框占用了 X: 0 35*20
 for i in range(board_width):
 pos = i * 20, 0, 20, 20
 pygame.draw.rect(screen, color, pos, width)
 pos = i * 20, (board_height - 1) * 20, 20, 20
 pygame.draw.rect(screen, color, pos, width)
 # 上下边框占用了 Y: 0 26*20
 for i in range(board_height - 1):
 pos = 0, 20 + i * 20, 20, 20
 pygame.draw.rect(screen, color, pos, width)
 pos = (board_width - 1) * 20, 20 + i * 20, 20, 20
 pygame.draw.rect(screen, color, pos, width)


# 游戏失败
def game_over(snack):
 broad_x, broad_y = snack.get_head()
 flag = 0
 old = len(snack.item)
 new = len(set(snack.item))
 # 游戏失败的两种可能
 # 咬到自身
 if new < old:
 flag = 1
 # 撞到边框
 if broad_x == 0 or broad_x == BOARDWIDTH - 1:
 flag = 1
 if broad_y == 0 or broad_y == BOARDHEIGHT - 1:
 flag = 1

 if flag:
 return True
 else:
 return False


# 打印字符
def print_text(screen, font, x, y, text, color=(255, 0, 0)):
 # 在屏幕上打印字符
 # text是需要打印的文本,color为字体颜色
 # (x,y)是文本在屏幕上的位置
 imgText = font.render(text, True, color)
 screen.blit(imgText, (x, y))


# 按键
def press(keys, snack):
 global score
 # K_w 为 pygame.locals 中的常量
 # keys[K_w] 返回 True or False
 # 上移
 if keys[K_w] or keys[K_UP]:
 snack.toward(0, -1)
 # 下移
 elif keys[K_s] or keys[K_DOWN]:
 snack.toward(0, 1)
 # 左移
 elif keys[K_a] or keys[K_LEFT]:
 snack.toward(-1, 0)
 # 右移
 elif keys[K_d] or keys[K_RIGHT]:
 snack.toward(1, 0)
 # 重置游戏
 elif keys[K_r]:
 score = 0
 main()
 # 退出游戏
 elif keys[K_ESCAPE]:
 exit()


# 游戏初始化
def game_init():
 # pygame 初始化
 pygame.init()
 # 设置游戏界面大小
 screen = pygame.display.set_mode((BOARDWIDTH * 20, BOARDHEIGHT * 20))
 # 设置游戏标题
 pygame.display.set_caption('贪吃蛇游戏')
 # sound = pygame.mixer.Sound(AUDIONAME)
 # channel = pygame.mixer.find_channel(True)
 # channel.play(sound)
 return screen


# 开始游戏
def game(screen):
 snack = Snack()
 food = Food()
 # 设置中文字体和大小
 font = pygame.font.SysFont('SimHei', 20)
 is_fail = 0
 while True:
 for event in pygame.event.get():
  if event.type == QUIT:
  exit()
 # 填充屏幕
 screen.fill((0, 0, 100))
 init_board(screen=screen)
 # 获得用户按键命令
 keys = pygame.key.get_pressed()
 press(keys, snack)
 # 游戏失败打印提示
 if is_fail:
  font2 = pygame.font.Font(None, 40)
  print_text(screen, font2, 400, 200, "GAME OVER")
 # 游戏主进程
 if not is_fail:
  enlarge = snack.eat_food(food)
  food.update(screen, enlarge, snack)
  snack.move(enlarge)
  is_fail = game_over(snack=snack)
  snack.draw(screen)
 # 游戏刷新
 pygame.display.update()
 time.sleep(0.1)


# 主程序
def main():
 screen = game_init()
 game(screen)


if __name__ == '__main__':
 main()

程序运行效果

简单截图了一下
可以按住方向键移动蛇的运动方向

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

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

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

Python 相关文章推荐
Python多进程并发(multiprocessing)用法实例详解
Jun 02 Python
Python的Flask框架中使用Flask-SQLAlchemy管理数据库的教程
Jun 14 Python
基于Python函数的作用域规则和闭包(详解)
Nov 29 Python
python中的set实现不重复的排序原理
Jan 24 Python
利用Python如何将数据写到CSV文件中
Jun 05 Python
python 对dataframe下面的值进行大规模赋值方法
Jun 09 Python
Win10下python3.5和python2.7环境变量配置教程
Sep 18 Python
详解Python发送email的三种方式
Oct 18 Python
python3爬虫怎样构建请求header
Dec 23 Python
浅谈PyQt5中异步刷新UI和Python多线程总结
Dec 13 Python
Python过滤序列元素的方法
Jul 31 Python
关于Python OS模块常用文件/目录函数详解
Jul 01 Python
python Canny边缘检测算法的实现
Apr 24 #Python
python实现文字版扫雷
Apr 24 #Python
离线状态下在jupyter notebook中使用plotly实例
Apr 24 #Python
python3中sys.argv的实例用法
Apr 24 #Python
VScode连接远程服务器上的jupyter notebook的实现
Apr 23 #Python
Python实现仿射密码的思路详解
Apr 23 #Python
利用matplotlib为图片上添加触发事件进行交互
Apr 23 #Python
You might like
模板引擎Smarty深入浅出介绍
2006/12/06 PHP
一个简单的PHP&amp;MYSQL留言板源码
2020/07/19 PHP
php实现的通用图片处理类
2015/03/24 PHP
php实现对文件压缩简单的方法
2019/09/29 PHP
一个多次搜索+多次传值的解决方案
2007/01/20 Javascript
JavaScript 继承详解 第一篇
2009/08/30 Javascript
基于JQuery的抓取博客园首页RSS的代码
2011/12/01 Javascript
jquery实现marquee效果(文字或者图片的水平垂直滚动)
2013/01/07 Javascript
jQuery编辑器KindEditor4.1.4代码高亮显示设置教程
2013/03/01 Javascript
用JavaScript修改CSS属性的代码
2013/05/06 Javascript
jQuery之字体大小的设置方法
2014/02/27 Javascript
jQuery实现带延迟的二级tab切换下拉列表效果
2015/09/01 Javascript
1秒50万字!js实现关键词匹配
2016/08/01 Javascript
使用Browserify来实现CommonJS的浏览器加载方法
2017/05/14 Javascript
JQuery用$.ajax或$.getJSON跨域获取JSON数据的实现代码
2017/09/23 jQuery
vue中使用refs定位dom出现undefined的解决方法
2017/12/21 Javascript
浅谈Vue2.0父子组件间事件派发机制
2018/01/08 Javascript
vue input输入框模糊查询的示例代码
2018/05/22 Javascript
vue 音乐App QQ音乐搜索列表最新接口跨域设置方法
2018/09/25 Javascript
Python模块学习 datetime介绍
2012/08/27 Python
详解python的几种标准输出重定向方式
2016/08/15 Python
Python 限制线程的最大数量的方法(Semaphore)
2019/02/22 Python
pyqt5利用pyqtDesigner实现登录界面
2019/03/28 Python
Python使用指定端口进行http请求的例子
2019/07/25 Python
python构造IP报文实例
2020/05/05 Python
python线程池 ThreadPoolExecutor 的用法示例
2020/10/10 Python
HTML5之WebGL 3D概述(下)—借助类库开发及框架介绍
2013/01/31 HTML / CSS
新加坡网上美容店:Hermo新加坡
2019/06/19 全球购物
长青弘远的面试题
2012/06/09 面试题
EJB2和EJB3在架构上的不同点
2014/09/29 面试题
高中毕业生自我鉴定例文
2013/12/29 职场文书
工程承包协议书
2014/04/22 职场文书
社区党的群众路线教育实践活动总结材料
2014/10/31 职场文书
2014年纳税评估工作总结
2014/12/23 职场文书
2015驻村干部工作总结
2015/04/07 职场文书
小爸爸观后感
2015/06/15 职场文书