Skip to content

[회의록] 2021.04.17 기존 코드 분석

Hyeonyi Ju edited this page May 1, 2021 · 1 revision

1. 개발 사항 선정

버그

image

1) 콤보

(1) 여러줄 한번에 깨면 1combo -> 줄 개수대로 combo 올라가도록
# Erase line
                erase_count = 0
                rainbow_count = 0
                matrix_contents = []
                combo_value = 0
                for j in range(board_y+1):
                    is_full = True
                    for i in range(board_x):
                        if matrix[i][j] == 0 or matrix[i][j] == 9 : #빈 공간이거나, 장애물블록
                            is_full = False
                    if is_full: # 한 줄 꽉 찼을 때
                        erase_count += 1
                        k = j
                        combo_value += 1

//is full을 세분화 필요

(2) 타임어택 모드에서도 여러줄 깨면 1combo로 인식해 5초만 증가

//위에 코드 해결하면 됨

2) 블록 이동

#####(1) 블럭이 다른 블록에 닿여도 이동이 가능함 => 다음 블록 딜레이 발생

                # Set speed
                if not game_over:
                    keys_pressed = pygame.key.get_pressed()
                    if keys_pressed[K_DOWN]:
                        pygame.time.set_timer(pygame.USEREVENT, framerate) #프레임 시간만큼 빠르게 소프트드롭
                    else:
                        pygame.time.set_timer(pygame.USEREVENT, game_speed)

//드롭 후 timer 조절로 해결 가능해보임 또는 framerate나 game_speed

(2) 방향키 아래키로 Soft drop으로 끝까지 블록 내리면 일정시간 동안 키보드렉먹고, 속도 soft 드롭 속도로 고정됨
                # Set speed
                if not game_over:
                    keys_pressed = pygame.key.get_pressed()
                    if keys_pressed[K_DOWN]:
                        pygame.time.set_timer(pygame.USEREVENT, framerate) #프레임 시간만큼 빠르게 소프트드롭
                    else:
                        pygame.time.set_timer(pygame.USEREVENT, game_speed)

// Hard drop 참고해서 해결 필요

# Hard drop
                elif event.key == K_SPACE:
                    ui_variables.fall_sound.play()
                    ui_variables.drop_sound.play()
                    while not is_bottom(dx, dy, mino, rotation, matrix):
                        dy += 1
                    hard_drop = True
                    pygame.time.set_timer(pygame.USEREVENT, framerate)
                    draw_mino(dx, dy, mino, rotation, matrix)
                    screen.fill(ui_variables.real_white)
                    draw_image(screen, gamebackground_image , board_width * 0.5, board_height * 0.5, board_width, board_height) #(window, 이미지주소, x좌표, y좌표, 너비, 높이)
                    draw_board(next_mino1, next_mino2, hold_mino, score, level, goal)
                    pygame.display.update()
                elif event.key == K_j :
                    framerate = int(framerate-speed_change)
                    print(framerate)

3) 게임오버

(1) 게임오버시 Menu, restart, 이름입력, Ok버튼 전부 작동X
(1.1) 이름입력
# Game over screen

부분에서 이름을 키보드 방향키로 입력 받음 마우스클릭 이벤트 입력받는거랑 키보드 입력 받는거랑 뒤죽박죽인 느낌인데, 어쩌다가 한번씩 키보드 방향키로 이름 입력 성공함 전체적으로 수정 필요 밑 코드는 이름 입력 부분 일부!

            elif event.type == KEYDOWN:
                if event.key == K_RETURN:
                    ui_variables.click_sound.play()

                    #1p점수만 저장함
                    outfile = open('leaderboard.txt', 'a')
                    outfile.write(chr(name[0]) + chr(name[1]) + chr(name[2]) + ' ' + str(score) + '\n')
                    outfile.close()

                    game_over = False
                    pygame.time.set_timer(pygame.USEREVENT, 1) #0.001초

                #name은 3글자로 name_locationd은 0~2, name[name_location]은 영어 아스키코드로 65~90.
                elif event.key == K_RIGHT:
                    if name_location != 2:
                        name_location += 1
                    else:
                        name_location = 0
                    pygame.time.set_timer(pygame.USEREVENT, 1) #0.001초
                elif event.key == K_LEFT:
                    if name_location != 0:
                        name_location -= 1
                    else:
                        name_location = 2
                    pygame.time.set_timer(pygame.USEREVENT, 1)
                elif event.key == K_UP:
                    ui_variables.click_sound.play()
                    if name[name_location] != 90:
                        name[name_location] += 1
                    else:
                        name[name_location] = 65
                    pygame.time.set_timer(pygame.USEREVENT, 1)
                elif event.key == K_DOWN:
                    ui_variables.click_sound.play()
                    if name[name_location] != 65:
                        name[name_location] -= 1
                    else:
                        name[name_location] = 90
                    pygame.time.set_timer(pygame.USEREVENT, 1)
