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实现文件分组复制到不同目录的例子
Jun 04 Python
python中getaddrinfo()基本用法实例分析
Jun 28 Python
Python中文竖排显示的方法
Jul 28 Python
在CMD命令行中运行python脚本的方法
May 12 Python
Python判断对象是否相等及eq函数的讲解
Feb 25 Python
Python中的字符串切片(截取字符串)的详解
May 15 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
Jun 04 Python
django如何通过类视图使用装饰器
Jul 24 Python
pandas数据处理进阶详解
Oct 11 Python
Python对称的二叉树多种思路实现方法
Feb 28 Python
python GUI库图形界面开发之PyQt5不规则窗口实现与显示GIF动画的详细方法与实例
Mar 09 Python
Python unittest装饰器实现原理及代码
Sep 08 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
php通过array_shift()函数移除数组第一个元素的方法
2015/03/18 PHP
Javascript 文件夹选择框的两种解决方案
2009/07/01 Javascript
JavaScript 滚轮事件使用说明
2010/03/07 Javascript
输入密码检测大写是否锁定js实现代码
2012/12/03 Javascript
Javascript异步编程的4种方法让你写出更出色的程序
2013/01/17 Javascript
jQuery解决下拉框select设宽度时IE 6/7/8下option超出显示不全
2013/05/27 Javascript
jQuery源码解读之removeAttr()方法分析
2015/02/20 Javascript
浅谈js常用内置方法和对象
2016/09/24 Javascript
jquery-mobile表单的创建方法详解
2016/11/23 Javascript
node学习记录之搭建web服务器教程
2017/02/16 Javascript
详解angular中通过$location获取路径(参数)的写法
2017/03/21 Javascript
jQuery中hover方法搭配css的hover选择器,实现选中元素突出显示方法
2017/05/08 jQuery
webpack使用 babel-loader 转换 ES6代码示例
2017/08/21 Javascript
React学习笔记之列表渲染示例详解
2017/08/22 Javascript
js中Array对象的常用遍历方法详解
2019/01/17 Javascript
Openlayers实现地图全屏显示
2020/09/28 Javascript
Python中返回字典键的值的values()方法使用
2015/05/22 Python
python读取csv文件并把文件放入一个list中的实例讲解
2018/04/27 Python
Python数据分析matplotlib设置多个子图的间距方法
2018/08/03 Python
基于python实现判断字符串是否数字算法
2020/07/10 Python
Web页面中八种创建多列等高(等高列布局)的实现技术
2012/12/24 HTML / CSS
轻松制作精彩视频:Animoto
2018/09/19 全球购物
大专生自我鉴定范文
2013/10/01 职场文书
软件部经理岗位职责范本
2014/02/25 职场文书
加多宝凉茶广告词
2014/03/18 职场文书
《新型玻璃》教学反思
2014/04/13 职场文书
无刑事犯罪记录证明
2014/09/18 职场文书
2014年党的群众路线整改措施思想汇报
2014/10/12 职场文书
村党支部书记个人对照材料汇报
2014/10/26 职场文书
项目经理岗位职责范本
2015/04/01 职场文书
社区文明创建工作总结2015
2015/04/21 职场文书
亮剑观后感600字
2015/06/05 职场文书
新学期开学标语2015
2015/07/16 职场文书
python实现简单聊天功能
2021/07/07 Python
Mysql中where与on的区别及何时使用详析
2021/08/04 MySQL
Redis 限流器
2022/05/15 Redis