打印C中同一行上包含\n的元素

idfiyjo8  于 2023-01-04  发布在  其他
关注(0)|答案(3)|浏览(143)

我是新的C和我想做一个21点游戏。问题是,我想有球员的卡打印在同一行。例如这样:

___________   ___________
| K       K | | Q       Q |
|           | |           |
| +       + | | +       + |
|     +     | |     +     |
| +       + | | +       + |
|           | |           |
| +       + | | +       + |
|     +     | |     +     |
| +       + | | +       + |
|___________| |___________|

但下面的代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    const char *card_k=
    "\n ___________ " 
    "\n| K       K |"
    "\n|           |"
    "\n| +       + |"
    "\n|     +     |"
    "\n| +       + |"
    "\n|           |"
    "\n| +       + |"
    "\n|     +     |"
    "\n| +       + |"
    "\n|___________|";
    const char *card_q=
    "\n ___________ " 
    "\n| Q       Q |"
    "\n|           |"
    "\n| +       + |"
    "\n|     +     |"
    "\n| +       + |"
    "\n|           |"
    "\n| +       + |"
    "\n|     +     |"
    "\n| +       + |"
    "\n|___________|";

    printf("%s",card_k);
    printf("%s",card_q);

    system("Pause");
    return 0;
}

显然打印了这个,因为有了新的行字符:

___________
| K       K |
|           |
| +       + |
|     +     |
| +       + |
|           |
| +       + |
|     +     |
| +       + |
|___________|
 ___________
| Q       Q |
|           |
| +       + |
|     +     |
| +       + |
|           |
| +       + |
|     +     |
| +       + |
|___________|

我认为在python中类似的修复是使用end ='',但我不知道如何在C中做到这一点。任何帮助将不胜感激。

wlp8pajw

wlp8pajw1#

不要混淆数据和输出格式,这是两件不同的事情。解决问题的一种方法是将每张卡片存储为字符指针数组,每个指针指向一个字符串字面量。然后,您可以按照自己的喜好打印数据:

#include <stdio.h>
#include <stdlib.h>

int main()
{
  const char *card_k [] =
  {
    " ___________ ", 
    "| K       K |",
    "|           |",
    "| +       + |",
    "|     +     |",
    "| +       + |",
    "|           |",
    "| +       + |",
    "|     +     |",
    "| +       + |",
    "|___________|",
  };
  const char *card_q [] =
  {
    " ___________ ", 
    "| Q       Q |",
    "|           |",
    "| +       + |",
    "|     +     |",
    "| +       + |",
    "|           |",
    "| +       + |",
    "|     +     |",
    "| +       + |",
    "|___________|",
  };

  size_t lines = sizeof (card_k) / sizeof(*card_k);
  
  // print on the same row
  for(size_t i=0; i<lines; i++)
  {
    printf("%s %s\n", card_k[i], card_q[i]);
  }

  puts("");

  // print on different rows
  for(size_t i=0; i<lines; i++)
  {
    printf("%s\n", card_k[i]);
  }
  puts("");
  for(size_t i=0; i<lines; i++)
  {
    printf("%s\n", card_q[i]);
  }

  return 0;
}
mnemlml8

mnemlml82#

你需要修改卡片的结构,这样你就可以(容易地)在一行上打印多张卡。我建议使用一个结构来保存一张卡的数据-从长远来看,这将使生活变得容易得多。你需要所有的卡都有相同的大小(如果你能通过看牌的大小来发现牌之间的区别,那就很容易作弊了)。然后你有一个函数以指向纸牌图像的指针数组的形式打印一系列纸牌。因为有一个结构,它也可以保存等级(国王,王后,...,A)和花色(梅花,方块,红桃,黑桃)。
所以,正如我在一篇评论中所说:

  • 第1步:从卡片图像中删除换行符,使每张卡片成为一个字符串数组(没有换行符),而不是一个字符串。
  • 第2步:修改打印卡片图像的代码,在页面上打印N个图像,一次一行,图像之间有适当的间隔,并在行尾换行。

