Init leaderboard menu

This commit is contained in:
Nikolya Andreychik
2021-04-04 10:20:21 -07:00
parent 5fb2195861
commit d986804c64
3 changed files with 199 additions and 21 deletions
+36 -21
View File
@@ -13,6 +13,7 @@ from StandingEnemy import StandingEnemy
from FlyingEnemy import FlyingEnemy
from Cloud import Cloud
from Floor import Floor
from EndSceen import EndSceen
class Drakora():
@@ -55,6 +56,13 @@ class Drakora():
self.speedUp()
self.speedUpLabelCD = self.targetFps
def getFont(self):
return self.font
def getTime(self):
return self.time
def newGame(self):
for enemy in self.enemies:
@@ -87,6 +95,9 @@ class Drakora():
self.speedDownCheatLabelCD = 0
self.speedResetCheatLabelCD = 0
self.time = 0
self.endSceen.newEndScreen()
def __init__(self):
random.seed()
@@ -121,10 +132,10 @@ class Drakora():
self.drawBoxes = False
font = pygame.font.match_font('liberation mono')
self.fontScore = pygame.font.Font(font, 32)
self.fontMessage = pygame.font.Font(font, 56)
self.fontGodmode = pygame.font.Font(font, 12)
self.font = pygame.font.match_font('liberation mono')
self.fontScore = pygame.font.Font(self.font, 32)
self.fontMessage = pygame.font.Font(self.font, 56)
self.fontGodmode = pygame.font.Font(self.font, 12)
self.charKeys = {
pygame.K_a:'a', pygame.K_b:'b', pygame.K_c:'c', pygame.K_d:'d',
@@ -138,6 +149,8 @@ class Drakora():
self.pressedKeys = deque(maxlen=10)
self.isPressedKeysUpdated = True
self.endSceen = EndSceen(self)
self.newGame()
@@ -167,23 +180,22 @@ class Drakora():
for floor in self.floors:
pygame.draw.rect(self.screen, (255, 0, 0), floor.rect, 1)
self.renderText('%d'%(self.__score),
self.fontScore, (255, 255, 255),
(self.getScreenWidth()/2,20))
if self.isGameOver:
self.renderText('GAME OVER',
self.fontMessage, (255, 255, 255),
tuple(i/2 for i in self.screenSize))
elif self.isPaused:
self.renderText('PAUSED',
self.fontMessage, (255, 255, 255),
tuple(i/2 for i in self.screenSize))
elif self.speedUpLabelCD > 0:
self.speedUpLabelCD -= 1
self.renderText('SPEED UP',
self.fontMessage, (255, 255, 255),
tuple(i/2 for i in self.screenSize))
self.endSceen.render();
else:
self.renderText('%d'%(self.__score),
self.fontScore, (255, 255, 255),
(self.getScreenWidth()/2,20))
if self.isPaused:
self.renderText('PAUSED',
self.fontMessage, (255, 255, 255),
tuple(i/2 for i in self.screenSize))
elif self.speedUpLabelCD > 0:
self.speedUpLabelCD -= 1
self.renderText('SPEED UP',
self.fontMessage, (255, 255, 255),
tuple(i/2 for i in self.screenSize))
if self.isGodmode:
self.renderText('godmode',
@@ -267,6 +279,7 @@ class Drakora():
for event in pygame.event.get():
self.player.control(event)
self.endSceen.control(event)
if event.type == pygame.QUIT:
return False
@@ -275,7 +288,7 @@ class Drakora():
if event.key in self.buttonsQuit:
return False
elif event.key in self.buttonsNewGame:
if self.isGameOver or self.isGodmode: self.newGame()
if self.isGodmode: self.newGame()
elif event.key in self.buttonsPause:
self.isPaused = not self.isPaused
@@ -287,6 +300,8 @@ class Drakora():
self.doCheats()
if not self.isGameOver and not self.isPaused:
self.time += 1/self.targetFps
for cloudGroup in self.cloudGroups: cloudGroup.update()
self.enemies.update()
self.players.update()
+158
View File
@@ -0,0 +1,158 @@
"""
Enemy entity class
"""
import pygame
class EndSceen():
def __init__(self, mainGameClass):
self.fontGameOver = pygame.font.Font(mainGameClass.getFont(), 56)
self.fontLeaderBoard = pygame.font.Font(mainGameClass.getFont(), 30)
self.fontLeaderBoardActive = pygame.font.Font(mainGameClass.getFont(), 30)
self.fontLeaderBoardActive.underline = True
self.game = mainGameClass
def newEndScreen(self):
self.playerName = 'Player'
self.scoresFromFile = []
self.data = []
self.isBackButton = True
fileWithData = open('leaders.txt')
for line in fileWithData:
oneStr = line.split()
if (len(oneStr) == 3):
self.data.append([oneStr[0][:10], int(oneStr[1]), float(oneStr[2])])
fileWithData.close()
self.sortedDataByScores = sorted(enumerate(self.data), key=lambda i: i[1][1], reverse=True)
def renderText(self, text, font, color, center):
render = font.render(text, True, color)
rect = render.get_rect()
rect.center = center
self.game.screen.blit(render, rect)
def drawTableLB(self, number):
j = 1
placeFlag = False
for i in [i[0] for i in self.sortedDataByScores[:number]]:
# print(self.data[i])
if (self.game.getScore() > self.data[i][1] and not placeFlag):
self.renderText('>{0:3} {1:^10} {2:6d} {3:8.2f}'.format(j, self.playerName[:10], self.game.getScore(), self.game.getTime()),
self.fontLeaderBoard, (255, 255, 255),
(self.game.getScreenWidth()/2,100 + j*50))
j += 1
placeFlag = True
if (j > number):
break
formatDataForOnePlayer = ' {0:3} {1:^10} {2:6d} {3:8.2f}'.format(j, *self.data[i])
self.renderText(formatDataForOnePlayer,
self.fontLeaderBoard, (255, 255, 255),
(self.game.getScreenWidth()/2,100 + j*50))
j += 1
if (j > number):
break
if not placeFlag and j <= number:
self.renderText('>{0:3} {1:^10} {2:6d} {3:8.2f}'.format(j, self.playerName[:10], self.game.getScore(), self.game.getTime()),
self.fontLeaderBoard, (255, 255, 255),
(self.game.getScreenWidth()/2,100 + j*50))
self.renderText(' {0:^10} {1:>6} {2:>8}'.format('.....', '..', '.....'),
self.fontLeaderBoard, (255, 255, 255),
(self.game.getScreenWidth()/2,100 + (number + 1)*50))
# for i in rows:
def getScorePosition(self, score):
counter = 1
for i in self.sortedDataByScores:
if i[1][1] < score:
return counter
else:
counter += 1
return counter
def render(self):
self.renderText('GAME OVER',
self.fontGameOver, (255, 255, 255),
(self.game.getScreenWidth()/2,50))
self.renderText('Leaderboard',
self.fontLeaderBoard, (255, 255, 255),
(self.game.getScreenWidth()/2,100))
self.drawTableLB(5)
self.renderText(' {0:3d} {1:^10} {2:6d} {3:8.2f}'.format(self.getScorePosition(self.game.getScore()), self.playerName[:10], self.game.getScore(), self.game.getTime()),
self.fontLeaderBoard, (255, 255, 255),
(self.game.getScreenWidth()/2,100 + 5*50 + 50 + 50))
self.renderText('Back',
self.fontLeaderBoard if not self.isBackButton else self.fontLeaderBoardActive, (255, 255, 255),
(self.game.getScreenWidth()/2 - 100, self.game.getScreenHeight() - 80))
self.renderText('Continue',
self.fontLeaderBoard if self.isBackButton else self.fontLeaderBoardActive, (255, 255, 255),
(self.game.getScreenWidth()/2 + 100, self.game.getScreenHeight() - 80))
def control(self, event):
if event.type == pygame.KEYDOWN and self.game.isGameOver:
if event.key == pygame.K_RIGHT:
self.isBackButton = False
elif event.key == pygame.K_LEFT:
self.isBackButton = True
elif event.key == pygame.K_RETURN:
self.saveResults()
if self.isBackButton:
self.game.newGame()
else:
self.game.newGame()
elif event.key == pygame.K_BACKSPACE:
self.playerName = self.playerName[:len(self.playerName) - 1]
elif len(pygame.key.name(event.key)) == 1 and len(self.playerName) < 10:
if pygame.key.get_mods() & pygame.KMOD_LSHIFT:
self.playerName += pygame.key.name(event.key).upper()
else:
self.playerName += pygame.key.name(event.key).lower()
# self.playerName += self.game.charKeys[event.key]
def saveResults(self):
with open ('leaders.txt', 'r') as fileWithData:
tmpData = fileWithData.readlines()
fileWithData.close()
newData = []
for line in tmpData:
if len(line.split()) == 3:
if not (line.split()[0].rstrip() == self.playerName.rstrip()):
newData.append(line)
newData.append('{0} {1} {2:.2f}\n'.format(self.playerName, self.game.getScore(), self.game.getTime()))
with open ('leaders.txt', 'w') as fileWithData:
fileWithData.writelines(newData)
fileWithData.close()
+5
View File
@@ -0,0 +1,5 @@
Kolya 1 11.37
Coolguy 1 10.75
Wow 74 185.72
Player 0 7.16
Cheater 1000 0.01