(2) PVP모드에서 한명이 게임오버시 나머지 사람은 방향이 움직이면 게임이 가능

game_over = True를 중간에 어디 넣어줘야 할 듯

# Create new mino
                else:
                    if hard_drop or bottom_count == 6:
                        hard_drop = False
                        bottom_count = 0
                        draw_mino(dx, dy, mino, rotation, matrix)

                        if is_stackable(next_mino1, matrix):
                            mino = next_mino1
                            # next_mino1 = next_mino2
                            next_mino1 = randint(1, 7)
                            dx, dy = 3, 0
                            rotation = 0
                            hold = False
                            score += 10 * level
                        else:  # 더이상 쌓을 수 없으면 게임오버
                            pvp = True
                            game_status = 'pvp'

                            if score >= score_2P :
                                draw_image(screen, gameover_image,board_width * 0.15, board_height * 0.5, int(board_width * 0.25), int(board_height * 0.45)) #(window, 이미지주소, x좌표, y좌표, 너비, 높이)
                            else :
                                ui_variables.GameOver_sound.play()
                                draw_image(screen,pvp_lose_image,board_width * 0.15, board_height * 0.5, int(board_width * 0.25), int(board_height * 0.6)) #(window, 이미지주소, x좌표, y좌표, 너비, 높이)
                                draw_image(screen,pvp_win_image,board_width * 0.6, board_height * 0.5, int(board_width * 0.25), int(board_height * 0.55)) #(window, 이미지주소, x좌표, y좌표, 너비, 높이)
                                pvp = False
                                pygame.mixer.music.stop()
                                if game_status == 'start':
                                    start = True
                                    pygame.mixer.music.play(-1)
                                if game_status == 'pvp':
                                    pvp = True
                                    pygame.mixer.music.play(-1)
                                ui_variables.click_sound.play()
                                game_over = False
                                pause = False
                    else:
                        bottom_count += 1
(3) PVP모드에서 게임오버시 Win, Lose만 계속 뜨고 메인으로 돌아가거나 하는 버튼X

//(3)을 해결하면 될 듯

수정

image

1) 콤보와 레벨업

(1) level up 효과(배경색이 변화, level up! 표시)

//콤보처럼 이미지 보이게 추가 아래는 콤보 이미지 보여주고 소리 내는 코드인데 1~10 콤보 마다 이미지 지정까지 되어있어서 레벨변수로 바꿔주고, 레벨 이미지, 레벨 사운드만 넣어주면 될 듯

for i in range(1, 11): #10가지의 콤보 이미지 존재. 각 숫자에 해당하는 이미지 불러옴
        combos.append(pygame.image.load("assets/Combo/" + str(i) + "combo.png"))
        large_combos.append(pygame.transform.smoothscale(combos[i - 1], (150, 200))) #콤보이미지를 특정 크기로 불러옴, 150=가로크기, 200=세로크기#

    combos_sound = []
    for i in range(1, 10): #1-9까지 콤보사운드 존재. 각 숫자에 해당하는 음악 불러옴
        combos_sound.append(pygame.mixer.Sound("assets/sounds/SFX_" + str(i + 2) + "Combo.wav"))

2) PVP모드

