用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,就发个私信提醒我,记得截屏

(因为我记性不好)

我会提供我自己的代码

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的贪吃蛇游戏的代码示例: ```python import pygame import random # 定义颜色 WHITE = (255, 255, 255) BLACK = (0, 0, 0) GREEN = (0, 255, 0) RED = (255, 0, 0) # 定义方向 UP = 0 DOWN = 1 LEFT = 2 RIGHT = 3 # 初始化pygame模块 pygame.init() # 设置窗口大小和标题 screen_width = 500 screen_height = 500 screen = pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption("贪吃蛇游戏") # 设置时钟 clock = pygame.time.Clock() # 加载字体 font = pygame.font.SysFont(None, 25) # 定义贪吃蛇类 class Snake: def __init__(self): self.size = 3 # 初始长度 self.direction = RIGHT # 初始方向 self.body = [(100, 100), (90, 100), (80, 100)] # 初始坐标 def move(self): if self.direction == UP: new_head = (self.body[0][0], self.body[0][1] - 10) elif self.direction == DOWN: new_head = (self.body[0][0], self.body[0][1] + 10) elif self.direction == LEFT: new_head = (self.body[0][0] - 10, self.body[0][1]) elif self.direction == RIGHT: new_head = (self.body[0][0] + 10, self.body[0][1]) self.body.insert(0, new_head) if len(self.body) > self.size: self.body.pop() def change_direction(self, direction): if direction == UP and self.direction != DOWN: self.direction = UP elif direction == DOWN and self.direction != UP: self.direction = DOWN elif direction == LEFT and self.direction != RIGHT: self.direction = LEFT elif direction == RIGHT and self.direction != LEFT: self.direction = RIGHT def draw(self): for x, y in self.body: pygame.draw.rect(screen, GREEN, [x, y, 10, 10]) # 定义食物类 class Food: def __init__(self): self.pos = (0, 0) self.color = RED self.randomize_pos() def randomize_pos(self): self.pos = (random.randint(0, screen_width - 10) // 10 * 10, random.randint(0, screen_height - 10) // 10 * 10) def draw(self): pygame.draw.rect(screen, self.color, [self.pos[0], self.pos[1], 10, 10]) # 创建贪吃蛇和食物对象 snake = Snake() food = Food() # 游戏循环 game_over = False while not game_over: # 事件循环 for event in pygame.event.get(): if event.type == pygame.QUIT: game_over = True elif event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: snake.change_direction(UP) elif event.key == pygame.K_DOWN: snake.change_direction(DOWN) elif event.key == pygame.K_LEFT: snake.change_direction(LEFT) elif event.key == pygame.K_RIGHT: snake.change_direction(RIGHT) # 移动贪吃蛇 snake.move() # 判断是否吃到食物 if snake.body[0] == food.pos: snake.size += 1 food.randomize_pos() # 判断是否撞到墙或自己的身体 if snake.body[0][0] < 0 or snake.body[0][0] >= screen_width or \ snake.body[0][1] < 0 or snake.body[0][1] >= screen_height or \ snake.body[0] in snake.body[1:]: game_over = True # 绘制屏幕 screen.fill(BLACK) snake.draw() food.draw() # 绘制分数 score_text = font.render("Score: {}".format(snake.size - 3), True, WHITE) screen.blit(score_text, [10, 10]) # 刷新屏幕 pygame.display.flip() # 控制帧率 clock.tick(10) # 退出游戏 pygame.quit() ``` 这个示例代码使用了pygame模块来实现游戏的绘制和事件处理,同时定义了一个Snake类和一个Food类来管理贪吃蛇和食物的状态。在游戏循环中,每帧都会处理用户输入、移动贪吃蛇、判断是否吃到食物或撞到墙或身体、绘制屏幕和分数等操作。最后,在游戏结束时退出pygame模块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值