1

I have a program for a Blackjack game. It is not completed but I am having an issue with Unicode. When it prints a string it is not in the correct format (Look Below). It is Python 3.

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('\n\n------------------------------------------------------------------------', color_pair(1) | A_BOLD)
addstr('\n\n\nAre You Ready To Try And Defeat The Undefeated Blackjack Master?\n\n\nThe First One To Win 10 Hands Wins!!!\n\n\nAces Are Counted As 11s And Automaticlly Change To 1 If You Go Over 21. \n\n\nWinning 1 Hand Does Not Mean You Win The Game\n\n\nIt Is Possible To Win But Very Hard!!! Good Luck!!!\n\n\n', color_pair(2))
addstr('------------------------------------------------------------------------', color_pair(1) | A_BOLD)
addstr('\n\nDo You Know The Rules Of Blackjack? (Y or N)\n\n', 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('\n\n\n----------------------------------------------------------------------------------', color_pair(1) | A_BOLD)
 addstr('\n\nOk. That Is Ok. The Rules Are As Follows: \n\nThe Goal Is To Get To 21.\n\nYou Can Hit A Card (Receive Another) Or Stand And See What The Dealer Has And Does.\n\nThe Person With The Higest Value 21 Or Below Wins That Hand.\n\nAces Start As 11s But Change Automatticly To 1s If You Go Over 21 To Save You.\n\nIf You Get 21 Exactly You Get A Blackjack.\n\nA Blackjack Means You Automaticly Win Unless The Computer Gets A 21 And Ties You.\n\nBe Careful Not To Hit Too Many Times Because If You Go Over 21 You Lose That Hand.\n\nAny Face Card Is Automaticly A 10 At All Times.\n', color_pair(2))
 addstr('\n----------------------------------------------------------------------------------\n\n\n', 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('\n\n\n\n\n----------------------------------------------------------------------------------', color_pair(1) | A_BOLD)
 addstr('\n\n\n\nGreat!\n\n\n\nHave Fun!\n\n\n\nGood Luck!\n\n\n', color_pair(2))
 addstr('----------------------------------------------------------------------------------\n\n\n', color_pair(1) | A_BOLD)
 refresh()
 time.sleep(1)
 b = '1'
 a = '' #resets input variable

Here is the line I am having issues with:

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

I tried to encode it with UTF-8 and set Command Prompt to UTF-8 by doing chcp then when I run that program that string prints:

b'\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\x e2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x823 \xe2\x94\x82\n\xe2\x94\x82 \t \xe2\x94\x82\n\xe2\x94\x82 \t \xe2 \x94\x82\n\xe2\x94\x82 \t \xe2\x94\x82\n\xe2\x94\x82 \t \xe2\x94\x82\n\x e2\x94\x82 \t \xe2\x94\x82\n\xe2\x94\x82 \t \xe2\x94\x82\n\xe2\x94\x82 \t \xe2\x94\x82\n\xe2\x94\x82 3\xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe 2\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'

Please help me print the string like it should be and not be in unicode.

If you have any other suggestions on my code let me know.

vestland
62.2k41 gold badges220 silver badges343 bronze badges
asked Aug 7, 2016 at 22:19
2
  • What is the encoding of your source file? Commented Aug 7, 2016 at 22:22
  • You are printing bytes, producing their debugging representation. Decode the bytes first. Commented Aug 7, 2016 at 22:29

1 Answer 1

2

On Windows, unicurses uses ctypes to wrap PDCurses. This library is optionally built with Unicode support in the 32-bit DLLs that are distributed on the project site. FYI, the Unicode versions call console wide-character APIs such as WriteConsoleOutputW, so don't worry about the legacy console codepage. You need the "pdc34dllu.zip" build, which takes UTF-8 encoded parameters. Because the pre-built DLLs are only 32-bit, you'll have to use 32-bit Python, unless you have Visual Studio 2015 installed to build a 64-bit DLL.

You'll also have to make a couple of changes to unicurses to make this work. Here are the steps I followed to get this working for 32-bit Python 3.5:

  1. Download pdc34dllu.zip. Extract "pdcurses.dll" to either Python's installation directory, i.e. where python.exe is located, or to a directory that's in the PATH environment variable.
  2. Download and extract UniCurses-1.2.zip.
  3. Before installing, make the following changes to unicurses.py. On line 34 change code = locale.getpreferredencoding() to code = 'utf-8'. Next, comment out lines 52-54, which start with if not os.access("pdcurses.dll",os.F_OK) because this check will always fail if "pdcurses.dll" isn't in the working directory.
  4. Install the package by running python setup.py install.

example: printing a card

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()

output

 ┌────────────┐
 │5 │
 │ │
 │ │
 │ │
 │ │
 │ │
 │ │
 │ │
 │ 5│
 └────────────┘
answered Aug 8, 2016 at 2:40
Sign up to request clarification or add additional context in comments.

2 Comments

You are the best! Thank you so much. I had to edit your code because I want multiple cards next to each other but it worked. Thanks!
@BrendanNeiman Please don't comment asking for answers on another post.

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.