大家好,又见面了,我是你们的朋友全栈君。
文章目录代码
代码语言:
代码运行次数:0
运行
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
author 是 Wangdali,时间是 2021 年 1 月 20 日 16 时 08 分 44 秒。
#python实现:贪吃蛇
- 通过方向键(w、a、s、d)来控制小蛇的走向。
游戏结束的判定策略:超出边界;触碰到自身的身体,也就是蛇前进的下一格子是身体的一部分(即在列表中)。 '''
注:由于在列表中需频繁进行元素的添加和删除操作,所以采用 deque 容器来替代列表;这是因为 deque 在插入和删除操作上具有高效的效率。
#初始化蛇,长度为3,放置在屏幕左上角;
#导包
import random
import sys
import time
import pygame
from pygame.locals import *
from collections import deque
#基础设置
Screen_Height=480
Screen_Width=600
Size=20#小方格大小
Line_Width=1
#游戏区域的坐标范围
Area_x 的范围是从 0 到 Screen_Width 除以 Size 再减 1。其中 0 是左边界,1 是右边界。需要注意的是,在 Python 中,// 表示整数除法,/ 表示浮点数除法。
Area_y 等于 2 以及 Screen_Height 除以 Size 再减 1 的结果
#食物的初步设置
#食物的分值+颜色
还有一项是(30,(100,100,255))。
#整体颜色设置
Light=(100,100,100)
Dark=(200,200,200)
Black=(0,0,0)
Red=(200,30,30)
Back_Ground=(40,40,60)
#文本输出格式设置
在屏幕上绘制文本。使用指定的字体。设置文本的位置为 x 坐标和 y 坐标。显示指定的文本内容。可以指定文本的颜色,默认为白色(255,255,255)。
.font.render 的参数意义为:.render 包含内容、是否抗锯齿、字体颜色以及字体背景颜色这些方面
字体通过 render 方法来呈现文本,并且是以 True 的模式以及特定的 fcolor 颜色来进行呈现的。
screen.blit(Text,(x,y))
#初始化蛇
def init_snake():
snake=deque()
snake.append((2,Area_y[0]))
snake.append((1,Area_y[0]))
snake.append((0,Area_y[0]))
return snake
#食物设置
#注意需要对食物出现在蛇身上的情况进行判断
def Creat_Food(snake):
注:randint 所产生的随机数区间是包含左右极限的,即左右均为闭区间的[1, n],这样是可以取到 1 和 n 的。而 randrange 产生的随机数区间只包含左极限,也就是左闭右开的[1, n),其中 1 可以取到,但是 n 取不到。randint 产生的随机数处于指定的某个区间内,是一个特定的值。randrange 产生的随机数能够设定步长,即一个间隔。
food_x 等于在 Area_x 的第一个值到第二个值之间随机生成的一个整数。这里存在疑问。
food_y 被设置为在 Area_y 的第一个值和第二个值之间随机生成的一个整数。
#如果食物出现在蛇上,重来;
while(food_x,food_y)in snake:
food_x 等于在 Area_x 的第一个值和第二个值之间随机生成的一个整数。
food_y 等于从 Area_y 的第一行和第二行中随机选取一个整数
return food_x,food_y
#食物风格

def Food_Style():
从 Food_Style_List 中随机选取一个整数,范围在 0 到 2 之间,然后返回对应的分值和颜色。
def main():
pygame.init()
初始化一个准备显示的窗口或屏幕,通过 pygame.display.set_mode((Screen_Width,Screen_Height)) 来实现,将其赋值给 screen 变量。
它将窗口的标题设置为 '贪吃蛇'
#得分字体设置
使用 pygame 库的 SysFont 函数创建字体对象,字体名称为'SimHei',字号为 24,将其赋值给 font1 变量。
#GO字体设置
使用 pygame 库的 SysFont 函数创建一个字体对象,字体名称为 None,字体大小为 72,将创建的字体对象赋值给变量 font2 。
fwidth 为字体 font2 显示字符串 'GAME OVER' 的宽度,fheight 为字体 font2 显示字符串 'GAME OVER' 的高度。
然后直接 GameOver 。
# b变量为了防止这个情况发生
b=True
#蛇
snake=init_snake()
#食物
food=Creat_Food(snake)
food_style=Food_Style()
#方向控制
pos=(1,0) ###
#启动游戏相关变量初始化
game_over 的值为 True ,这是结束标志 。只有当 start 的值为 True 且 game_over 的值也为 True 时,才会显示 GAME OVER 。
game_start=False #开始标志
score=0 #得分
orispeed=0.3 #蛇初始速度
speed=orispeed #蛇速度
last_move_time=None
pause=False #暂停
while True:
对于每一个事件:
if event.type==QUIT:
sys.exit()
elif event.type==KEYDOWN:
if event.key==K_RETURN:
if game_over:
game_start=True
game_over=False
b=True
snake=init_snake()
food=Creat_Food(snake)
food_style=Food_Style()
pos=(1,0)
#得分
score=0
last_move_time=time.time()
elif event.key==K_SPACE:
if not game_over:
pause=not pause
#以下为防止蛇在向右移动时按向左键,导致GameOver
elif event.key in (K_UP,K_w):
if b and not pos[1]: ###
pos=(0,-1)
b=False
假如事件的键处于(按下向下键、按下 s 键)的情况;
if b and not pos[1]:
pos = (0, 1)
b = False
如果事件的键在(左箭头键、A 键)中
if b and not pos[0]:
pos = (-1, 0)
b = False
如果事件的键在 (K_RIGHT 或者 K_d) 之中

if b and not pos[0]:
pos = (1, 0)
b = False
#填充背景色
screen.fill(Back_Ground)
###
#画网格线、竖线
对于 x 而言,x 从 Size 开始,以 Size 为步长,一直到 Screen_Width 为止。
直线的宽度是 Line_Width。
#画网格线、横线
对于 y 而言,其取值范围是从 Area_y[0] 乘以 Size 开始,以 Size 为步长,一直到 Screen_Height 结束。
在屏幕上绘制一条直线,颜色为黑色,起始点坐标为(0, y),终点坐标为(Screen_Width, y),线宽为 Line_Width 。
#蛇的爬行过程
if not game_over:
curTime=time.time()
如果当前时间减去上次移动时间大于速度,那么就执行相应的操作。
if not pause:
b=True
last_move_time=curTime
next_s 的值为 snake 数组中第一个元素的第一个坐标值加上 pos 数组的第一个坐标值,以及 snake 数组中第一个元素的第二个坐标值加上 pos 数组的第二个坐标值
#如果吃到了食物
if next_s==food:
snake.appendleft(next_s)
score+=food_style[0]
速度等于原始速度减去 0.03 乘以(得分除以 100 的结果)
food = Creat_Food(snake)
food_style = Food_Style()
else:
#在区域内
if Area_x[0]<=next_s[0]<=Area_x[1] and Area_y[0]<=next_s[1]<=Area_y[1] and next_s not in snake:
snake.appendleft(next_s)
snake.pop()
else :
game_over=True
#画食物
if not game_over:
''' rect(Surface,color,Rect,width=0) 第一个参数指定矩形绘制到哪个Surface对象上 第二个参数指定颜色 第三个参数指定矩形的范围(left,top,width,height) 第四个参数指定矩形边框的大小(0表示填充矩形) 例如绘制三个矩形: pygame.draw.rect(screen, BLACK, (50, 50, 150, 50), 0) pygame.draw.rect(screen, BLACK, (250, 50, 150, 50), 1) pygame.draw.rect(screen, BLACK, (450, 50, 150, 50), 10) '''
# 避免 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_Txt(screen, font1, 30, 7, f'速度: {score // 100}')
Print_Txt(screen, font1, 450, 7, f'得分: {score}')
#画GameOver
if game_over:
if game_start:
#print('GameOver')
Print_Txt(screen, font2, (Screen_Width - fwidth) // 2, (Screen_Height - fheight) // 2, 'GAME OVER',Red)
pygame.display.update()
if __name__=='__main__':
main()
运行截图
笔记补充
蛇的移动首先要依据方向来进行判断。这里用 pos 变量来记录方向,比如 pos(1, 0)表示当前蛇向右的方向,pos(-1, 0)表示当前蛇向左的方向,pos(0, 1)表示当前蛇向下的方向,pos(0, -1)表示当前蛇向上的方向。怎么控制蛇的速度呢?其实是通过控制时间来实现刷新。我们知晓所有的动作都是在一个循环当中完成的,也就是说代码始终在持续运行着。
如果我将速度设置为 1,这意味着每秒会进行一次刷新。在这种情况下,蛇的移动速度就是每秒一次,而我们所看到的蛇的移动也是每秒一格。
当我们将速度设置为 0.5 时,意味着每 0.5 秒刷新一次。这样我们就能看到每 0.5 秒移动一格,从而感觉速度相对变快了。
参考博客(阿里嘎多!)
1、2、
工作时间:8:00-18:00
电子邮件
扫码二维码
获取最新动态