噢!我变长了!
今天,我来分享贪吃蛇的代码。我多加了一些效果,可能和原版不一样。
知识点
写代码,肯定要一些知识点吧,但知识点太多了,所以只将一部分,剩下的可以看我之前写的文章或自己查。虽然我之前只写过一篇关于pygam的,可能没啥用。
判断
以下题目可能不能理解,会逐一解释
按钮判断
按钮判断指的是能判断鼠标是否按下屏幕中的按钮
pygame.draw.rect(self.playSurface, [255, 255, 255], [20, 350, 150, 75]) #画一个矩形,参数:屏幕变量,颜色,坐标与大小。
举个例子,上面是画出来的按钮,坐标范围:x: 20 ~ 170 (20 + 150), y: 350 ~ 425 (350 + 75)。
当然,鼠标移动或点击都属于事件,所以判断语句要写在
for event in pygame.event.get(): #遍历所有事件的列表,用 pygame.event模块。
里面。
if event.type == MOUSEBUTTONDOWN: #判断事件类型是否是鼠标是否被点击。
x, y = pygame.mouse.get_pos() #获取鼠标的坐标。
if 20 < x < 170 and 350 < y < 425: #判断鼠标坐标是否在按钮范围内。
print("click")
按键判断
按键判断指的是能判断键盘按键是否被按下
举个例子,按下左箭头或a键输出 “left”。
按键也属于事件,所以判断语句也要写在
for event in pygame.event.get(): #遍历所有事件的列表,用 pygame.event模块。
里面。
if event.type == KEYDOWN: #判断事件类型是否是按下键盘。
if event.key == K_LEFT or event.key == K_a: 判断按下的键是否为右箭头或a键。
print("left")
添加
以下部分皆可按字面意思理解
文字添加
基本格式:
font = pygame.font.Font(type, size) #设置文字字体、大小。
font = font.render(txt, True, color) #提供要写的文字,是否抗锯齿边与颜色。
screen.blit(font, rect)#写在屏幕上
图片添加
基本格式:
bg = pygame.image.load('background.jpg') #提供路径。
screen.blit(bg, rect) #画在屏幕上。
音乐添加
基本格式:
self.m = pygame.mixer.music
self.m.load("glasses.wav") #填写路径
self.m.play() #播放
源代码
import pygame, sys
from pygame.locals import *
import random
class Snake():
def __init__(self):
"""初始化方法"""
pygame.init()
self.playSurface = pygame.display.set_mode((640, 480)) # 设置界面
pygame.display.set_caption("贪吃蛇游戏") # 设置标题
self.redColor = pygame.Color(255, 0, 0) # 红色 方块
self.blackColor = pygame.Color(0, 0, 0) # 背景颜色
self.whiteColor = pygame.Color(255, 255, 255) # 蛇本体颜色
self.greyColor = pygame.Color(100, 100, 100)
self.snakeSegments = [[100, 100], [80, 100], [60, 100]] # 蛇身体
self.snakePosition = [100, 100]
self.foodPosition = [300, 300] # 食物坐标 食物是 20*20 小方块
self.direction = "right"
self.FPS = pygame.time.Clock()
self.changedirection = "right"
self.score = 0
self.speed = 2
def main(self):
"""主程序"""
while True:
for event in pygame.event.get():
if event.type == QUIT: # 退出
sys.exit()
if event.type == KEYDOWN:
if event.key == K_DOWN or event.key == K_s:
self.changedirection = "down"
elif event.key == K_UP or event.key == K_w:
self.changedirection = "up"
elif event.key == K_RIGHT or event.key == K_d:
self.changedirection = "right"
elif event.key == K_LEFT or event.key == K_a:
self.changedirection = "left"
self.playSurface.fill(self.blackColor) # 界面刷新
self.writeFont("STXINGKA.TTF", 25, "分数:" + str(self.score), self.greyColor, 0, 0)
if self.changedirection == "right" and self.direction != "left" :
self.direction = "right"
if self.changedirection == "left" and self.direction != "right" :
self.direction = "left"
if self.changedirection == "up" and self.direction != "down" :
self.direction = "up"
if self.changedirection == "down" and self.direction != "up" :
self.direction = "down"
if self.direction == "right" :
self.snakePosition[0] += 20
if self.direction == "left" :
self.snakePosition[0] -= 20
if self.direction == "up" :
self.snakePosition[1] -= 20
if self.direction == "down" :
self.snakePosition[1] += 20
self.snakeSegments.insert(0, list(self.snakePosition))
if self.snakePosition != self.foodPosition :
self.snakeSegments.pop()
else:
self.foodPosition = [random.randint(0,31) * 20, random.randint(0,23) * 20]
self.score += 5
self.speed += 2
if self.snakePosition[0] < 0 or self.snakePosition[1] < 0 or self.snakePosition[0] > 620 or self.snakePosition[1] > 460:
self.gameOver()
if self.snakePosition in self.snakeSegments[1:]:
self.gameOver()
for position in self.snakeSegments: # 从身体列表里找出身体的小坐标
# 矩形对象设置位置 界面,颜色,(x,y,w,h)
pygame.draw.rect(self.playSurface, self.whiteColor, Rect(position[0], position[1], 20, 20))
pygame.draw.rect(self.playSurface, self.redColor, Rect(self.foodPosition[0], self.foodPosition[1], 20, 20)) # 界面添加 食物
self.FPS.tick(self.speed)
pygame.display.update() # 刷新
def writeFont(self, type, size, txt, color, x, y):
font = pygame.font.Font(type, size)
font = font.render(txt, True, color)
rect = font.get_rect()
rect.x, rect.y = x, y
self.playSurface.blit(font, rect)
def gameOver(self):
self.wscore()
self.writeFont("STXINGKA.TTF", 40, "游戏结束,你的分数最终为:" + str(self.score), self.whiteColor, 30, 100)
with open("hero.txt", "r", encoding="utf-8") as f:
self.hero = list(map(int, f.readlines()))
self.hero.sort(reverse = True)
self.writeFont("STXINGKA.TTF", 20, "排行榜", self.whiteColor, 250, 150)
self.y = 180
self.index = 1
for x in self.hero:
self.writeFont("STXINGKA.TTF", 20, "第%d名:%d分" %(self.index ,x), self.whiteColor, 230, self.y)
self.y += 30
self.index += 1
if self.index == 11:
break
while True:
for event in pygame.event.get():
if event.type == QUIT: # 退出
sys.exit()
if event.type == MOUSEBUTTONDOWN:
x, y = pygame.mouse.get_pos()
if 20 < x < 170 and 350 < y < 425:
game = Snake()
game.main()
if 420 < x < 570 and 350 < y < 425:
sys.exit()
pygame.draw.rect(self.playSurface, self.whiteColor, [20, 350, 150, 75])
self.writeFont("STXINGKA.TTF", 30, "再来一次", self.redColor, 20, 350)
pygame.draw.rect(self.playSurface, self.whiteColor, [420, 350, 150, 75])
self.writeFont("STXINGKA.TTF", 30, "退出游戏", self.redColor, 420, 350)
pygame.display.update()
def wscore(self):
with open("hero.txt", "a", encoding="utf-8") as f:
f.write(str(self.score)+"\n")
if __name__ == '__main__':
game = Snake()
game.main()