或多或少是这样的。我对花色的2到10的名字不太满意--选择适合自己的名字。在很多方面,拼出数字(DEUCE,THREE,FOUR,...,TEN)可能会更好。

代码

#include <stdio.h>

typedef enum { CLUBS, DIAMONDS, HEARTS, SPADES } Suit;
typedef enum { ACE = 1, CARD_2, CARD_3, CARD_4, CARD_5, CARD_6, CARD_7,
               CARD_8, CARD_9, CARD_10, JACK, QUEEN, KING } Rank;
enum { CARD_WIDTH = 14, CARD_HEIGHT = 11 };

typedef struct
{
    Rank rank;
    Suit suit;
    char image[CARD_HEIGHT][CARD_WIDTH];
} Card;

static const Card card_k =
{
    KING, SPADES,
    {
    " ___________ ",
    "| K       K |",
    "|           |",
    "| +       + |",
    "|     +     |",
    "| +       + |",
    "|           |",
    "| +       + |",
    "|     +     |",
    "| +       + |",
    "|___________|",
    }
};

static const Card card_q =
{
    QUEEN, SPADES,
    {
    " ___________ ",
    "| Q       Q |",
    "|           |",
    "| +       + |",
    "|     +     |",
    "| +       + |",
    "|           |",
    "| +       + |",
    "|     +     |",
    "| +       + |",
    "|___________|",
    }
};

static void print_cards(size_t n_cards, const Card *cards[])
{
    for (size_t line = 0; line < CARD_HEIGHT; line++)
    {
        const char *pad = "";
        for (size_t cardnum = 0; cardnum < n_cards; cardnum++)
        {
            printf("%s%s", pad, cards[cardnum]->image[line]);
            pad = "  ";
        }
        putchar('\n');
    }
}

int main(void)
{
    const Card *deck[] = { &card_k, &card_q };
    enum { SIZE_DECK = sizeof(deck) / sizeof(deck[0]) };
    print_cards(SIZE_DECK, deck);
    return 0;
}

输出

___________    ___________ 
| K       K |  | Q       Q |
|           |  |           |
| +       + |  | +       + |
|     +     |  |     +     |
| +       + |  | +       + |
|           |  |           |
| +       + |  | +       + |
|     +     |  |     +     |
| +       + |  | +       + |
|___________|  |___________|
41ik7eoe

41ik7eoe3#

选项2:使用终端控制序列

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define CARD_WIDTH 13
#define CARD_HEIGHT 11

typedef const char card_type [CARD_HEIGHT] [CARD_WIDTH+1];

card_type card_k =
{
  " ___________ ",
  "| K       K |",
  "|           |",
  "| +       + |",
  "|     +     |",
  "| +       + |",
  "|           |",
  "| +       + |",
  "|     +     |",
  "| +       + |",
  "|___________|",
};

card_type card_q =
{
  " ___________ ",
  "| Q       Q |",
  "|           |",
  "| +       + |",
  "|     +     |",
  "| +       + |",
  "|           |",
  "| +       + |",
  "|     +     |",
  "| +       + |",
  "|___________|",
};

void clear_screen()
{
  printf("\033[2J");
}

void goto_xy(int x, int y)
{
  printf("\033[%d;%dH", y+1, x+1);
}

void draw_card_at(int x, int y, card_type card)
{
  for (size_t n=0; n<CARD_HEIGHT; n++)
  {
    goto_xy(x, y++);
    printf("%s", card[n]);
  }
}

int main()
{
  clear_screen();

  // print on the same row
  draw_card_at(2,              2, card_k);
  draw_card_at(2+CARD_WIDTH+1, 2, card_q);
  
  goto_xy(0, CARD_HEIGHT + 5);

  return 0;
}

相关问题