Вывести элементы из массива матриц в C? - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь напечатать каждый символ массива матриц для игры по разрушению кирпичей (полное сообщение будет ТЫ ПОТЕРЯЕШЬ). Я новичок в C и не очень уверен в использовании указателей; Я чувствую, что это может быть источником моей проблемы. Чтобы попытаться решить эту проблему, я прочитал множество онлайн-руководств по работе со строками в C; но тот факт, что я имею дело с массивом массивов массивов символов, немного усложняет эту задачу. Если вы знаете, как печатать матрицы строк (в еще одном массиве) в C, или у вас есть лучшее решение, сообщите мне!

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

#define LETTER_WIDTH 13
#define LETTER_HEIGHT 6

char Y[LETTER_HEIGHT][LETTER_WIDTH] = {
"___      __\n",
"\\ \\__ / /\n",
"\\ \\ / /\n",
"|  |  |\n",
"|  |  |\n",
"|__|__|\n"};

char O[LETTER_HEIGHT][LETTER_WIDTH] = {
"  _______ \n",
" /  __   \\\n",
"|  |  |   |\n",
"|  |__|   |\n",
" \\_______/\n"};

char *SENTENCE[2][LETTER_HEIGHT][LETTER_WIDTH] = {*Y, *O};

void printLetter(char letter[LETTER_HEIGHT][LETTER_WIDTH]) {
    for (int i = 0; i < LETTER_HEIGHT; i++) {
        for (int j = 0; j < LETTER_WIDTH; j++) {
            printf("%c", letter[i][j]);
        }
    }
}

void printSentence() {
    for (int i = 0; i < 2; i++) {
        char letter[LETTER_HEIGHT][LETTER_WIDTH];
        strcpy(*letter, **SENTENCE[i]);
        printLetter(letter);
        sleep(1);
    }
}


int main() {
    printSentence();
    return 0;
}

Ответы [ 2 ]

2 голосов
/ 10 июля 2020

Во-первых, это должно быть лучше

char* Y[LETTER_HEIGHT] = {
"___      __\n",
"\\ \\__ / /\n",
"\\ \\ / /\n",
"|  |  |\n",
"|  |  |\n",
"|__|__|\n"};

char* O[LETTER_HEIGHT] = {
"  _______ \n",
" /  __   \\\n",
"|  |  |   |\n",
"|  |__|   |\n",
" \\_______/\n"};

Теперь это массивы размером 6 (вы должны добавить одну строку, потому что теперь O имеет высоту 5), содержащие указатели на массивы символов. Далее

char** SENTENCE[2] = {Y, O};

Вы делали некоторые действительно странные вещи с этой строкой раньше, это определяет SENTENCE как двухэлементный массив указателей на массив указателей на массивы char (это Y и O). Далее

void printLetter(char** letter) {
    for (int i = 0; i < LETTER_HEIGHT; i++) {
        printf("%s", letter[i]);
    }
}

Эта функция принимает указатель на массив указателей на массивы символов. Затем идет 6 раз и выводит каждый массив в виде строки. Далее

void printSentence() {
    for (int i = 0; i < 2; i++) {
        printLetter(SENTENCE[i]);
        sleep(1);
    }
}

Здесь вы можете использовать simple for l oop для передачи printLetter каждого указателя на массив указателей на массивы символов (которые являются этими буквами) из SENTENCE.

1 голос
/ 10 июля 2020

или у вас есть лучшее решение, дайте мне знать!

Да, есть гораздо более простое и, я бы сказал, лучшее решение, это поместить SENTENCE в один 2D-массив и распечатать его в одном go, даже если вы собираетесь использовать ncurses, это упростит вашу работу.

Обратите внимание, что с помощью ncurses вы можете переместить курсор, чтобы вы можете печатать каждую букву отдельно в одной строке, вам не нужно объединять их вместе, как вы пытаетесь сделать в SENTENCE.

#define LETTER_WIDTH 100
#define LETTER_HEIGHT 6

char SENTENCE[LETTER_HEIGHT][LETTER_WIDTH] = {
    "__    __   ______ \n",
    "\\ \\  / /  /  __  \\\n",
    " \\ \\/ /   | |  | |\n", 
    "  |  |    | |  | |\n",
    "  |  |    | |__| |\n",
    "  |__|    \\______/\n"};
    

void printSentence()
{
    for (int i = 0; i < 6; i++)
    {
        printf("%s", SENTENCE[i]);
    }
}

Вывод:

__    __   ______
\ \  / /  /  __  \
 \ \/ /   | |  | |
  |  |    | |  | |
  |  |    | |__| |
  |__|    \______/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...