基于Pygame实现简单的贪吃蛇游戏
作者:我的天才女友 发布时间:2022-05-14 17:43:10
标签:Pygame,贪吃蛇
导入相关的包
import pygame, sys, random
from pygame.locals import *
设置屏幕大小以及基本参数
设置屏幕大小为400*400,mainClock = pygame.time.Clock()用来设置时间同步,不会根据计算机的运行来决定运行多少次, mainClock.tick(1) 一秒只会运行一次,设置了屏幕的底色为白色。
# 定义屏幕的宽高
WIDTH = 400
HEIGHT = 400
# 初始化屏幕 设置窗口标题
surface = pygame.display.set_mode((WIDTH, HEIGHT), 0, 32)
pygame.display.set_caption('贪吃蛇')
pygame.init()
mainClock = pygame.time.Clock()
# 定义使用的颜色
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
WHITE = (255, 255, 255)
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
surface.fill(WHITE)
pygame.display.update()
mainClock.tick(1)
设置贪吃蛇的位置,以及移动的大小
这里设置了贪吃蛇的长度和起始位置,和食物和蛇的宽度,这里必须设置为可以被食物和蛇的宽度整除的数,这样才能保证蛇能到任意的位置
# 设置蛇的初始长度
snakeWidth = 4
# 设置蛇的起始位置为(40,40)
snakeX = 40
snakeY = 40
# 食物和蛇的宽度设置为8
FOODSNAKEWIDTH = 8
# 定义四个方向
moveLeft = False
moveRight = False
moveUp = False
moveDown = False
# 定义初始的方向
moveRight = True
def getSnake():
# 设置蛇的初始长度为4,并设置蛇的初始位置为(40,40)
# 因为贪吃蛇会拐弯,所以将蛇设置为一个列表
snake = []
for i in range(snakeWidth):
snake.append(pygame.Rect(snakeX + i * FOODSNAKEWIDTH, snakeY, FOODSNAKEWIDTH, FOODSNAKEWIDTH))
return snake
# 贪吃蛇
snake = getSnake()
绘制蛇
surface.fill(WHITE)
for s in snake:
pygame.draw.rect(surface, BLACK, s)
让蛇动起来
这里将蛇列表最后一位移除,然后将第一位的位置根据方向加减坐标
snake.pop()
newTop = copy.deepcopy(snake[0])
# 改变蛇的位置
if moveRight:
newTop.left += FOODSNAKEWIDTH
if moveLeft:
newTop.left -= FOODSNAKEWIDTH
if moveUp:
newTop.top -= FOODSNAKEWIDTH
if moveDown:
newTop.top += FOODSNAKEWIDTH
snake.insert(0, newTop)
这样会有一个问题,如果超出屏幕呢,我们将超出屏幕,那么就会消失,我们只需要你移动第一个元素的时候,如果超出则将元素移动另一个位置。
# 改变蛇的位置
if moveRight:
if newTop.right == WIDTH:
newTop.left = 0
else:
newTop.left += FOODSNAKEWIDTH
if moveLeft:
if newTop.left == 0:
newTop.right == WIDTH
else:
newTop.left -= FOODSNAKEWIDTH
if moveUp:
if newTop.top == 0:
newTop.bottom = HEIGHT
else:
newTop.top -= FOODSNAKEWIDTH
if moveDown:
if newTop.bottom == HEIGHT:
newTop.top = 0
else:
newTop.top += FOODSNAKEWIDTH
实现贪吃蛇拐弯
为了实现对应的功能,我们将方向变量改为一个变量,这样我们方便修改方向
# 定义四个方向
# moveLeft moveRight moveUp moveDown
# 定义初始的方向
snakeDirection = "moveRight"
----
省略的代码
----
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == KEYDOWN:
if event.key == K_LEFT:
if snakeDirection == "moveRight":
snake.reverse()
snakeDirection = "moveLeft"
if event.key == K_RIGHT:
if snakeDirection == "moveLeft":
snake.reverse()
snakeDirection = "moveRight"
if event.key == K_UP:
if snakeDirection == "moveDown":
snake.reverse()
snakeDirection = "moveUp"
if event.key == K_DOWN:
if snakeDirection == "moveUp":
snake.reverse()
snakeDirection = "moveDown"
为了方便看到效果,我将mainClock.tick(1) 设置为mainClock.tick(3)
实现随机食物
这里用了很啰嗦的代码,我自己也看不下去,有点含糊,这里为了简单只设计了一个食物,遍历屏幕上不是贪吃蛇的可以放食物的集合,然后随机生成一个食物。
if len(foods) < foodnum:
canFoodColl = []
# 获取当前不是贪吃蛇的位置集合
for x in range(sizeNum):
for y in range(sizeNum):
foodExist = True
for sn in snake:
if x * FOODSNAKEWIDTH == sn.left and y * FOODSNAKEWIDTH == sn.top:
foodExist = False
break
if foodExist:
canFoodColl.append({'x': x, 'y': y})
f = canFoodColl[random.randint(0, len(canFoodColl))]
foods.append(pygame.Rect(f['x'], f['y'], FOODSNAKEWIDTH, FOODSNAKEWIDTH))
吃食物
这里用 colliderect判断二者是否相撞,然后食物集合置空,不减去贪吃蛇集合的最后一个元素。
if len(foods) < foodnum:
canFoodColl = []
# 获取当前不是贪吃蛇的位置集合
for x in range(sizeNum):
for y in range(sizeNum):
foodExist = True
for sn in snake:
if x * FOODSNAKEWIDTH == sn.left and y * FOODSNAKEWIDTH == sn.top:
foodExist = False
break
if foodExist:
canFoodColl.append({'x': x, 'y': y})
f = canFoodColl[random.randint(0, len(canFoodColl))]
foods.append(pygame.Rect(f['x'] * FOODSNAKEWIDTH, f['y'] * FOODSNAKEWIDTH, FOODSNAKEWIDTH, FOODSNAKEWIDTH))
print(f['x'])
print(f['y'])
else:
if newTop.colliderect(foods[0]):
foods = []
eatFlg = True
print('xxx')
完整代码
import pygame, sys, random
from pygame.locals import *
import copy
# 定义屏幕的宽高
WIDTH = 400
HEIGHT = 400
# 初始化屏幕 设置窗口标题
surface = pygame.display.set_mode((WIDTH, HEIGHT), 0, 32)
pygame.display.set_caption('贪吃蛇')
pygame.init()
mainClock = pygame.time.Clock()
# 定义使用的颜色
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
WHITE = (255, 255, 255)
# 设置蛇的初始长度
snakeWidth = 4
# 设置蛇的起始位置为(40,40)
snakeX = 40
snakeY = 40
# 食物和蛇的宽度设置为8
FOODSNAKEWIDTH = 8
# 定义四个方向
# moveLeft moveRight moveUp moveDown
# 定义初始的方向
snakeDirection = "moveRight"
# 食物区间
foods = []
# 用去宽度处以对应的 大小,减去1 就是食物矩形起点可以存在的区间
#sizeNum = HEIGHT / FOODSNAKEWIDTH - 1
# 这里为了减少计算
sizeNum = 39
# 为了简单我们只设置一个食物
foodnum = 1
def getSnake():
# 设置蛇的初始长度为4,并设置蛇的初始位置为(40,40)
# 因为贪吃蛇会拐弯,所以将蛇设置为一个列表
snake = []
for i in range(snakeWidth):
snake.append(pygame.Rect(snakeX + i * FOODSNAKEWIDTH, snakeY, FOODSNAKEWIDTH, FOODSNAKEWIDTH))
return snake
# 贪吃蛇
snake = getSnake()
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == KEYDOWN:
if event.key == K_LEFT:
if snakeDirection == "moveRight":
snake.reverse()
snakeDirection = "moveLeft"
if event.key == K_RIGHT:
if snakeDirection == "moveLeft":
snake.reverse()
snakeDirection = "moveRight"
if event.key == K_UP:
if snakeDirection == "moveDown":
snake.reverse()
snakeDirection = "moveUp"
if event.key == K_DOWN:
if snakeDirection == "moveUp":
snake.reverse()
snakeDirection = "moveDown"
surface.fill(WHITE)
for s in snake:
pygame.draw.rect(surface, BLACK, s)
for f in foods:
pygame.draw.rect(surface, GREEN, f)
pygame.display.update()
# 是否吃了食物
eatFlg = False
newTop = copy.deepcopy(snake[0])
# 改变蛇的位置
if snakeDirection == "moveRight":
if newTop.right == WIDTH:
newTop.left = 0
else:
newTop.left += FOODSNAKEWIDTH
if snakeDirection == "moveLeft":
if newTop.left == 0:
newTop.right = WIDTH
else:
newTop.left -= FOODSNAKEWIDTH
if snakeDirection == "moveUp":
if newTop.top == 0:
newTop.bottom = HEIGHT
else:
newTop.top -= FOODSNAKEWIDTH
if snakeDirection == "moveDown":
if newTop.bottom == HEIGHT:
newTop.top = 0
else:
newTop.top += FOODSNAKEWIDTH
if len(foods) < foodnum:
canFoodColl = []
# 获取当前不是贪吃蛇的位置集合
for x in range(sizeNum):
for y in range(sizeNum):
foodExist = True
for sn in snake:
if x * FOODSNAKEWIDTH == sn.left and y * FOODSNAKEWIDTH == sn.top:
foodExist = False
break
if foodExist:
canFoodColl.append({'x': x, 'y': y})
f = canFoodColl[random.randint(0, len(canFoodColl))]
foods.append(pygame.Rect(f['x'] * FOODSNAKEWIDTH, f['y'] * FOODSNAKEWIDTH, FOODSNAKEWIDTH, FOODSNAKEWIDTH))
print(f['x'])
print(f['y'])
else:
if newTop.colliderect(foods[0]):
foods = []
eatFlg = True
print('xxx')
snake.insert(0, newTop)
if not eatFlg:
snake.pop()
mainClock.tick(3)
来源:https://blog.csdn.net/qq_40801987/article/details/121712672


