파이썬으로 콘솔 기반 2048을 만들고 있는 중입니다. 테스트 중간에 작둥이 멈춘채로 가만히 정지해 있습니다. 랜덤 함수 문제인 것 같은데 구체적으로 뭐가 문제인지 모르겟습니다.

from random import randint

class Board:
    def __init__(self):#맵 만드는 함수, 작동은 함(최적화 필요)
        self.score = 0
        self.size = 4
        n = self.size+1
        self.board = [[0]*n for i in range(self.size+1)]
        self.board[1][1] = 2
    def move(self, direction):#맵을 움직이는 함수, 미완성
        if direction == 'w':
            self.upMove()
    def check(self):#맵에서 가능한 경우를 확인하는 함수, 즉 게임 오버 판별, 완성
        for i in range(1,self.size): # 네모서리를 제외하고 같은 거 근처에 있는 지 검증
            for j in range(1,self.size):
                if self.board[i][j] == self.board[i+1][j] or self.board[i][j] == self.board[i][j+1]:
                    return True
            if self.board[i][self.size] == self.board[i+1][self.size] :
                return True
        for j in range(1,self.size):
            if self.board[self.size][j] == self.board[self.size][j+1] :
                return True
        return False
    def check0(self): #맵에 0이 있는 지 판별하는 함수
        for i in range(1,self.size+1):
            for j in range(1,self.size+1):
                if self.board[i][j] == 0:
                    return True
        return False
    def combine(self,direction):#숫자를 결합하는 함수, 미완성
        if direction == 'w':
            for j in range(1,self.size+1):
                for i in range(1,self.size+1):
                    if i == self.size or self.board[i][j] == 0:
                        pass
                    else :
                        if self.board[i][j] == self.board[i+1][j]:
                            self.board[i][j] = self.board[i][j]*2
                            self.board[i+1][j] = 0
                            self.score = self.score + self.board[i][j]
    def show(self):#맵과 점수를 보여주는 함수, 완성
        for i in range(1,self.size+1):
            print()
            for j in range(1,self.size+1):
                print(str(self.board[i][j]).center(4), end = ' ')
            print()
        print('\n현재 점수:', self.score)
    def spawn(self):#랜덤으로 맵에 2또는 4를 추가하는 함수,완성
        x = randint(1,self.size)
        y = randint(1,self.size)
        if self.board[y][x]==0:
            self.board[y][x] = randint(1,2)*2
        else :
            while self.board[y][x]!=0:
                x = randint(1,self.size)
                y = randint(1,self.size)
                if self.board[y][x]==0:
                    self.board[y][x] = randint(1,2)*2
    def upMove(self):
        for j in range(1,self.size+1):
            for i in range(2, self.size+1):
                if self.board[i][j] != 0:
                    y = i
                    while(self.board[y-1][j] == 0 and y > 1):
                        y = y-1
                        if y == 1:
                            break
                    if y != i:
                        self.board[y][j] = self.board[i][j]
                        self.board[i][j] = 0
                else :
                    pass
def inputCheck(letter):# 입력값을 체크하는 기능, 완성함
    try:
        ['w','a','s','d'].index(letter)
    except :
        print('지정된 문자만 입력해 주세요.')
        return True
    else :
        return False

print('2048')
print('조작키는 wasd입니다.')

nowboard = Board()
while True:
    nowboard.show()
    while True:
        inputLetter = 'w'
        if not inputCheck(inputLetter):
            break

    nowboard.move(inputLetter)
    nowboard.combine(inputLetter)
    nowboard.move(inputLetter)
    if nowboard.check0() :
        nowboard.spawn()
        if nowboard.check() or nowboard.check0():
            continue
        else :
            nowboard.show()
            print('GAME OVER')
            break
    else:
        if nowboard.check():
            continue
        else:
            nowboard.show()
            print('GAME OVER')
            break

파이썬으로 2048 게임을 만들고 있는 중이고, 방향키로는 wasd를 사용해서 진행하고 있습니다. 일단 부분 부분 만들어 보기 위해 w를 입력으로 받았을 때만 무한반복으로 시킨 상태입니다. 그런데 몇 번 대략(3~5번)까지는 정상적으로 출력이 되는 데 그 이후로는 출력이 안되고 그래도 멈춥니다. 무한반복 시켜서 생긴 문제인가 해서 일일이 입력하는 것으로 꿔도 3~4번 후에는 입력을 해도 작동을 안하고 멈춥니다. 에러메세지도 안뜨고요. 왜 그런가요?

제 생각에는 .spawn()이 문제일 것 같기는 한데 뭐가 문제인지는 못 찾겟네요.

1답변

  • 좋아요

    1

    싫어요
    채택취소하기

    말씀하신 것 처럼 spawn 메소드에 문제가 있네요.

    변수의 scope 때문에 원하는대로 코드가 동작하지 않습니다.

        def spawn(self):#랜덤으로 맵에 2또는 4를 추가하는 함수,완성
            x = randint(1,self.size) # 1 
            y = randint(1,self.size) # 1
            if self.board[y][x]==0:
                self.board[y][x] = randint(1,2)*2
            else :
                while self.board[y][x]!=0:
                    x = randint(1,self.size) # 2
                    y = randint(1,self.size) # 2
    

    1에서 선언된 x, y 값을 2에서 바꾸려고 하신것 같은데요. 실제로 1의 x와 2의 x는 같은 변수가 아닙니다. 대략적인 설명은 유사 질문을 참고하세요.

    유사 질문의 nonlocal c를 이용하는 것도 한 방법이겠지만, 이렇게 코드를 바꿔보시면 어떨까요?

    작성하신 코드에는 중복되는 부분(if self.board[y][x]==0: self.board[y][x] = randint(1,2)*2) 이 있습니다. 이 부분을 좀 더 다듬으면

        def spawn(self):#랜덤으로 맵에 2또는 4를 추가하는 함수,완성
            while True:
                x, y = randint(1, self.size), randint(1, self.size)
                if self.board[y][x] == 0:
                    self.board[y][x] = randint(1, 2) * 2
                    break
    

    이 되겠네요.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 정말 감사합니다. 덕분에 새로운 사실을 배웠습니다. dodok8 2017.12.11 21:32

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.