2012-05-18 17 views
2

我在終端遊戲中使用curses(Mac OSX,Python 2.6.5)。難題涉及旋轉一些撥號打開鎖。我的代碼,稍微簡化(原諒醜陋):Python:調用'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

Hello Nrvous。我試着在遊戲機上運行你的遊戲,並徹底退出,例如* python curses.py *立即終止。你如何運行它?其次,您可以嘗試使用cProfile模塊運行代碼,以查看是否有任何過多的函數調用 - * python -m cProfile curses.py *。這可能表明一個無限循環。 –

+0

@Aaron Newton - 感謝您的回覆。我運行python解釋器,從腳本中導入所有內容,然後調用'box'函數。從長遠來看,這就是我打算做的 - 從主遊戲腳本中調用函數,而不是獨立運行此腳本。我試着給這個調用'box()'的腳本添加一行,並使用cProfile來運行它 - 它似乎沒有任何不適。 – Nrvous

+0

感謝您解決這個問題。我嘗試了以下方法:>>> import curses_prog as game >>> run = game.box >>> run >>> run() Traceback(最近一次調用last ): 文件 「」,第1行,在 文件 「curses_prog.py」,線78,在解決= curses.wrapper(自旋) AttributeError的框 : '模塊' 對象沒有屬性「wrapper''(對此格式的抱歉)。這可能只是無知或我的Python的實現,但我無法讓它運行。 –

回答

1

我更新了Python到2.7.3,並且問題消失了。好哇!