(1) 2p모드에서 상대 player에게 아예 터트릴 수 없는 까만 줄이 생김 -> 터트릴 수 있는 줄 올라오게 하기(빈곳에 랜덤으로 몇 개)

이런식으로 ㅁ ㅁ ㅁ ㅁ

원래한줄은 aaaaaaaaaa

//상대에서 장애물 블록을 채우는 부분인데 If문 안에 수정해서 가능할 듯

                while attack_line >= 1 : #2p에게 공격 보내기
                    for i in range(board_x):
                        if matrix_2P[i][board_y-attack_point] == 0 : #비어있는 공간을
                            matrix_2P[i][board_y-attack_point] = 9 #모두 장애물 블록으로 채움
                    attack_line -= 1
                    attack_point += 1

                while attack_line_2P >= 1 :  #1p에게 공격 보내기
                    for i in range(board_x):
                        if matrix[i][board_y-attack_point_2P] == 0 : #비어있는 공간을
                            matrix[i][board_y-attack_point_2P] = 9 #모두 장애물 블록으로 채움
                    attack_line_2P -= 1
                    attack_point_2P += 1

추가

image

1) 아이템 추가: (블록에 아이콘모양있고, 그 줄이 깨지면 바로 사용)

클래식: 가로줄삭제, 세로줄삭제, 속도 느리게, 빠르게

타임어택: 가로줄삭제, 세로줄삭제, 속도 느리게, 빠르게, 시간 증가

PVP: 가로줄삭제, 세로줄삭제, 속도 느리게, 빠르게, 상대 다음 블럭 블라인드, 키보드반대로

참고)https://github.com/CSID-DGU/2019-2-OSSPC-OSO_OSEYO-5/blob/master/%EB%B0%9C%ED%91%9C/%EC%B5%9C%EC%A2%85%EB%B0%9C%ED%91%9C%EC%9E%90%EB%A3%8C_%EC%98%A4%EC%86%8C%EC%98%A4%EC%84%B8%EC%9A%94.pptx

2) h키를 누르면 hint를 보여준다거나 알아서 블럭 넣어주는 자동 추천 기능

3) 2p플레이를 한 컴퓨터에서 하는거 말고 ip접속해서 각자 컴퓨터에서 플레이하도록 만들기

=>2,3은 자료조사 후 최종 판단

기타 기능 후보

2. 제안서 내용

1) 기존 프로젝트 분석

  • 소개
  • 라이센스: MIT
  • SWOT 분석(장점: 다양한 모드, 꼼꼼한 주석, pygame, …, 단점: 버그, 아이템이 없어서 단조롭다, ...)
  • 선정 이유: 기존 테트리스 게임에 비해 다양한 모드가 있어 다양하게 즐길 수 있는 테트리스 게임이다. 하지만 아이템이 없어서 단조롭고 실제 플레이 했을 때 예상보다 즐길 수 있는 요소들이 적어서 아쉬웠다. 여기에 다양한 아이템과 모드를 더 추가하고 버그를 개선해 이 오픈소스가 가지고 있는 장점을 극대화해 재미있게 즐길 수 있는 테트리스 게임으로 보완하고자 한다.

2) 개발 계획

  • 위의 개발 사항 선정 내용
  • 변경 후 화면 구성
  • 기술 조사

3) 기타

  • 라이선스 : MIT
  • 개발환경(Ubuntu, Python 3.8, VS Code)
  • 기대효과: 오픈소스를 활용~~, 협업방식~~
  • 최종 결과물: 프로젝트, 깃헙 readme, 발표자료, 영상시연,
  • 역할분담
  • 타임라인
  • 프로젝트 시스템구조

3. 일정

다음 회의 까지(수요일 저녁 8시)

  • 자동 추천 기능 자료조사 =>현이
  • 다른 컴퓨터로 2P 자료조사 =>현하
  • 기존 프로젝트 분석 =>채림

다음 회의때 의논 사항

  • 역할분담
  • 타임라인

이후 할 일

  • 예상 결과물 사진
  • 프로젝트 시스템구조
  • 발표자료, 연습
Clone this wiki locally