2017-08-08 3 views
3

Je fais un jeu OO vingt et un. J'ai une classe Card et une classe Deck, le deck est composé d'objets carte. Quand un joueur montre sa main, j'appelle la méthode to_s sur un objet carte que je représente en caractères ascii. Tout cela fonctionne bien sauf que les joueurs impriment une carte l'une sur l'autre. Je me demandais comment j'allais imprimer toute la main côte à côte. J'ai cherché en ligne et ne trouve rien d'autre que d'utiliser l'impression au lieu des puts, mais cela ne résout pas mon problème. Merci d'avance pour tout conseil que vous pourriez avoir.Comment dessiner des objets de cartes côte à côte vs empilés les uns sur les autres dans le terminal

class Card 
    attr_reader :value 
    def initialize(suit, value) 
    @suit = suit 
    @value = value 
    end 

    def to_s 
    """ 
    +-----+ 
    |#{@value} | 
    |  | 
    | #{@suit} | 
    |  | 
    | #{@value}| 
    +-----+ 
    """ 
    end 
end 

Exemple de sortie:

Your Hand: 

    +-----+ 
    |Q | 
    |  | 
    | C | 
    |  | 
    | Q| 
    +-----+ 

    +-----+ 
    |K | 
    |  | 
    | S | 
    |  | 
    | K| 
    +-----+ 
    Your total is 20 

Répondre

3

Permettez-moi de commencer par dire qu'il n'y a pas de solution facile pour ce que vous essayez de faire. Les terminaux sont conçus pour imprimer du texte ligne par ligne, pas colonne par colonne. Et une fois que quelque chose est imprimé sur la console, vous ne pouvez généralement pas revenir en arrière et le modifier. Étant donné que, vous avez deux options:

1) Utiliser ncurses (ou une bibliothèque similaire): ncurses est une bibliothèque pour créer des applications "gui" dans le terminal. La bibliothèque traite le terminal comme une grille de cellules, laissant le développeur spécifier chaque caractère dans chaque cellule à un moment donné. Cela donne au développeur des tonnes de puissance, mais il vous oblige également à ajouter manuellement des fonctionnalités de terminal «traditionnelles» (c'est-à-dire recevoir des entrées utilisateur et imprimer des lignes de sortie).

2) Tampon votre chaîne et l'imprimer à la fois: même si le terminal ne pouvez chaînes d'impression de ligne de texte par ligne, il n'y a rien qui vous empêche de prendre un tas de cartes et réorganisant leurs chaînes manuellement afin qu'ils puissent être imprimé correctement. Il semblait une tâche de programmation intéressante, donc je suis allé de l'avant et il a donné un coup de feu:

def display_hand cards 
    strings = cards.map { |c| c.to_s.each_line.to_a } 
    first, *rest = *strings 
    side_by_side = first.zip *rest 
    side_by_side.each do |row| 
    row.each { |s| print s.chomp } 
    print "\n" 
    end 
end 

display_hand [Card.new("A", 1), Card.new("B", 2), Card.new("C", 3)] 

Ce code prend un tableau de cartes, rassemble leurs représentations de chaîne dans des tableaux et utilise ensuite zip pour les regrouper par ligne. Donc essentiellement au lieu d'imprimer la carte 1, la carte 2, la carte 3, etc., il imprime la ligne 1 de toutes les cartes, la rangée 2 de toutes les cartes, etc.

Espérons que cela aide!

+1

Merci, c'était une solution géniale. J'ai pu jouer avec et travailler dans les différents domaines de mon jeu. Appréciez l'aide! – borgy88