以前微信小游戏上看到贪吃蛇总想玩一下
但是登进去
好像是几年前吧还是多久
以前我没用微信小游戏
所以不知道多久有的
在座的各位有相同的经历的举手
所以这期
制作《贪吃蛇》游戏!但简易版
首先先想一下
策略
移动
贪吃蛇的移动该怎么完成?
可以在前方放置方块,如果吃到食物,啥事都没有;没有吃到食物,将最后一节删去
结束条件
非常简单 碰到边缘或吃到尾巴(我想没人能吃到身体部分吧)
作者:
为了防止有些玩家和我一样点错导致游戏中的贪吃蛇吃到身体所以采取一些措施
如果贪吃蛇身体向右,按左键则没有反应
以此类推(作者太懒了,不想继续列举了)
顺便提一句
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,就发个私信提醒我,记得截屏
(因为我记性不好)
我会提供我自己的代码