2017-09-14 15 views
1

Pygame 2.7でASCIIアートでゲームを作成しようとしています。アイドルコンソールに移動して次のように入力するだけです:Pygameで印刷不可能な文字を表示

for i in range(255): 
    print str(i) + ' - ' + str(chr(i)) 

私はほぼ255文字になります。しかし、私がPygameで同様のスタントを試してみると:

import pygame, os, string, sys 
from pygame.locals import * 
pygame.init() 

class Prog: 
    def __init__(self): 
     self.title = 'Text' 
     self.screen_size = (800, 600) 
     self.screen = pygame.display.set_mode(self.screen_size) 
     self.bg_color = (255, 255, 255) 
     self.text_color = (0,0,0) 
     self.text_font = 'Times New Roman' 
     self.text_size = 20 
     self.font = pygame.font.SysFont(self.text_font, self.text_size) 

    def draw_text(self, text, x, y): 
     textobj = self.font.render(text, 1, self.text_color) 
     textrect = textobj.get_rect() 
     textrect.center = (x,y) 
     self.screen.blit(textobj, textrect) 
    def main(self): 
     rec = self.screen.get_rect() 
     done = False 
     while not done: 
      for event in pygame.event.get(): 
       if event.type == QUIT: 
        done = True 

      self.screen.fill(self.bg_color) 
      x = 20 
      y = 100 
      n = 1 
      for i in range(1, 255): 
       self.draw_text(chr(i), x, y) 
       x += 20 
       n += 1 
       if n > 25: 
        n = 1 
        x = 20 
        y += 30 
      pygame.display.flip() 

ほとんどが空のボックスです。なぜ矛盾?私はIdleが使うフォントを使っていても、フォントの変更を試みました。私はユニコードとしてそれを解析しようとしました。何も動作していないようです。私が言ったように、それはアイドル状態で印刷され、私が得ることのできないキャラクターのいくつかは、私が演奏する他のASCIIゲームにも存在するという事実のために、それほど気にならないでしょう。レンダリング可能。

誰も助言できますか?私は自己/ google教師のアマチュアであり、正直なところ、余分なモジュールをダウンロードする必要がないことを避けたいと望むだろう。他に何もないなら、私はこの問題に関するコンピュータの明らかな二重標準の説明を解決するでしょう。

ありがとうございます。

答えて

0

私は主な問題は、PygameとIdleがあなたの文字列を解釈するために異なるデフォルトのエンコーディングを使用していると思います。 Python 2の文字列は理解するのが難しいので、私に少し気をつけてください。また、私が間違ってるなら、私を修正し、私はあなたがPythonの2の

ストリングスくらい違ったPythonの3以上の文字列を扱うのPython 2を、使用していると仮定していたバイトのほんのシリーズです。 Python 2のバイト数は、bytesオブジェクトを作成するか、bという文字列を前に付けてバイトリテラルとして表現できます。

'a' == b'a' == bytes(a) 
>>>True 

chr(i)は「ASCIIコードの整数iは、1文字の文字列を返します。」 (Docs)文字列が一連のバイトである場合、chrはバイトを返します。

chr(97) 
>>>'a' 
chr(120) 
>>>'x' 

それらの文字は、インタプリタ出力に現れる理由は、Python 2のデフォルトのエンコーディングはASCIIであるということですので、それはそのバイトの値を見ているとき:我々は、Python 2インタプリタでそれを呼び出す場合はどのようなchrリターンを見てみましょうASCIIチャートのシンボルに対応していれば、バイトをそのシンボルに置き換えます。 ASCIIは値0〜127に対応するシンボルに限定されています。This chartは、各値に対応するシンボルを示します。 97は 'a'、120は 'x'です。

0-31と127は記号を表すのではなく、テキストを読み取るマシンに物事を伝える「制御文字」です。たとえば、C言語では、文字列の終わりはヌル文字で表されます。これはASCIIのコードポイント0です。

chrは0から255までの引き数を受け入れます。制御文字をASCIIで表すchrに整数を渡すとどうなりますか? 127以上の整数を渡すとどうなりますか? Pythonで文字列内の

chr(4) 
>>>'\x04' 
chr(163) 
>>>'\xa3' 

\x次の2つの文字がhexadecimal値を表すことをインタプリタに伝えます。バイト値に対応する記号がASCIIでない場合、インタープリターはバイト値を16進数で表示します。舞台裏では、'a'はちょうど'\x61'ですが、インタプリタは「\のX61は、」何を表すか、私たちを表示するためにASCIIを使用しています。

ASCII以外にも多くのエンコードがあります。 UTF-8はおそらくあなたが聞いたことのある非常に一般的なものです。 ASCIIと同様に、数値と記号を関連づけます。 This chartは、最初の256コードポイントをUTF-8で示しています。

pygame output

ですから、drawtext関数にバイトを渡している、そしてシンボルとして、これらのバイトを解釈するUTF-8を使用しています:彼らはあなたのpygameのコードによって出力されているものに正確に対応します。制御文字に対応する値を取得すると、代わりに正方形が出力されます。

アイドルが異なるシンボルを示すのは、Pygameとは異なるデフォルトのエンコードを使用しているためです。どのようなシンボルが出力されているかわからないと、どのエンコーディングであるかはわかりません。 ISO-8859-1とWindows-1252は非常に一般的な2つのエンコーディングです。アイドルが使用しているエンコードを確認するには、[環境設定]> [一般]に移動し、[デフォルトのソースエンコーディング]オプションを確認します。

あなたはそれについてどうしますか?本当に自分自身をASCIIシンボルに制限したい場合は、stringモジュールを使うことができます。これには有用な文字リストが含まれています。次のコードで、すべての非空白ASCII文字を取得することができます。

import string 
ascii_characters = string.digits + string.letters + string.punctuation 
print ascii_characters 

あなただけのそれらの文字以上のものを使用したい場合は

は、pygameのは、UTF-8の制御文字を描画することはできません。私が見る2つのオプションがあります。

  1. 目的の文字を含むユニコード文字列を渡します。

    # -*- coding: utf-8 -*-
    ...
    self.drawtext(u"€", x, y)

  2. シンボルあなたのためのUnicodeの指定を含むUnicode文字列を渡します。このオプションは、マジックコメントを使って、ファイルの最初の行に異なるデフォルトエンコーディングを宣言する必要があります欲しいです。これは、オプション1

    self.draw_text(u'\u20ac', x, y)

+0

から魔法のコメントを必要としないので、ありがとうございました!私はあなたの記事から何週間も離れて、あなたの記事を見つめていると思う。 :)(私はPythonのドキュメントは、私が現在持っているものをわずかに超えてプログラミング知識のベースラインを取ると思うが、私はそこに行っている!) – queenofthecapes

+0

あなたは大歓迎です!私はpygameを使って独学のプログラマーとして始めたので、とてもうれしく思います。それはまた大きな質問です。文字列がPythonでどのように動作するかについて、私は多くのことを読んで学びました。ゲームの運が良かった! ところで、私が書いたことがあなたの質問に答えたなら、それを答えとして受け入れるのですか?これは、スタックエクスチェンジサイトがあなたに答えをフィードバックする方法です。 [回答礼儀](https://meta.stackexchange.com/questions/19448/etiquette-for-selecting-answers)。ありがとう! – ryanh119

関連する問題