파이썬으로 콘솔 기반 2048을 만들고 있는 중입니다. 테스트 중간에 작둥이 멈춘채로 가만히 정지해 있습니다. 랜덤 함수 문제인 것 같은데 구체적으로 뭐가 문제인지 모르겟습니다.
조회수 1868회
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 답변
-
말씀하신 것 처럼 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
이 되겠네요.
-
(•́ ✖ •̀)
알 수 없는 사용자
-
댓글 입력