# 面向 python 小白的贪吃蛇游戏

## 游戏简介

`pip install -U pygame`

```# 贪吃蛇
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)```

`np.random.randint`用于产生边界之内的坐标，如果与贪吃蛇的坐标重合，那么就继续生成新的随机坐标。

```# 食物
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])```

`board_width``board_height`分别为游戏界面的宽度和高度，根据计算得出边框占据的位置，然后打印出正方形来。`pygame.draw.rect``pygame.draw.circle`用法类似，区别就是`rect`四个参数分别为`screen`：屏幕，`color`：颜色，`pos`：横坐标 x，纵坐标 y，矩形的长，矩形的宽。这里我设置矩形长宽都为 20 。`width``circle``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 game_init():
# pygame 初始化
pygame.init()
# 设置游戏界面大小
screen = pygame.display.set_mode((BOARDWIDTH * 20, BOARDHEIGHT * 20))
# 设置游戏标题
pygame.display.set_caption('贪吃蛇游戏')
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, font, 0, 0, text)
print_text(screen, font2, 400, 200, "GAME OVER")
# 游戏主进程
if not is_fail:
enlarge = snack.eat_food(food)
text = u"score: {}  Python爬虫".format(score)
print_text(screen, font, 0, 0, text)
food.update(screen, enlarge, snack)
snack.move(enlarge)
is_fail = game_over(snack=snack)
snack.draw(screen)
# 游戏刷新
pygame.display.update()
time.sleep(0.1)```

------------------- End -------------------

0 条评论

• ### Python开发GUI实战：图片转换素描画工具！

今天被这句话触动了，所以开篇分享给大家。鸡汤有毒，但有时大家却靠它激励自己继续前行！

• ### 手把手用Python教你如何发现隐藏wifi

细心的小伙伴可能知道，小编之前发布过一篇使用Python发现酒店隐藏的针孔摄像头，没有来得及上车的小伙伴也没关系，可以戳这篇文章了解一下：使用Pyhton带你...

• ### 手把手教你使用Python打造一个智能搜索淘宝商品，生成操作日志的系统

随着网购的兴起，使得很多传统店铺转型做线上生意，电子商务的产生极大便利了我们的生活。

• ### 如何选择性价比高的相位噪声测试仪

假如一个时钟信号的一次谐波可以用一个正弦波来表示，如果某一刻发生变化时，则原本规则的周期正弦信号在变化的过程中将会出现拐点，这时频谱也将跟着会有相应的变化，而是...

• ### 【编程基础第四讲】遇到编译错误怎么办？

存在问题： 现在刚入门的小伙伴，在编译初级的代码一遇到错误就显得不知所措，那么怎么办? 解决方案： 编程的新手，包括刚毕业工作的同学在解决编译错误时有时候不知...

• ### web自动化|pyppeteer的使用-python版本puppeteer

pyppeteer：puppeteer的非官方python库.支持python3.5|3.6|3.7

• ### Dart 语言异步编程之Isolate

之前的文章已经说过，将非常耗时的任务添加到事件队列后，仍然会拖慢整个事件循环的处理，甚至是阻塞。可见基于事件循环的异步模型仍然是有很大缺点的，这时候我们就需要I...

• ### 《快学BigData》--Hadoop总结（H）（41）

Hadoop总结 - - - - - - - - - - - - - - - - - - - - - - - - - - - - 210

• ### 干货 | 完全图解RNN、RNN变体、Seq2Seq、Attention机制

AI科技评论按：本文作者何之源，原文载于知乎专栏AI Insight，AI科技评论获其授权发布。 本文主要是利用图片的形式，详细地介绍了经典的RNN、RNN几个...

• ### [深度学习概念]·完全图解RNN、RNN变体、Seq2Seq、Attention机制

看到一篇讲的很透彻的文章，来自何之源大牛。划线部分是自己的一下理解和补充，供大家参考。。