猫史档案馆


【Python作品分享】贪吃蛇函数【教程贴】

用户:Dao3的C6H8O7Dao3的C6H8O7查看:0 回复:0 评论:0 创建时间:2022-08-20T09:23:12


【作品展示】

center_image

 

【作品介绍】

这是其中之一(三个文件,这个文件命名为"clas.py",三个文件放一起)

 

【作品源代码】

import pygame
import pygame,sys,os
import time as tttttttt
from pygame.locals import *
from sys import exit
from random import *
import pygame_input
# print(pygame.font.get_fonts())
pygame.font.init()
my_font = pygame.font.Font('C:/Windows/Fonts/simhei.ttf',50)
font = pygame.font.Font('C:/Windows/Fonts/simhei.ttf',20)
class food(pygame.sprite.Sprite):
    """
    蛇吃的东西
    """
    group = pygame.sprite.Group()
    screenBlankGrid = [(x*50,y*50) for x in range(0,18) for y in range(0,12)]
    def __init__(self,snake_line=[]):
        pygame.sprite.Sprite.__init__(self)
        blank = list(filter(lambda x: x not in snake_line,food.screenBlankGrid))
        # x = randint(0,750/50)*50
        # y = randint(0,550/50)*50
        xy = choice(blank)
        food.screenBlankGrid.remove(xy)

        self.rect=Rect(xy[0],xy[1],50,50)
        self.image = pygame.image.load('food.bmp') 
        food.group.add(self)



class snake(pygame.sprite.Sprite):
    snake_start = pygame.image.load('蛇头.bmp')
    snake_nstart = pygame.image.load('蛇身.bmp')
    def __init__(self,screen):
        pygame.sprite.Sprite.__init__(self)
        self.snakeLine = [(400,300),(450,300),(500,300)]
        self.screen = screen
        self.rect = Rect(400,300,50,50)
        self.longer = 0
        self.die=False
        
    def show(self,newSnakeLine = None):

        if(newSnakeLine is not None):
            self.snakeLine = newSnakeLine
            self.rect = Rect(self.snakeLine[0],(50,50))
        degs = {K_UP:-90,K_DOWN:90,K_LEFT:0,K_RIGHT:180}
        deg = degs[self.getDirection()]
        self.screen.blit(pygame.transform.rotate(snake.snake_start,deg),self.snakeLine[0])
        for cord in self.snakeLine[1:]:
            self.screen.blit(snake.snake_nstart,cord)
    def getDirection(self):
        offx = self.snakeLine[0][0] - self.snakeLine[1][0]
        offy = self.snakeLine[0][1] - self.snakeLine[1][1]
        if((offx==50 or offx==-850) and offy==0):
            return K_RIGHT
        elif((offx==-50 or offx==850) and offy==0):
            return K_LEFT
        elif((offy==50 or offy==-550) and offx==0):
            return K_DOWN
        elif((offy==-50 or offy==550) and offx==0):
            return K_UP
        
    def enlange(self):
        add_offset = {K_LEFT:(-50,0),K_RIGHT:(50,0),K_UP:(0,-50),K_DOWN:(0,50)}
        offset = add_offset[self.getDirection()]
        self.snakeLine.insert(0, 
        (offset[0]+self.snakeLine[0][0], 
         offset[1]+self.snakeLine[0][1]))
    def move(self,KEY=None):
        wrong_list = [{K_RIGHT,K_RIGHT},{K_RIGHT,K_LEFT},{K_LEFT,K_LEFT},
        {K_UP,K_UP},{K_UP,K_DOWN},{K_DOWN,K_DOWN}]
        if(len(set(self.snakeLine)) < len(self.snakeLine)):
            self.die = True
            return
        if KEY == None or {self.getDirection(),KEY} in wrong_list or KEY not in [K_UP,K_DOWN,K_LEFT,K_RIGHT]:
            KEY = self.getDirection()
        if KEY == K_RIGHT:
            self.snakeLine = [((self.snakeLine[0][0] + 50)%900,self.snakeLine[0][1])] + self.snakeLine[0:-1]
        elif KEY == K_LEFT:
            self.snakeLine = [((self.snakeLine[0][0] - 50)%900,self.snakeLine[0][1])] + self.snakeLine[0:-1]
        elif KEY == K_UP:
            self.snakeLine = [(self.snakeLine[0][0], 
            (self.snakeLine[0][1] - 50) % 600)] + self.snakeLine[0:-1]
        elif KEY == K_DOWN:
            self.snakeLine = [(self.snakeLine[0][0], 
            (self.snakeLine[0][1] + 50) % 600)] + self.snakeLine[0:-1]
        self.show()
        
# main
pygame.init()
pygame.mixer.init()
pygame.mixer.music.load('start_.wav')
pygame.mixer.music.play(loops=-1)
screen = pygame.display.set_mode((900,600))
# snake_start = pygame.image.load('蛇头.bmp')
# snake_nstart = pygame.image.load('蛇身.bmp')
# end_image = pygame.image.load("E:\潘梓豪\PythonDemo\新建文件夹\贪吃蛇\结束.png")
print(K_p)
def input_name(screen):
    text_input = pygame_input.TextInputVisualizer()
    text_input.font_color = (255,0,0)
    text_input.font_size = 30
    clock = pygame.time.Clock()
    old_screen = screen.copy()
    while True:
        events = pygame.event.get()
        for e in events:
            if e.type == pygame.QUIT:
                exit()
            # print(e.key % 100)
            if e.type == KEYUP and e.key>10000 and e.key % 100 == 12:
                return text_input.value
        if text_input.update(events):
            pass
        
        # print(text_input.update(events))
        screen.blit(old_screen,(0,0))
        screen.blit(font.render('恭喜,你成为了前十名之一', 1, (255,0,0)), (150,500))
        screen.blit(font.render('请输入你的名字:', 1, (255,0,0)), (150,530))
        screen.blit(text_input.surface, (450,50))
        pygame.display.update()
        clock.tick(15)

        
