Unicode Python Windows Console



我有一个二十一点游戏的程序。它还没有完成,但我有一个统一码的问题。当它打印一个字符串时,它的格式不正确(见下文)。

from unicurses import *
import sys
import time
from random import choice as rc
import random
def total(hand): #total
    aces = hand.count(11)
    t = sum(hand)
    if t > 21 and aces > 0:
        while aces > 0 and t > 21:
            t -= 10
            aces -= 1
    return t
def random(one,two):
    import random
    number = random.randint(one,two)
    return number
def number():
    number = random(1,13)
    if number == 13:
        value = '0'
    elif number == 12:
        value = '0'
    elif number == 11:
        value = '0'
    elif number == 10:
        value = '0'
    elif number < 10:
        value = number
    return value
def card():
    cardnumber = number()
    card = cardnumber
    return card
def store10Cards():
    tenCards = [card(),
               card(),
               card(),
               card(),
               card(),
               card(),
               card(),
               card(),
               card(),
               card()]
    return tenCards
stdscr = initscr()
cards = store10Cards()
mvaddstr(10, 10, '┌──────────┐n│{}         │n│           │n│            │n│            │n│            │n│            │n│            │n│            │n│         {}│n└──────────┘'.format(cards[0], cards[0]).encode('utf-8'))

#deck = [] #deck of cards
#cwin = 0 #computer wins
#pwin = 0 #player wins
#for i in range (2, 11):
   # for j in range ([24, 72][i == 10]):
       # deck.append(i)
#stdscr = initscr() #Start the standard screen 
start_color() #Start the color service
init_pair(1, COLOR_RED, 0) #color pair 1 is red text and no highlighting
init_pair(2, COLOR_WHITE, 0) #color pair 2 is white text and no highlighting
addstr('nn------------------------------------------------------------------------', color_pair(1) | A_BOLD)
addstr('nnnAre You Ready To Try And Defeat The Undefeated Blackjack Master?nnnThe First One To Win 10 Hands Wins!!!nnnAces Are Counted As 11s And Automaticlly Change To 1 If You Go Over 21. nnnWinning 1 Hand Does Not Mean You Win The GamennnIt Is Possible To Win But Very Hard!!!                  Good Luck!!!nnn', color_pair(2))
addstr('------------------------------------------------------------------------', color_pair(1) | A_BOLD)
addstr('nnDo You Know The Rules Of Blackjack? (Y or N)nn', color_pair(2))
addstr('------------------------------------------------------------------------', color_pair(1) | A_BOLD)
refresh() #refreshes
cbreak() #lets user do Ctrl + C
noecho() #Stops inputs from being shown
a = getch() #Gets input
while a == ord('q'): #Checks if input is q
    clear() #clears before exit
    exit() #quits
while a == ord('n'): #Checks if input is n
    clear() #clears before displaying the next text
    addstr('nnn----------------------------------------------------------------------------------', color_pair(1) | A_BOLD)
    addstr('nnOk. That Is Ok. The Rules Are As Follows: nnThe Goal Is To Get To 21.nnYou Can Hit A Card (Receive Another) Or Stand And See What The Dealer Has And Does.nnThe Person With The Higest Value 21 Or Below Wins That Hand.nnAces Start As 11s But Change Automatticly To 1s If You Go Over 21 To Save You.nnIf You Get 21 Exactly You Get A Blackjack.nnA Blackjack Means You Automaticly Win Unless The Computer Gets A 21 And Ties You.nnBe Careful Not To Hit Too Many Times Because If You Go Over 21 You Lose That Hand.nnAny Face Card Is Automaticly A 10 At All Times.n', color_pair(2))
    addstr('n----------------------------------------------------------------------------------nnn', color_pair(1) | A_BOLD)
    sleep(15)
    a = getch() #resets input variable
    while a == ord('q'): #Checks if input is q
        clear() #Clears before exit
        exit() #quits
