1

タイトルが言うこと。私はサイコロプログラムを持っていて、サイコロIEを出力します

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

複数のサイコロを印刷できるようにしたいので、次のようになります。

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

試してみfmt.Printましたが、それでも互いに下に印刷されます。各オブジェクトの一番上の行を出力する関数も作成することを考えていましたが、これを行う方法がわかりませんでした。何か案は?

4

2 に答える 2

1
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

于 2016-03-25T14:11:14.747 に答える