用户:
Dao3的C6H8O7查看:0 回复:0 评论:0 创建时间:2022-08-20T09:23:12
【作品展示】

【作品介绍】
这是其中之一(三个文件,这个文件命名为"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