2011-06-27 40 views
0

這是我的第一個'程序'或腳本或whatev。所以如果我對這個完全錯誤的話,可以隨意取笑我。
我想製作一個文本的玩家vs玩家國際象棋程序。
我的第一個直覺是讓董事會成爲像[[a1,a2 ... a8] ... [h1,h2 ... h8]]這樣的8x8列表,但不確定如何將值附加到項目在列表中,例如被佔用或未佔用的標誌。
然後我有這樣的想法,試圖將每個方塊作爲一個單獨的值來保存它的狀態,如a1 = wr(對於白色車)和a3 = o(對於open),並且在成功移動之後只更新正方形的值。
我的第一反應是把用戶的輸入像如何將原始輸入等同於python中的變量值

move = raw_input("enter your move") 

和用戶需要輸入:
E4例如
我當時就想這樣做:

if move == "o" 

確保廣場將開放
我認爲它很明顯我正在嘗試做什麼,但我明白爲什麼它不起作用。
是有一些方法來投的raw_input的一個變量,以便:

move == o returns TRUE if the variable e4 is o 


編輯:
爲實際的代碼,它真的只在我的頭在這一點上,但這裏是一個鏡頭:

a1=wr 
a2=wp 
a3=o 
a4=o 
a5=o 
a6=o 
a7=bp 
a8=br 

等爲剩餘文件

move = raw_input("enter your move: ") 

- ---這個計劃主要是針對我的,所以我不檢查輸入我只想進入一個類似的舉動:E4

if move == o: 
    then e4 = wp 
    else print "illegal move, square is occupied" 

我知道變量'move'指向字符串'e4',變量e4指向字符串'o',這些是單獨的和不同的實體,但是有一些方法可以接受字符串輸入並檢查是否存在變量具有相同的'名稱'?

真棒感謝所有偉大的答案...

+4

'move = raw_input(「輸入你的舉動」)'確實喜歡分配一個變量。請發佈您的實際代碼以及實際運行時的實際問題。 –

+2

我認爲你的問題很不錯,還有一個體面的學習方式,但你應該清理一些問題。從使用的格式和語言來看有點難 – Daenyth

回答

3

我想到你居然想在這裏什麼是包含板的完整狀態的字典 -

board = { "a1" : "o", "a2" : "k", # ... 
} 

然後你做

if board[move] == "o": 
    # take appropriate action 

任何時候你發現自己在想「我想通過名稱查找變量「,字典很可能是您應該使用的。

2

是的,這是可能的,但一般一個相當可怕的想法,眉頭皺了起來 - 這是緩慢的,哈克,幾乎不再需要,在某些情況下更容易出錯/難以驗證和安全問題的根源(可能不在這裏,但仍然)。

寧可使用dictionaries - 您不需要更改bord表達式,您可以(在檢查輸入的格式是否正確之後)提取數字和字母,然後從該輸入中導出指數請參閱該領域的用戶意味着:

  • 對於數字,它與int轉換爲整數和。減去一個(因爲列表索引從0開始)
  • 地圖的信指數與字典一樣{'a': 0, 'b': 1, ..., 'h':7}(有很多方法可以用較少的代碼來完成此操作,但這個方法簡單而有效)。
2

作爲一般規則,如果您想將用戶輸入轉換爲變量名稱,那麼您做錯了什麼。當然,你可以使用eval(),但沒有什麼好的結果 - 不需要太多的考慮就可以找到惡意用戶可能會濫用的方式,並使非常糟糕的事情發生。當然,在做這個直接變量名稱魔術之前,你可以寫一些規則來驗證輸入,但是使錯誤的方法起作用還有很多工作要做。總是有例外,但作爲初學者,你應該假設這是一個糟糕的想法 - 一旦你知道自己在做什麼,你就會知道例外情況,或者至少在邪惡的時候瞭解情況。

當您正在考慮使用數據結構來保存電路板時,您正處於正確的道路上。有很多方法可以做到這一點 - 嵌套列表是一種有效的方法。爲了貫徹這種方法,您可能需要編寫一個從'e4'轉換到電路板上的位置的函數,可能會讓它真正爲您查找。下一步可能是讓一個Board類&有這種方法(然後有一個move()方法,它將邏輯傳遞給表示每個片類型的對象)。

還有其他有效的解決方法,每個方法都有自己的優缺點。

相關問題