Печатать многострочные строки в одной строке

что говорит название. У меня есть программа для игры в кости, и она печатает игру в кости IE.

 ------
|      |
|      |
|     1|
 ------

Я хочу иметь возможность печатать несколько игральных костей, поэтому это выглядит так:

 ------     ------
|      |   |      |
|      |   |      |
|     1|   |     3|
 ------     ------

Я пробовал fmt.Print, но они все равно печатаются друг под другом. Я также думал о создании функции, которая печатает верхнюю строку каждого объекта, но я не мог понять, как это сделать. Любые идеи?


person XXX    schedule 25.03.2016    source источник
comment
Я бы написал вложенный цикл, внешний цикл выбирает строку для печати, внутренний цикл печатает эту строку для каждого из общего количества игральных костей (и числа в строке 3).   -  person Snowman    schedule 25.03.2016


Ответы (2)


Это заботится о печати. Числа рандомизированы от 1 до 6 (включительно). Количество игральных костей, принимаемых в качестве аргумента командной строки. Итак, в моем случае ./roll 6 печатает 6 игральных костей со случайными числами до 6.

package main

import (
    "fmt"
    "math/rand"
    "os"
    "strconv"
    "time"
)

func main() {
    numDice := 1

    if len(os.Args) > 1 {
        i, err := strconv.Atoi(os.Args[1])
        if err != nil {
            fmt.Println(err)
        }
        numDice = i
    }

    seed := rand.NewSource(time.Now().UnixNano())
    randomNumber := rand.New(seed)

    die := []string{
        " ------   ",
        "|      |  ",
        "|      |  ",
        "|      |  ",
        " ------   ",
    }

    for i := 0; i < 5; i++ {
        for j, n := 0, numDice; j < n; j++ {
            if i == 3 {
                fmt.Printf("|    %d |  ", randomNumber.Intn(5)+1)
            } else {
                fmt.Print(die[i])
            }
        }
        fmt.Println()
    }
}
person Snowman    schedule 25.03.2016
comment
Почему это не напечатает последнюю строку? play.golang.org/p/qDw7xzWx6- и как установить 6 постоянных кубиков, не просто напечатать число в рамке кости? - person XXX; 25.03.2016
comment
похоже, что вы печатаете пустую строку над игральными костями (ваша строка начинается с \n) - person Snowman; 25.03.2016
comment
Я отредактировал пример, включив в него изменение количества игральных костей (в качестве аргумента командной строки) и рандомизировал напечатанные цифры. - person Snowman; 25.03.2016
comment
@XXX Мне было весело писать этот пример. Я расширил код и разместил версию здесь: github.com/JormaSnow/roll. - person Snowman; 25.03.2016
comment
play.golang.org/p/pnFGWX8VUy — моя версия. Обычно печатает одинаковое количество кубиков - person XXX; 25.03.2016

package main

import (
    "bytes"
    "fmt"
    "strings"
)

func getDie(n int) []string {
    return []string{
        " ------",
        "|      |",
        "|      |",
        fmt.Sprintf("|%6d|", n),
        " ------",
    }
}

func joinLines(between int, items ...[]string) []string {
    if len(items) == 0 {
        return nil
    }
    if len(items) == 1 {
        return items[0]
    }

    lineCount := 0

    maxSizes := make([]int, len(items))
    for i, item := range items {
        for j, line := range item {
            if maxSizes[i] < len(line) {
                maxSizes[i] = len(line)
            }
            if j+1 > lineCount {
                lineCount = j + 1
            }
        }
    }

    lines := make([]string, lineCount)
    for i := 0; i < lineCount; i++ {
        var buff bytes.Buffer

        for j, item := range items {
            diff := 0
            if j+1 < len(items) {
                diff += maxSizes[j] + between
            }
            if i < len(item) {
                line := item[i]
                buff.WriteString(line)
                diff -= len(line)
            }
            if diff > 0 {
                buff.WriteString(strings.Repeat(" ", diff))
            }
        }

        lines[i] = buff.String()
    }

    return lines
}

func main() {
    a, b, c, d := getDie(2), getDie(3), []string{"", "", "="}, getDie(5)
    all := joinLines(3, a, b, c, d)
    for _, line := range all {
        fmt.Println(line)
    }
}

https://play.golang.org/p/NNrTUDdfyn

person Tim Cooper    schedule 25.03.2016