2017-11-28 6 views
0

Ich versuche, ein Schachspiel in Java zu programmieren, das vollständig in der Konsole angezeigt wird. Ich verwende dafür Unicode-Zeichen wie White Chess Queen U + 2655. Mein Problem ist, dass ich keine Leerzeichen finden kann, die der Breite der Schachfiguren entsprechen, so dass ich die Karte nicht korrekt anzeigen kann. Werfen Sie einen Blick auf meinem Ausgang unten, zog ich die Bauern von h2 h4:Java Unicode Zeichenbreiten

8 ♜♞♝♛♚♝♞♜ 
7 ♟♟♟♟♟♟♟♟ 
6     
5     
4    ♙ 
3     
2 ♙♙♙♙♙♙♙ 
1 ♖♘♗♕♔♗♘♖ 
    a b c d e f g h 

Edit: das Problem ist leichter darauf hinzuweisen, mit dem folgende Beispiel:

♙♙♙♙♙♙♙♙ 
xxxxxxxx 
iiiiiiii 
|||||||| 

Sie können sehen, dass die Schachfiguren sind etwas größer in der Breite als die anderen Charaktere unter den Bauern.

Hier auf dieser Website haben die Schachfiguren etwas mehr als die Breite eines Standardzeichens. In meiner Konsole in Eclipse haben die Schachfiguren eine Breite von etwas weniger als 2 Standardzeichen.

Ich nehme an Ich wünsche eine von drei Dinge:

  • ein Leerzeichen, die die Breite der Unicode Schachfiguren übereinstimmt.
  • Eine Java-Methode, die die Breite eines Zeichens oder einer Zeichenfolge zurückgibt
  • Eine Java-Methode, mit der die Breite eines Zeichens oder einer Zeichenfolge auf einen beliebigen Wert festgelegt werden kann.

Danke für jede Hilfe oder Beratung, die Sie anbieten können.

Edit: stellt sich heraus, es war die Consolas Schrift, die mir Probleme verursacht hat. Consolas zeigt Schachfiguren mit einer sehr seltsamen Breite von etwa 1,8 Zeichen. Ich habe die Schriftart meiner Konsole auf ein paar verschiedene Schriftarten mit gleichem Abstand geändert, bis ich eine gefunden hatte, die die Schachfiguren richtig dimensionierte. Gibt es eine Möglichkeit, bestimmte Breiten unabhängig von der Schriftart zu gewährleisten?

+2

Was Sie suchen, ist eine ** font ** mit diesen erforderlichen Eigenschaften, insbesondere ** monospaced **.Aber Sie können Pech haben, dies für Konsolen zu tun, da es kein solches Konzept von Schriften gibt, jeder Benutzer kann die Schriftart angeben, die er verwenden möchte. – luk2302

+0

In Ihrer Drucklogik ist ein Fehler aufgetreten. Sie haben Leerzeichen zwischen Ihren Spalten, aber Sie legen sie nicht zwischen Ihre Teile. – teppic

+0

@teppic Die Leerzeichen werden in meiner Eclipse-Konsole benötigt, aufgrund dessen, was ich über die Breite der Schachfiguren gesagt habe. Sie sind ungefähr 1,9 Zeichen breit in meiner Konsole. – the0dark0one

Antwort

2

Terminals verwenden (fast) immer monospaced Schriftarten, so dass das Leerzeichen die gleiche Breite wie die Stückzeichen hat.

Ihr Problem ist, dass Sie die Platine mit Leerzeichen zwischen den Spalten rendern, aber Sie fügen sie nicht zwischen Ihren Stücken ein.

public class TextChess { 
    public static void main(String[] args) { 
     char[][] board = new char[][] { 
      {'♜', '♞', '♝', '♛', '♚', '♝', '♞', '♜'}, 
      {'♟', '♟', '♟', '♟', '♟', '♟', '♟', '♟'}, 
      {' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '}, 
      {' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '}, 
      {' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '}, 
      {' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '}, 
      {'♙', '♙', '♙', '♙', '♙', '♙', '♙', '♙'}, 
      {'♖', '♘', '♗', '♕', '♔', '♗', '♘', '♖'} 
     }; 

     for (int i = 0; i < board.length; i++) { 
      char[] pieces = board[i]; 
      System.out.print("" + (8 - i) + " "); 
      for (char piece : pieces) { 
       System.out.print(piece + " "); // you're missing this space 
      } 
      System.out.println(); 
     } 
     System.out.println(" a b c d e f g h"); 
    } 
} 

Drucke:

8 ♜ ♞ ♝ ♛ ♚ ♝ ♞ ♜ 
7 ♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟ 
6     
5     
4     
3     
2 ♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙ 
1 ♖ ♘ ♗ ♕ ♔ ♗ ♘ ♖ 
    a b c d e f g h 

Wenn Sie nicht eine proportionale Schrift die Breite der Stücke verwendet, wird mit der Schriftart variieren. Sie möglicherweise übereinstimmen mit einem der Unicode-Räume, vielleicht der En-Raum (\u2002) oder der Em-Raum (\u2003). Jede Lösung wäre spezifisch für Ihre Umgebung. Ref: unicode spaces.

Bearbeiten: Ich habe ein paar Experimente. In den meisten Schriftarten (insbesondere nicht in meiner Version von Helvetica tho ') haben die Schachzeichen die gleiche Breite wie das em-quad (\u2001). Sie werden immer noch Probleme mit Ihren Spaltenbeschriftungen bekommen. Ich habe bemerkt, dass die eingeschlossenen alphanumerischen Glyphen meistens die gleiche Breite wie die Schachfiguren haben, also könntest du die Spalten ⒜-⒣ anstelle von a-h (d. H. \u249C-\u24A3) beschriften.

+0

Die Leerzeichen werden in meiner Eclipse-Konsole benötigt, wegen dem, was ich über die Breite der Schachfiguren gesagt habe. Sie sind ungefähr 1,9 Zeichen breit in meiner Konsole. Ich erkenne, dass Leerzeichen die Ausgabe hier auf Stackoverflow fixieren würden, aber wenn ich ein Bild anhängen könnte, würdest du sehen, was ich meine. – the0dark0one

+0

Sie könnten '\ u2002' oder' \ u2003' versuchen. Weitere Informationen finden Sie unter http://jkorpela.fi/chars/spaces.html. Wenn Sie einen finden, der funktioniert, ist es unwahrscheinlich, dass er außerhalb Ihrer Umgebung funktioniert. – teppic

+0

'\ u2001' sollte funktionieren. Siehe die Bearbeitung der Antwort. – teppic