python pygame贪吃蛇

噢!我变长了!
今天,我来分享贪吃蛇的代码。我多加了一些效果,可能和原版不一样。

知识点

写代码,肯定要一些知识点吧,但知识点太多了,所以只将一部分,剩下的可以看我之前写的文章或自己查。虽然我之前只写过一篇关于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()

猜你喜欢

转载自blog.csdn.net/weixin_44457827/article/details/128992384