猜你喜欢
- 虽然熟练掌握SQL的人对于Null不会有什么疑问,但总结得很全的文章还是很难找,看到一篇英文版的, 感觉还不错。Tony Hoare 在19
- #!/usr/bin/python # Filename: gen_salt.py impo
- 本文实例为大家分享了java正则表达式工具类的具体代码,供大家参考,具体内容如下import com.google.common.base.
- 在计算机信息技术中,少有象类似 XML 那样的技术,她让人们产生范围很大的联想,而这些联想及其应用又可能相距甚远。她也更多引起人们对 XML
- 1、什么是AspJpeg?AspJpeg是一款功能强大的基于Microsoft IIS环境的图片处理组件,AspJpeg可以使用很少的代码在
- 每个被捕获的参数将被作为纯Python字符串来发送,而不管正则表达式中的格式。 举个例子,在这行URLConf中:(r'^artic
- 学习复杂代码的最好方法是简化:(function(win, undefined) { var jQuery = f
- 内容摘要:MySQL易学易用,附带丰富的技术文档,这两个因素使之被广泛应用。然而,随着MySQL发展加快,即使一个MySQL老手有时也会为该
- Goland是JetBrains公司出品的一款开发Golang的工具。由于本人是JetBrains公司产品的重度使用者,好多都作为主力开发工
- 1.问题描述2.解决方案(1)Dataloader里面不用cv2.imread进行读取图片,用cv2.imread还会带来一系列的不方便,比
- SQL概述SQL背景知识1946 年,世界上第一台电脑诞生,如今,借由这台电脑发展起来的互联网已经自成江湖。在这几十年里,无数的技术、产业在
- 1 简介二进制日志,记录对数据发生或潜在发生更改的SQL语句,并以二进制形式保存在磁盘。2 Binlog 的作用主要作用:复制、恢复和审计。
- 目录安装sakila索引扫描排序表结构可以使用索引扫描来做排序的情况补足前导列order by 中只包含一种排序无法使用索引扫描的情况查询条
- 近期,又有接触到pyecharts这个包的使用,后面发现这个曾经好用的包发生了一些变化,为了方便大家的使用,这里整理如下:绘图风格theme
- 这篇文章主要介绍了Javascript Worker子线程代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价
- 使用实例:object.CreateTextFile(filename[, overwrite[, unicode]])其中object是必
- 实例如下所示:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transition
- Microsoft SQL Server 7.0安全问题Microsoft Corporation【「Microsoft SQL Serve
- 本文将想大家简单介绍一下XML HttpRequst对象基础方法,希望通过本文能够使大家对其有一个初步的了解readyState一共有5个可
- 分享一个以前写的小游戏,纯js游戏,代码很简单。欢迎大家来喷呦!效果图: 代码展示://直接复制到html文件即可 支持IE9+版