2016-11-24 56 views
0

我正在编写一个游戏项目,并正在通过代码完成代码中的一些小错误和功能。我在尝试打印出由文本符号组成的图形框中的用户统计信息时遇到问题。 下面是代码打印变量改变字符的位置

print ("⚜================== Player 1 City ==================⚜") 
print ("⚜BaseHP = " + str (p1_basehp)) 
print ("⚜Troops = " + str (p1_troops)) 
print ("⚜Archers = " + str (p1_archers)) 
print ("⚜Food = " + str (p1_food)) 
print ("⚜===================================================⚜") 

当代码在它看起来像这样的游戏运行。

⚜================== Player 1 City ==================⚜ 
⚜BaseHP = 1000 
⚜Troops = 20 
⚜Archers = 30 
⚜Food = 500 
⚜===================================================⚜ 

但我真的很想有一个盒子里的用户统计,就像这样。

⚜================== Player 1 City ==================⚜ 
⚜BaseHP = 1000         ⚜ 
⚜Troops = 20          ⚜ 
⚜Archers = 30          ⚜ 
⚜Food = 500          ⚜ 
⚜===================================================⚜ 

这是挑剔的,我知道,但我想要做的游戏一个完整的工作,而不是只留下位在游戏中寻找未完成。问题在于,4个列表根据用户的操作改变游戏中的值,因此无法预测它们,这意味着当打印出值时,框右侧的符号不符合。无论4个列表p1_basehp,p1_troops,p1_archers和p1_food如何保持角色在同一个地方。 代码中没有错误,它只是一个查询。

+0

我写了一个模块(HTTPS://pypi.python。 org/pypi/dosbox-screen /),使这些任务更容易。你可以直接使用它(它也适用于* nix)或者查看实现(第375行 - screen.py的结尾是相关的)。 – thebjorn

回答

1

为什么这么复杂?只需使用标准格式的字符串替换与指定的宽度:

print ("⚜================== Player 1 City ==================⚜") 
print ("⚜ %-7s = %-39d ⚜" % ("BaseHP", p1_basehp)) 
print ("⚜ %-7s = %-39d ⚜" % ("Troops", p1_troops)) 
etc. 

或者,如果你将自己对齐的标签:

print("⚜BaseHP = %-39d ⚜" % p1_basehp) 
etc. 
+0

好的,感谢这似乎与更少的代码一起工作! – Sam

0

所以你需要做的就是多做一些额外的空间,因为=的差异是该str值的底线和长度。

print ("⚜BaseHP = " + str (p1_basehp),' '*(40 - len(str(p1_basehp))),'*') 
print ("⚜Troops = " + str (p1_troops),' '*(40 - len(str(p1_troops))),'*') 
print ("⚜Archers = " + str (p1_archers),' '*(40 - len(str(p1_archers))),'*') 
print ("⚜Food = " + str (p1_food),' '*(40 - len(str(p1_food))),'*') 
print ("⚜===================================================⚜") 
1

既然你有固定的长度,每个统计行的第一部分(12个字符)和你的头需要53个字符,你需要的结束字符前放置39个空格,如果你的价值只有一个数字,如果两位数字为38,...等等。 I,E:' '*(40 - len(str(p1_<whatever>)))

# -*- coding: utf-8 -*- 

from random import randint 

p1_archers = randint(1, 1000) 
p1_basehp = randint(1, 1000) 
p1_food = randint(1, 1000) 
p1_troops = randint(1, 1000) 

print ("⚜================== Player 1 City ==================⚜") 
print ("⚜BaseHP = " + str (p1_basehp)) + ' '*(40 - len(str(p1_basehp))) + '⚜' 
print ("⚜Troops = " + str (p1_troops)) + ' '*(40 - len(str(p1_troops))) + '⚜' 
print ("⚜Archers = " + str (p1_archers)) + ' '*(40 - len(str(p1_archers))) + '⚜' 
print ("⚜Food = " + str (p1_food)) + ' '*(40 - len(str(p1_food))) + '⚜' 
print ("⚜===================================================⚜") 

注:我使用random库来证明正确的功能有不同的方案:

⚜===================================================⚜ 
[Vostro-3350 workspace]$ python so.py 
⚜================== Player 1 City ==================⚜ 
⚜BaseHP = 846          ⚜ 
⚜Troops = 334          ⚜ 
⚜Archers = 685          ⚜ 
⚜Food = 94          ⚜ 
⚜===================================================⚜ 
[Vostro-3350 workspace]$ python so.py 
⚜================== Player 1 City ==================⚜ 
⚜BaseHP = 70          ⚜ 
⚜Troops = 8          ⚜ 
⚜Archers = 306          ⚜ 
⚜Food = 411          ⚜ 
⚜===================================================⚜ 
+0

感谢您的回答!解决了我的问题。 – Sam

3

您可以使用PyFormat做到这一点与填充和对齐选项。

In [120]: p1 = 1 
In [121]: p2 = 123 
In [122]: p3 = 12345 
In [123]: print "** BaseHP = " + '{:10}'.format(str(p1)) + '*' 
In [124]: print "** BaseHP = " + '{:10}'.format(str(p2)) + '*' 
In [125]: print "** BaseHP = " + '{:10}'.format(str(p3)) + '*' 

OUTPUT:

** BaseHP = 1   * 
** BaseHP = 123  * 
** BaseHP = 12345  * 

虽然可变的LEN改变整体对准保持不变。

+1

你可以缩短更多'print'⚜{:7} = {:10}⚜“.format('BaseHP',str(p1))' – valentin