DICERS - 2 Rank, Rank_cal

김근호·2021년 7월 10일
0

게임 결과 랭킹 계산, 저장


Rank_cal

import operator

def r_sort():
    with open('ranks/rich.txt', 'r', encoding='utf-8') as f:
        r_list = f.readline()[:-1].split(",")
        if len(r_list) > 22:
            del r_list[23:]
        r_dict = {}

        for i in range(0, len(r_list), 2):

            if not r_list[i] in r_dict:
                r_dict[r_list[i]] = int(r_list[i+1])

            if r_list[i] in r_dict:
                if int(r_dict[r_list[i]]) >= int(r_list[i+1]):
                    pass

                elif int(r_dict[r_list[i]]) < int(r_list[i+1]):
                    r_dict[r_list[i]] = int(r_list[i+1])

        sorted_r = sorted(r_dict.items(), reverse= True, key= operator.itemgetter(1))
        with open('ranks/rich.txt', 'w', encoding='utf-8') as f2:
            for i in sorted_r:
                for j in range(2):
                    f2.write(str(i[j]))
                    f2.write(',')
    return sorted_r[0][0], sorted_r[0][1], sorted_r[1][0], sorted_r[1][1], sorted_r[2][0], sorted_r[2][1]


def l_sort():
    with open('ranks/long.txt', 'r', encoding='utf-8') as f:
        l_list = f.readline()[:-1].split(",")
        if len(l_list) > 22:
            del l_list[23:]

        l_dict = {}

        for i in range(0, len(l_list), 2):

            if not l_list[i] in l_dict:
                l_dict[l_list[i]] = int(l_list[i + 1])

            if l_list[i] in l_dict:
                if int(l_dict[l_list[i]]) >= int(l_list[i + 1]):
                    pass

                elif int(l_dict[l_list[i]]) < int(l_list[i + 1]):
                    l_dict[l_list[i]] = int(l_list[i + 1])
        sorted_l = sorted(l_dict.items(), reverse=True, key=operator.itemgetter(1))
        with open('ranks/long.txt', 'w', encoding='utf-8') as f2:
            for i in sorted_l:
                for j in range(2):
                    f2.write(str(i[j]))
                    f2.write(',')
    return sorted_l[0][0], sorted_l[0][1], sorted_l[1][0], sorted_l[1][1], sorted_l[2][0], sorted_l[2][1]

def c_sort():
    with open('ranks/clever.txt', 'r', encoding='utf-8') as f:
        c_list = f.readline()[:-1].split(",")
        if len(c_list) > 22:
            del c_list[23:]
        c_dict = {}

        for i in range(0, len(c_list), 2):

            if not c_list[i] in c_dict:
                c_dict[c_list[i]] = float(c_list[i+1])

            if c_list[i] in c_dict:
                if float(c_dict[c_list[i]]) >= float(c_list[i+1]):
                    pass

                elif float(c_dict[c_list[i]]) < float(c_list[i + 1]):
                    c_dict[c_list[i]] = float(c_list[i + 1])

        sorted_c = sorted(c_dict.items(), reverse = True, key = operator.itemgetter(1))
        with open('ranks/clever.txt', 'w', encoding='utf-8') as f2:
            for i in sorted_c:
                for j in range(2):
                    f2.write(str(i[j]))
                    f2.write(',')

    return sorted_c[0][0], sorted_c[0][1], sorted_c[1][0], sorted_c[1][1], sorted_c[2][0], sorted_c[2][1]

try:
    r_sort()
    l_sort()
    c_sort()

except IndexError:
    pass

위의 코드는 게임 결과를 기록할 때
rich, long, clever 수치(최종 포인트, 게임 횟수, 회당 취득 포인트)를
기준으로 txt 파일에 저장하는 코드다.

고려했던 점들은 다음과 같다.

  1. 같은 사용자의 기록 중 상위 기록이 있으면 확인하고 기존 기록을 갱신할 것
  2. 텍스트 파일을 저장해서 다음 게임이 구동될 때에도 기록을 유지할 것

등등을 구현하였지만 좋은 코드라고 생각하지 않는다.
부단히 비효율적이고, 객체에 대한 고민보다 구동에 초점을 맞춰 서둘러 만들어낸 코드라서
만약 지금 리팩토링을 한다면

  1. 유사한 구조를 가진 3개의 함수를 하나의 모듈로 묶을 것
  2. 2차원 리스트보다 더 괜찮은 리턴값으로 가독성을 높일 것
  3. encrypt하여 파일값에 대한 수정을 막을 것

