用Python的Pygame做一个简易贪吃蛇(版本:3.10.5)

以前微信小游戏上看到贪吃蛇总想玩一下

但是登进去

好像是几年前吧还是多久

以前我没用微信小游戏

所以不知道多久有的

在座的各位有相同的经历的举手

所以这期

制作《贪吃蛇》游戏!但简易版

首先先想一下

策略

移动

贪吃蛇的移动该怎么完成?

可以在前方放置方块,如果吃到食物,啥事都没有;没有吃到食物,将最后一节删去

结束条件

非常简单 碰到边缘或吃到尾巴(我想没人能吃到身体部分吧)

作者:

为了防止有些玩家和我一样点错导致游戏中的贪吃蛇吃到身体所以采取一些措施

如果贪吃蛇身体向右,按左键则没有反应

以此类推(作者太懒了,不想继续列举了)

顺便提一句

pygame的原点(0,0)是在左上角

写代码(因为思维导图应该人人都会吧)

首先先导入库

import pygame
import random #放置食物时需要随机放置,要用random库产生随机数

 然后初始化

pygame.init()

WIDTH,HEIGHT = 640,480
GRID_SIZE = 20
GRID_WIDTH = WIDTH // GRID_SIZE
GRID_HEIGHT = HEIGHT // GRID_SIZE

BLACK = (0,0,0) #BG
WHITE = (255,255,255) #FOOD
GREEN = (0,255,0) #SNAKE

#初始化窗口 之前有篇文章写错了 深表歉意
screen = pygame.display.set_mode((WIDTH,HEIGHT))
pygame.display.set_caption('The_Snake') #窗口名称

snake = [(GRID_WIDTH // 2,GRID_HEIGHT // 2)]
food = (random.randint(0,GRID_WIDTH-1),random.randint(0,GRID_HEIGHT-1))
d = (1,0) #初始向右移动

然后进入主循环部分

先来分析一下Python里的循环的特点

for循环

执行固定次数

while循环

条件成立执行

相同点

可以遍历等操作

那么根据此游戏的特点:知道玩家死亡才退出或点击窗口的【关闭】按钮

所以选择while循环

条件可以用一个布尔值的变量 running

running = True

主循环

while running:
    pass

这个pass待会要写代码

接下来就要获取pygame的控制返回值

用pygame.event.get()来获取

但是这个pygame.event.get()的值需要用for循环遍历

别问我为什么

(因为我也没搞懂)

之后,通过多个if语句判断pygame.event.get()的值,来执行玩家的命令

for i in pygame.event.get():
        if i.type == pygame.QUIT:
            running = False #跳出循环
        elif i.type == pygame.KEYDOWN: #如果时按下键
            if i.key == pygame.K_UP and d !=(0,1):
                d = (0,-1)
            elif i.key == pygame.K_DOWN and d !=(0,-1):
                d = (0,1)
            elif i.key == pygame.K_LEFT and d !=(1,0):
                d = (-1,0)
            elif i.key == pygame.K_RIGHT and d !=(-1,0):
                d = (1,0)
    new_head = (snake[0][0] + d[0],snake[0][1] + d[1]) #新的头的坐标

    snake.insert(0,new_head) #在列表中插入新的头的坐标


    if snake[0] == food:
        food = (random.randint(0,GRID_WIDTH - 1),random.randint(0,GRID_HEIGHT - 1))
    else:
        snake.pop() #删除最后一个元素

    if(
        snake[0][0] < 0 #头撞左墙
        or snake[0][0] >= GRID_WIDTH #头撞右墙
        or snake[0][1] < 0 #头撞上墙
        or snake[0][1] >= GRID_HEIGHT
        or len(snake) != len(set(snake))
):
        running = False

    screen.fill(BLACK)
    for j in snake:
        pygame.draw.rect(screen,GREEN,(j[0] * GRID_SIZE,j[1]*GRID_SIZE,GRID_SIZE,GRID_SIZE))
    pygame.draw.rect(screen,WHITE,(food[0] * GRID_SIZE,food[1] * GRID_SIZE,GRID_SIZE,GRID_SIZE))
    pygame.display.flip()

    pygame.time.delay(100) #屏幕延迟

或者是用 clock.tick(60) 代替

这段代码是让游戏以60帧的速度运行

最后就是退出窗口

pygame.quit()

整个贪吃蛇游戏就做好了

如果不想看见那绿色的贪吃蛇的话

就可以把蛇的那行代码

GREEN = (0,255,0) #SNAKE

给替换成自己的素材

GREEN = pygame.image.load('C:\\Users\xxx\Picture\snake.png')

但由于版本不同,所以我不知道其他版本行不行

代码

import pygame
import random

pygame.init()

WIDTH,HEIGHT = 640,480
GRID_SIZE = 20
GRID_WIDTH = WIDTH // GRID_SIZE
GRID_HEIGHT = HEIGHT // GRID_SIZE

BLACK = (0,0,0) #BG
WHITE = (255,255,255) #FOOD
GREEN = (0,255,0) #SNAKE

#初始化窗口
screen = pygame.display.set_mode((WIDTH,HEIGHT))
pygame.display.set_caption('The_Snake')

snake = [(GRID_WIDTH // 2,GRID_HEIGHT // 2)]
food = (random.randint(0,GRID_WIDTH-1),random.randint(0,GRID_HEIGHT-1))
d = (1,0) #初始向右移动

running = True
while running:
    for i in pygame.event.get():
        if i.type == pygame.QUIT:
            running = False
        elif i.type == pygame.KEYDOWN:
            if i.key == pygame.K_UP and d !=(0,1):
                d = (0,-1)
            elif i.key == pygame.K_DOWN and d !=(0,-1):
                d = (0,1)
            elif i.key == pygame.K_LEFT and d !=(1,0):
                d = (-1,0)
            elif i.key == pygame.K_RIGHT and d !=(-1,0):
                d = (1,0)
    new_head = (snake[0][0] + d[0],snake[0][1] + d[1])

    snake.insert(0,new_head)


    if snake[0] == food:
        food = (random.randint(0,GRID_WIDTH - 1),random.randint(0,GRID_HEIGHT - 1))
    else:
        snake.pop()

    if(
        snake[0][0] < 0 #头撞左墙
        or snake[0][0] >= GRID_WIDTH #头撞右墙
        or snake[0][1] < 0 #头撞上墙
        or snake[0][1] >= GRID_HEIGHT
        or len(snake) != len(set(snake))
):
        running = False

    screen.fill(BLACK)
    for j in snake:
        pygame.draw.rect(screen,GREEN,(j[0] * GRID_SIZE,j[1]*GRID_SIZE,GRID_SIZE,GRID_SIZE))
    pygame.draw.rect(screen,WHITE,(food[0] * GRID_SIZE,food[1] * GRID_SIZE,GRID_SIZE,GRID_SIZE))
    pygame.display.flip()

    pygame.time.delay(100)

        

pygame.quit()

挑战

改编此代码,加入第二个玩家

*此挑战不提供标准答案

如果点赞量过100,就发个私信提醒我,记得截屏

(因为我记性不好)

我会提供我自己的代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值