2012-05-18 5 views
2

터미널 게임 (Mac OSX, Python 2.6.5)에서 퍼즐을 얻으려고 curses을 사용하고 있습니다. 퍼즐은 자물쇠를 여는 다이얼을 돌리는 것을 포함합니다. 다소 (추함을 변명) 간단하게 내 코드 :파이썬 : 'curses'를 두 번 호출하면 터미널이 두텁게됩니다.

import curses 

dial = ["| -1 |","|-1/3 |","| 0 |","| 1/2 |","| 2/3 |","| 1 |"] 

clear = "  " 
pointer = " ^ " 
subdials = [clear,clear] 

d = {'d0':{},'d1':{}} 
d['d0'] = {'val':2,'disp':dial[2]} 
d['d1'] = {'val':2,'disp':dial[2]} 

def spin(scr): 
    try: 
     curses.curs_set(0) 
    except: 
     pass 

    solved = 0 
    p = 0 
    subdials[p] = pointer 
    dials = [d['d0']['disp'],d['d1']['disp']] 

    maxy,maxx = scr.getmaxyx() 

    newscr = scr.subwin(10,51,maxy-15,0) 
    newscr.box(ord('|'),ord('-')) 
    newscr.addstr(4,8,''.join(dials)) 
    newscr.addstr(6,8,''.join(subdials)) 
    newscr.refresh() 

    while solved == 0: 
     r = scr.getch() 
     subdials[p] = clear 
     currd = 'd'+str(p) 

     if r == ord('q') or r == ord('Q'): 
      break 
     elif r == curses.KEY_LEFT: 
      if p > 0 and p < 2: 
       p -= 1 
      else: pass 
     elif r == curses.KEY_RIGHT: 
      if p >= 0 and p < 1: 
       p += 1 
      else: pass 
     elif r == curses.KEY_UP: 
      if d[currd]['val'] >= 0 and d[currd]['val'] < 5: 
       d[currd]['val'] += 1 
       d[currd]['disp'] = dial[d[currd]['val']] 
      else: pass 
     elif r == curses.KEY_DOWN: 
      if d[currd]['val'] > 0 and d[currd]['val'] <= 5: 
       d[currd]['val'] -= 1 
       d[currd]['disp'] = dial[d[currd]['val']] 
      else: pass 
     else: pass 

     subdials[p] = pointer 
     dials = [d['d0']['disp'],d['d1']['disp']] 

     newscr.addstr(4,8,''.join(dials)) 
     newscr.addstr(6,8,''.join(subdials)) 
     newscr.refresh() 

     if d['d0']['val'] == 5 and d['d1']['val'] == 3: 
      solved = 1 

    if solved == 0: 
     scr.addstr(maxy-1,0,"You can't figure out the lock.") 
    else: 
     scr.addstr(maxy-1,0,"The lock is open!") 
    scr.getch() 
    scr.clear() 
    return solved 

def box(): 
    solved = curses.wrapper(spin) 
    return solved 

'상자'기능을 종료하는 방법은 두 가지가 있습니다, 또는 퍼즐을 해결하여 종료 'Q'를 눌러이. 첫 번째로 저주에서 벗어나면 아무런 문제가 없습니다. 그러나 '상자'를 다시 호출하면 문제가 빨리 발생합니다.

먼저 curses 창에서 내 기능이 pass으로 지시 된 키 입력이 화면에 표시됩니다. 둘째, 그리고 나빠질 때, 퍼즐을 두 번째로 끝낼 때 - 종료 또는 이기기 - noechocbreak이 꺼지지 않으므로 터미널이 채워지고 재설정해야합니다.

(NB가 :. 내가 '상자'를 계속 전화하면, 키 입력이 더 이상 저주 창 자체에 반향되어 있지만, 내 터미널이 정상으로 돌아 가지 않습니다)

내가 할 수없는 내 인생에 대한 이 문제의 원인을 찾아냅니다. 도움!

+0

안녕하세요. 제 콘솔에서 게임을 실행 해 보았습니다. * python curses.py *가 즉시 종료되었습니다. 너 어떻게 지내니? 둘째, cProfile 모듈로 코드를 실행하여 과도한 함수 호출이 있는지 확인할 수 있습니다. * python -m cProfile curses.py *. 이것은 무한 루프를 나타낼 수 있습니다. –

+0

@Aaron Newton - 답변 해 주셔서 감사합니다. 파이썬 인터프리터를 실행하고, 스크립트에서 모든 것을 가져온 다음,'box' 함수를 호출합니다. 장기적으로, 그게 내가하고자하는 일이다.이 스크립트를 독립적으로 실행하는 것이 아니라 내 메인 게임 스크립트 내에서 함수를 호출한다. 이 스크립트에'box()'를 호출하는 줄을 추가하고 cProfile을 사용하여이 스크립트를 실행했습니다. 아무렇지도 않은 것으로 보이지 않았습니다. – Nrvous

+0

삭제 해 주셔서 감사합니다. '>>> 수입 curses_prog 게임 >>> 실행 = game.box >>> 실행 <0x00000000022ABC18에서 기능 상자>로 >>> 실행() 역 추적 (가장 최근 통화 마지막에게 : 나는 다음과 같은 시도했습니다) 파일 = curses.wrapper (스핀) AttributeError 해결 상자에 파일 "curses_prog.py"라인 (78)에서 "", 라인 1 : '모듈'오브젝트가 속성이없는 'wrapper''을 (여기에 서식을 미안). 이것은 단지 무식하거나 Python을 구현 한 것일 수도 있지만 실행시킬 수는 없습니다. –

답변

1

파이썬을 2.7.3으로 업데이트하여 문제가 해결되었습니다. 후자!

관련 문제