def high_top10(screen,score):
    open('snake_top10.txt','a').close()
    top10=[]
    total = score[0]+score[1]
    with open('snake_top10.txt','r+') as f:
        for line in f.readlines():
            top10.append((line[:20],int(line[20:])))
        if len(top10)<10 or total > top10[-1][1]:
            top10.insert(0,(('%-20s'%input_name(screen))[0:20], total))
            top10.sort(key = lambda x:x[1],reverse = True)
        if(len(top10) > 10):
            top10 = top10[0:10]
        f.seek(0)
        content = '\n'.join([x[0]+str(x[1]) for x in top10])
        f.write(content)

    return top10


def show_top10(screen, score):
    old_screen = screen.copy()
    top10_bg = pygame.Surface((900,600),SRCALPHA)
    top10_bg.fill(Color(0,0,0,50),None)
    top10_bg.blit(font.render('TOP 10 HEROS',1,Color(255,255,255)),(300,20))
    for (i,textLine) in enumerate(high_top10(screen, score)):
        top10_bg.blit(font.render(f'{i+1}.'+textLine[0][0:-2],1,Color(255,255,255)),(180,120 + i*30))
        top10_bg.blit(font.render(str(textLine[1]),1,Color(255,255,255)),(600,120 + i*30))
    y=600
    clock = pygame.time.Clock()
    while True:
        clock.tick(30)
        for e in pygame.event.get():
            if e.type == QUIT:
                exit()
            elif e.type == KEYUP and y<=0:
                return
        screen.blit(top10_bg,(0,y))
        pygame.display.update()
        y-=20
        if(y<=0):
            y=0
def equ(a,b):
    return a.left==b.left and a.top==b.top
def show_end(sn, score):
    old_screen = sn.copy()
    end_clock = pygame.time.Clock()
    end_image = pygame.image.load('结束.png')
    rations = end_image.get_rect().width/end_image.get_rect().height
    newWidth = 200
    old_ticks = pygame.time.get_ticks()
    while(newWidth <= 500):
        end_clock.tick(20)
        ticks = pygame.time.get_ticks()-old_ticks
        for e in pygame.event.get():
            if e.type == QUIT:
                pygame.quit()
                exit()
        newWidth += int(ticks/1000*20)
        really_end_image = pygame.transform.喵oothscale(end_image,(newWidth,int(newWidth/rations)))
        x,y = int((900-really_end_image.get_rect().width) / 2),int((350-really_end_image.get_rect().height) / 2)
        pygame.display.update()
        screen.blit(old_screen,(0,0))
        
        screen.blit(really_end_image,(x,y))
        # pygame.display.update()
    pygame.draw.rect(screen, (152,204,51), (150,350,500,200),0)
    text = my_font.render(f"FoodScore:{score[0]}",True,(255,0,0),(152,204,51))
    tex1 = my_font.render(f"TimeScore:{score[1]}",True,(255,0,0),(152,204,51))
    total = my_font.render(f"T o t a l:{score[1]+score[0]}",True,(255,0,0),(152,204,51))
    #获得显示对象的 rect区域大小
    textRect =text.get_rect() 
    textRect1 =tex1.get_rect() 
    totalRect = total.get_rect()
    #设置显示对象居中
    textRect.left   = 150
    textRect.top    = 350
    textRect1.left  = 150
    textRect1.top   = 400
    totalRect.left  = 150
    totalRect.top  = 450
    screen.blit(text,textRect)
    screen.blit(tex1,textRect1)
    screen.blit(total,totalRect)
    pygame.display.update()
    tttttttt.sleep(5)
    return






def start():

    background = pygame.image.load('backs.bmp')
    size = [100, 100]
    
    while True:
        screen.blit(background,[0,0])
        pygame.display.update()
        event = pygame.event.wait()
        if event.type == QUIT:
            pygame.quit()
            exit()
        elif event.type == KEYDOWN:
            pygame.mixer.music.stop()
            return

    




def main_loop():
    pygame.mixer.music.load('in_game.wav')
    pygame.mixer.music.play(loops=-1)
    # screen = pygame.display.set_mode((900,600))
    hpos=[600,400]
    food_score,time_score = 0,0
    sna = snake(screen)
    sna.show()
    bg = pygame.image.load('bgg.bmp')
    clock = pygame.time.Clock()
    k=None
    level = 1
    while True:
        clock.tick(4)

        
        pygame.display.update()
        for e in pygame.event.get():
            if e.type == QUIT:
                pygame.quit()
                exit()
            elif(e.type == KEYUP):
                k=e.key
        screen.blit(bg,(0,0))
        sna.move(k)
        time_score = int(pygame.time.get_ticks()/1000+0.5)# 四舍五入求得分
        # sna,food.group.sprites() food.group.sprites(),sna
        for a in food.group.sprites():
            if(equ(a.rect,Rect(sna.snakeLine[0],(50,50)))):
                level+=0.4
                a.喵()
                sna.longer += 1
                food_score+=10
        while len(food.group.sprites()) < level:
            food(sna.snakeLine)
        food.group.draw(screen)
        while sna.longer > 0:
            sna.enlange()
            sna.longer -= 1
        if sna.die:
            break
    return (food_score,time_score)

 

【提示】

部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:

https://python.codemao.cn


回复

上一页1 页 / 共 0下一页