2011-09-05 130 views
-2

問題: 編寫一個程序,將國際象棋棋盤上的一個位置作爲列col和行值列並檢查該位置是否有效。請記住棋盤上的列是從A到H(包含)的字母,行是1到8之間的數字(包含)。 A3或E7是有效輸入,但a1或L5不是。如果兩個座標都是有效的,例如E2,則程序打印'件被移動到E2',否則打印'位置無效'。NameError:未定義名稱'A'

我的回答:

a=raw_input("you move to:") 
col = [A, B, C, D, E, F, G] 
row = [1, 2, 3, 4, 5, 6, 7] 
if (a in col) and (a in row): 
print 'The piece is moved to '%s%d %input 
else: 
print 'The position is not valid.' 

ERROR(像D5的值插入後)

Traceback (most recent call last): 
    File "<web session>", line 2, in <module> 
NameError: name 'A' is not defined 

請求:

能指點我如何解決我的計劃?

背景:

該任務的目的是陷害我來回答以下問題:

到目前爲止,你的程序中使用兩個獨立的輸入:在列和行值。你可以修改你以前的程序(國際象棋問題,版本3),接受棋盤上的位置作爲單一輸入。換句話說,假定存在一個可變位置,它存儲象B5這樣的棋盤的列和行值。當輸入中的兩個座標均有效時,例如c4,程序將輸出消息將塊移動到c4。如果第一個座標超出範圍,則打印第一個座標不在範圍內或AH! ,如果第二個座標超出範圍,則打印第二個座標不在1到8範圍內!

關閉:

感謝您的幫助。

回答

3

的問題是在這裏:

col = [A, B, C, D, E, F, G] 

您的列表應該包含字符串,所以需要引用每個字母就像你如何在print語句引用的字符串。不加引號,他們被視爲標識符(對於變量,類,函數等),這就是你最終的錯誤。

另外,如在Voooza's answer提到的,需要切片/索引輸入字符串(a[0]獲得的第一個字符是字母,並a[1]獲取第二個字符,其是數)。要麼將row中的所有數字都引用,要麼將a[1]轉換爲int,方法是執行int(a[1])以進行比較。

最後,因爲你的原始輸入變量稱爲a,您需要使用a,而不是input格式化你的第一個print聲明。

+0

即使他解決了這個問題,他的比較仍然不起作用。 – agf

+0

@agf:呃,是的...我會在一會兒加上我的答案。 – BoltClock

2
col = ['A', 'B', 'C', 'D', 'E', 'F', 'G'] 

否則它會查找變量A,B,C ......並不能找到他們

+0

我更喜歡這個答案,因爲代碼塊提供了一個解決方案,而不是指出問題。 @BoltClock是正確的,但需要更多的思考才能從他的解決方案中找出答案。 –

+2

@Carl F .:這是一個家庭作業問題,所以我並不想提前提供解決方案。無論哪種方式...... – BoltClock

+0

這是一個很好的觀點。作業應該有不同的回答方式。謝謝。 –

0

需要引用每個「A」,「B」等,讓他們被解析爲字符串,而不是標識符。

0

你需要把字符引號

col = ['A', 'B', 'C', 'D', 'E', 'F', 'G'] 

,你需要使用切片

if (a[0] in col) and (a[1] in row): 
print 'The piece is moved to '%s%d %input 
else: 
print 'The position is not valid.' 

finaly你需要轉換輸入號碼或qoute數行以及

+0

+1,但是你錯過了需要包含'H'和'8'的事實。 – agf

+0

不是真的,OP錯過了, – steabert

-1

完整的程序必須看起來像

col = ['A', 'B', 'C', 'D', 'E', 'F', 'G'] 
row = [1, 2, 3, 4, 5, 6, 7] 
pos=raw_input("you move to:") 
try: 
    x=pos[0] # A1 > A 
    y=pos[1] # A1 > 1 
    if (x in col) and (int(y) in row): 
     print 'The piece is moved to %s' % pos 
except: 
    print 'The position is not valid.' 
+0

這不包括任何兩個字母或更大的條目,其中第二個是一個數字,因爲無效。 '!593utewjvkns.'不會打印任何消息,但不會被發現無效。 – agf

+0

-1因爲我不認爲OP會從中學到什麼,所以與他的想法相距甚遠,也沒有給出任何解釋他所做的是什麼錯 – steabert