while a == ord('y'): #Checks if input is y
    clear() #clears before displaying the next text
    addstr('nnnnn----------------------------------------------------------------------------------', color_pair(1) | A_BOLD)
    addstr('nnnnGreat!nnnnHave Fun!nnnnGood Luck!nnn', color_pair(2))
    addstr('----------------------------------------------------------------------------------nnn', color_pair(1) | A_BOLD)
    refresh()
    time.sleep(1)
    b = '1'
    a = '' #resets input variable

这是我遇到问题的那一行:

mvaddstr(10, 10, '┌──────────┐n│{}         │n│           │n│            │n│            │n│            │n│            │n│            │n│            │n│         {}│n└──────────┘'.format(cards[0], cards[0]).encode('utf-8'))

我尝试用UTF-8编码,并通过执行chcp将命令提示符设置为UTF-8,然后当我运行该程序时,字符串打印:

b xe2 x94 x8c xe2 x94 x80 xe2 x94 x80 xe2 x94 x80 xe2 x94 x80 xe2 x94 x80 xe2 x94 x80 xe2 x94 x80 xe2 x94 x80 xe2 x94 x80 xe2 x94 x80 xe2 x94 x90 n xe2 x94 x823xe2x94x82nxe2x94x82 t xe2x94x82nxe2x94x82 t xe2x94x82n x94x82 t xe2x94x82nxe2x94x82 t xe2x94x82nxE2 x94x82 t xe2x94x82nxe2x94x82 t xe2x94x82nxe2x94x82t xe2x94x82nxe2x94x82 3xe2x94x82nxe2x94x94xe2x94x80xe2 x94 x80 xe2 x94 x80 xe2 x94 x80 xe2 x94 x80 xe2 x94 x80 xe2 x94 x80 xe2 x94 x80 xe2 x94 x80 xe2 x94 x80 xe2 x94 x98 '

请帮我打印字符串,就像它应该是,而不是在unicode。

如果你对我的代码有任何其他建议,请告诉我。

在Windows上,unicurses使用ctypes来包装PDCurses。此库可选择在项目站点上分发的32位dll中使用Unicode支持构建。仅供参考,Unicode版本调用控制台宽字符api,如WriteConsoleOutputW,所以不要担心遗留的控制台代码页。您需要"pdc34dll .zip"构建,它接受UTF-8编码的参数。因为预构建的DLL只有32位,所以你必须使用32位Python,除非你安装了Visual Studio 2015来构建64位DLL。

您还必须对unicurses进行一些更改才能使此工作。以下是我在32位Python 3.5上实现此功能的步骤:

  1. pdc34dllu.zip下载。将"pdcurses.dll"解压到Python的安装目录,即Python .exe所在的目录,或者解压到PATH环境变量中的目录。
  2. 下载并解压UniCurses-1.2.zip。
  3. 在安装之前,对unicurses.py进行以下更改。在第34行将code = locale.getpreferredencoding()更改为code = 'utf-8'。接下来,注释掉以if not os.access("pdcurses.dll",os.F_OK)开头的第52-54行,因为如果"pdcurses.dll"不在工作目录中,此检查总是会失败。
  4. 运行python setup.py install安装包

示例:打印卡片

import unicurses
card_template = 'n'.join([
    '┌────────────┐',
    '│{card}           │',
    '│            │',
    '│            │',
    '│            │',
    '│            │',
    '│            │',
    '│            │',
    '│            │',
    '│           {card}│',
    '└────────────┘'])
def main():
    stdscr = unicurses.initscr()
    unicurses.clear()
    card_string = card_template.format(card=5)
    for i, line in enumerate(card_string.splitlines()):
        unicurses.mvaddstr(5 + i, 5, line)
    unicurses.refresh()
    unicurses.endwin()
if __name__ == '__main__':
    main()

输出
     ┌────────────┐
     │5           │
     │            │
     │            │
     │            │
     │            │
     │            │
     │            │
     │            │
     │           5│
     └────────────┘

最新更新