을 우선 고려할 것 같다.


Rank

import pygame
import DICERS_rankcal
from pygame.locals import *



def rank():
    pygame.init()
    SURFACE = pygame.display.set_mode((800, 600), 0, 32)
    pygame.display.set_caption('D   I   C   E   R   S')

    BLACK = (0, 0, 0)
    GRAY = (180, 180, 180)
    WHITE = (255, 255, 255)
    RED = (200, 0, 0)
    PALEBLUE = (120, 120, 240)

    GOLD = (150, 130, 35)
    SILVER = (162, 162, 162)

    DICERSFONT = 'material//NEXONFootballGothicL.ttf'
    MAINFONT = pygame.font.Font(DICERSFONT, 25)
    MIDDLEFONT = pygame.font.Font(DICERSFONT, 50)

    BOX_RICH = (30, 30, 226, 510)
    BOX_RICH_2 = (40, 40, 206, 50)
    BOX_RICH_TITLE = MIDDLEFONT.render('RICH', True, BLACK)
    BOX_RICH_TITLE_RECT = BOX_RICH_TITLE.get_rect(center = [140, 68])
    BOX_RICH_TEXT = MAINFONT.render('포인트 순', True, BLACK)
    BOX_RICH_TEXT_RECT = BOX_RICH_TEXT.get_rect(center = [140, 110])

    BOX_RICH_1ST = MIDDLEFONT.render('1st', True, GOLD)
    BOX_RICH_1ST_RECT = BOX_RICH_1ST.get_rect(center = [140, 160])
    BOX_RICH_1ST_NAME = MAINFONT.render(str(DICERS_rankcal.r_sort()[0]), True, BLACK)
    BOX_RICH_1ST_NAME_RECT = BOX_RICH_1ST_NAME.get_rect(center = [140, 210])
    BOX_RICH_1ST_VALUE = MAINFONT.render((str(DICERS_rankcal.r_sort()[1]) + ' $'), True, BLACK)
    BOX_RICH_1ST_VALUE_RECT = BOX_RICH_1ST_VALUE.get_rect(center = [140, 240])

    BOX_RICH_2ND = MIDDLEFONT.render('2nd', True, SILVER)
    BOX_RICH_2ND_RECT = BOX_RICH_2ND.get_rect(center = [140, 300])
    BOX_RICH_2ND_NAME = MAINFONT.render(str(DICERS_rankcal.r_sort()[2]), True, BLACK)
    BOX_RICH_2ND_NAME_RECT = BOX_RICH_2ND_NAME.get_rect(center = [140, 350])
    BOX_RICH_2ND_VALUE = MAINFONT.render((str(DICERS_rankcal.r_sort()[3]) + ' $'), True, BLACK)
    BOX_RICH_2ND_VALUE_RECT = BOX_RICH_2ND_VALUE.get_rect(center = [140, 380])

    BOX_RICH_3RD = MIDDLEFONT.render('3rd', True, PALEBLUE)
    BOX_RICH_3RD_RECT = BOX_RICH_3RD.get_rect(center = [140, 440])
    BOX_RICH_3RD_NAME = MAINFONT.render(str(DICERS_rankcal.r_sort()[4]), True, BLACK)
    BOX_RICH_3RD_NAME_RECT = BOX_RICH_3RD_NAME.get_rect(center = [140, 490])
    BOX_RICH_3RD_VALUE = MAINFONT.render((str(DICERS_rankcal.r_sort()[5]) + ' $'), True, BLACK)
    BOX_RICH_3RD_VALUE_RECT = BOX_RICH_3RD_VALUE.get_rect(center = [140, 520])

    #

    BOX_CLEV = (286, 30, 226, 510)
    BOX_CLEV_2 = (296, 40, 206, 50)
    BOX_CLEV_TITLE = MIDDLEFONT.render('CLEVER', True, BLACK)
    BOX_CLEV_TITLE_RECT = BOX_CLEV_TITLE.get_rect(center = [396, 68])
    BOX_CLEV_TEXT = MAINFONT.render('포인트 / 라운드 순', True, BLACK)
    BOX_CLEV_TEXT_RECT = BOX_CLEV_TEXT.get_rect(center = [396, 110])

    BOX_CLEV_1ST = MIDDLEFONT.render('1st', True, GOLD)
    BOX_CLEV_1ST_RECT = BOX_CLEV_1ST.get_rect(center=[396, 160])
    BOX_CLEV_1ST_NAME = MAINFONT.render(str(DICERS_rankcal.c_sort()[0]), True, BLACK)
    BOX_CLEV_1ST_NAME_RECT = BOX_CLEV_1ST_NAME.get_rect(center=[396, 210])
    BOX_CLEV_1ST_VALUE = MAINFONT.render((str(int(DICERS_rankcal.c_sort()[1]))), True, BLACK)
    BOX_CLEV_1ST_VALUE_RECT = BOX_CLEV_1ST_VALUE.get_rect(center=[396, 240])

    BOX_CLEV_2ND = MIDDLEFONT.render('2nd', True, SILVER)
    BOX_CLEV_2ND_RECT = BOX_CLEV_2ND.get_rect(center=[396, 300])
    BOX_CLEV_2ND_NAME = MAINFONT.render(str(DICERS_rankcal.c_sort()[2]), True, BLACK)
    BOX_CLEV_2ND_NAME_RECT = BOX_CLEV_2ND_NAME.get_rect(center=[396, 350])
    BOX_CLEV_2ND_VALUE = MAINFONT.render((str(int(DICERS_rankcal.c_sort()[3]))), True, BLACK)
    BOX_CLEV_2ND_VALUE_RECT = BOX_CLEV_2ND_VALUE.get_rect(center=[396, 380])

    BOX_CLEV_3RD = MIDDLEFONT.render('3rd', True, PALEBLUE)
    BOX_CLEV_3RD_RECT = BOX_CLEV_3RD.get_rect(center=[396, 440])
    BOX_CLEV_3RD_NAME = MAINFONT.render(str(DICERS_rankcal.c_sort()[4]), True, BLACK)
    BOX_CLEV_3RD_NAME_RECT = BOX_CLEV_3RD_NAME.get_rect(center=[396, 490])
    BOX_CLEV_3RD_VALUE = MAINFONT.render((str(int(DICERS_rankcal.c_sort()[5]))), True, BLACK)
    BOX_CLEV_3RD_VALUE_RECT = BOX_CLEV_3RD_VALUE.get_rect(center=[396, 520])

    #

    BOX_LONG = (542, 30, 226, 510)
    BOX_LONG_2 = (552, 40, 206, 50)
    BOX_LONG_TITLE = MIDDLEFONT.render('LONG', True, BLACK)
    BOX_LONG_TITLE_RECT = BOX_LONG_TITLE.get_rect(center = [652, 68])
    BOX_LONG_TEXT = MAINFONT.render('라운드 순', True, BLACK)
    BOX_LONG_TEXT_RECT = BOX_LONG_TEXT.get_rect(center = [652, 110])

    BOX_LONG_1ST = MIDDLEFONT.render('1st', True, GOLD)
    BOX_LONG_1ST_RECT = BOX_LONG_1ST.get_rect(center=[652, 160])
    BOX_LONG_1ST_NAME = MAINFONT.render(str(DICERS_rankcal.l_sort()[0]), True, BLACK)
    BOX_LONG_1ST_NAME_RECT = BOX_LONG_1ST_NAME.get_rect(center=[652, 210])
    BOX_LONG_1ST_VALUE = MAINFONT.render((str(DICERS_rankcal.l_sort()[1])), True, BLACK)
    BOX_LONG_1ST_VALUE_RECT = BOX_LONG_1ST_VALUE.get_rect(center=[652, 240])

    BOX_LONG_2ND = MIDDLEFONT.render('2nd', True, SILVER)
    BOX_LONG_2ND_RECT = BOX_LONG_2ND.get_rect(center=[652, 300])
    BOX_LONG_2ND_NAME = MAINFONT.render(str(DICERS_rankcal.l_sort()[2]), True, BLACK)
    BOX_LONG_2ND_NAME_RECT = BOX_LONG_2ND_NAME.get_rect(center=[652, 350])
    BOX_LONG_2ND_VALUE = MAINFONT.render((str(DICERS_rankcal.l_sort()[3])), True, BLACK)
    BOX_LONG_2ND_VALUE_RECT = BOX_LONG_2ND_VALUE.get_rect(center=[652, 380])

    BOX_LONG_3RD = MIDDLEFONT.render('3rd', True, PALEBLUE)
    BOX_LONG_3RD_RECT = BOX_LONG_3RD.get_rect(center=[652, 440])
    BOX_LONG_3RD_NAME = MAINFONT.render(str(DICERS_rankcal.l_sort()[4]), True, BLACK)
    BOX_LONG_3RD_NAME_RECT = BOX_LONG_3RD_NAME.get_rect(center=[652, 490])
    BOX_LONG_3RD_VALUE = MAINFONT.render((str(DICERS_rankcal.l_sort()[5])), True, BLACK)
    BOX_LONG_3RD_VALUE_RECT = BOX_LONG_3RD_VALUE.get_rect(center=[652, 520])

    DICERSFONT = 'material//NEXONFootballGothicL.ttf'
    MAINFONT = pygame.font.Font(DICERSFONT, 25)



    # 메인 루프

    while True:
        SURFACE.fill(WHITE)
        # RICH SECTION
        RST_SURFACE = MAINFONT.render('rank reset', True, GRAY)
        RST_RECT = RST_SURFACE.get_rect(center=[143, 565])

        PLAY_SURFACE = MAINFONT.render('play game', True, GRAY)
        PLAY_RECT = PLAY_SURFACE.get_rect(center=[399, 565])

        BTM_SURFACE = MAINFONT.render('back to menu', True, GRAY)
        BTM_RECT = BTM_SURFACE.get_rect(center=[655, 565])
        #
        pygame.draw.rect(SURFACE, BLACK, BOX_RICH, 3)
        pygame.draw.rect(SURFACE, BLACK, BOX_RICH_2, 3)
        SURFACE.blit(BOX_RICH_TITLE, BOX_RICH_TITLE_RECT)
        SURFACE.blit(BOX_RICH_TEXT, BOX_RICH_TEXT_RECT)
        SURFACE.blit(BOX_RICH_1ST, BOX_RICH_1ST_RECT)
        SURFACE.blit(BOX_RICH_1ST_NAME, BOX_RICH_1ST_NAME_RECT)
        SURFACE.blit(BOX_RICH_1ST_VALUE, BOX_RICH_1ST_VALUE_RECT)
        SURFACE.blit(BOX_RICH_2ND, BOX_RICH_2ND_RECT)
        SURFACE.blit(BOX_RICH_2ND_NAME, BOX_RICH_2ND_NAME_RECT)
        SURFACE.blit(BOX_RICH_2ND_VALUE, BOX_RICH_2ND_VALUE_RECT)
        SURFACE.blit(BOX_RICH_3RD, BOX_RICH_3RD_RECT)
        SURFACE.blit(BOX_RICH_3RD_NAME, BOX_RICH_3RD_NAME_RECT)
        SURFACE.blit(BOX_RICH_3RD_VALUE, BOX_RICH_3RD_VALUE_RECT)



        pygame.draw.rect(SURFACE, BLACK, BOX_CLEV, 3)
        pygame.draw.rect(SURFACE, BLACK, BOX_CLEV_2, 3)
        SURFACE.blit(BOX_CLEV_TITLE, BOX_CLEV_TITLE_RECT)
        SURFACE.blit(BOX_CLEV_TEXT, BOX_CLEV_TEXT_RECT)
        SURFACE.blit(BOX_CLEV_1ST, BOX_CLEV_1ST_RECT)
        SURFACE.blit(BOX_CLEV_1ST_NAME, BOX_CLEV_1ST_NAME_RECT)
        SURFACE.blit(BOX_CLEV_1ST_VALUE, BOX_CLEV_1ST_VALUE_RECT)
        SURFACE.blit(BOX_CLEV_2ND, BOX_CLEV_2ND_RECT)
        SURFACE.blit(BOX_CLEV_2ND_NAME, BOX_CLEV_2ND_NAME_RECT)
        SURFACE.blit(BOX_CLEV_2ND_VALUE, BOX_CLEV_2ND_VALUE_RECT)
        SURFACE.blit(BOX_CLEV_3RD, BOX_CLEV_3RD_RECT)
        SURFACE.blit(BOX_CLEV_3RD_NAME, BOX_CLEV_3RD_NAME_RECT)
        SURFACE.blit(BOX_CLEV_3RD_VALUE, BOX_CLEV_3RD_VALUE_RECT)

        pygame.draw.rect(SURFACE, BLACK, BOX_LONG, 3)
        pygame.draw.rect(SURFACE, BLACK, BOX_LONG_2, 3)
        SURFACE.blit(BOX_LONG_TITLE, BOX_LONG_TITLE_RECT)
        SURFACE.blit(BOX_LONG_TEXT, BOX_LONG_TEXT_RECT)
        SURFACE.blit(BOX_LONG_1ST, BOX_LONG_1ST_RECT)
        SURFACE.blit(BOX_LONG_1ST_NAME, BOX_LONG_1ST_NAME_RECT)
        SURFACE.blit(BOX_LONG_1ST_VALUE, BOX_LONG_1ST_VALUE_RECT)
        SURFACE.blit(BOX_LONG_2ND, BOX_LONG_2ND_RECT)
        SURFACE.blit(BOX_LONG_2ND_NAME, BOX_LONG_2ND_NAME_RECT)
        SURFACE.blit(BOX_LONG_2ND_VALUE, BOX_LONG_2ND_VALUE_RECT)
        SURFACE.blit(BOX_LONG_3RD, BOX_LONG_3RD_RECT)
        SURFACE.blit(BOX_LONG_3RD_NAME, BOX_LONG_3RD_NAME_RECT)
        SURFACE.blit(BOX_LONG_3RD_VALUE, BOX_LONG_3RD_VALUE_RECT)

        SURFACE.blit(BTM_SURFACE, BTM_RECT)
        SURFACE.blit(RST_SURFACE, RST_RECT)
        SURFACE.blit(PLAY_SURFACE, PLAY_RECT)




        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()

            if event.type == pygame.MOUSEBUTTONDOWN:
                if RST_RECT.collidepoint(event.pos):
                    with open('ranks/rich.txt', 'w', encoding='utf-8') as rsr:
                        rsr.write('default1,1,default2,1,default3,1,')
                    with open('ranks/clever.txt', 'w', encoding='utf-8') as rsc:
                        rsc.write('default1,1,default2,1,default3,1,')
                    with open('ranks/long.txt', 'w', encoding='utf-8') as rsl:
                        rsl.write('default1,1,default2,1,default3,1,')
                    rank()

                if PLAY_RECT.collidepoint(event.pos):
                    import DICERS_game
                    DICERS_game.game()


                if BTM_RECT.collidepoint(event.pos):
                    import DICERS_main
                    DICERS_main.main()


            if event.type == pygame.MOUSEMOTION:

                if RST_RECT.collidepoint(event.pos):
                    RST_SURFACE = MAINFONT.render('$ rank reset $', True, RED)
                    RST_RECT = RST_SURFACE.get_rect(center=[143, 565])
                    SURFACE.blit(RST_SURFACE, RST_RECT)

                if PLAY_RECT.collidepoint(event.pos):
                    PLAY_SURFACE = MAINFONT.render('$ play game $', True, RED)
                    PLAY_RECT = PLAY_SURFACE.get_rect(center=[399, 565])
                    SURFACE.blit(PLAY_SURFACE, PLAY_RECT)

                if BTM_RECT.collidepoint(event.pos):
                    BTM_SURFACE = MAINFONT.render('$ back to menu $', True, RED)
                    BTM_RECT = BTM_SURFACE.get_rect(center=[655, 565])
                    SURFACE.blit(BTM_SURFACE, BTM_RECT)
            pygame.display.update()

역시나 앞서 설명한대로 render, draw, blit을 통해서 display update 루프를 돌리는 모습,
자잘한 디테일이지만 랭킹을 조회하는 화면에서 reset 버튼을 누르면 기존 기록들이 초기화되도록 구현하고 싶었다.
오래 지나서 살펴 보는데, 공통적으로 문제점으로 느끼는 것은
차라리 다른 모듈에서 다른 시각 객체들(버튼, 프레임 등)을 생산하는 클래스를 만들면 어땠을까... 하는 피드백이 든다.

profile
devrmsrms

0개의 댓글