Нарисуйте ASCII-арт елку на C ++ - PullRequest
0 голосов
/ 10 декабря 2018

Я хочу нарисовать ASCII-художественную елку в C ++, используя функции с параметрами.

Это то, что я получил до сих пор, но это работает по большей части, однако при рисовании фактического тела дерева(уходит), кажется, повторяет это несколько раз.

Этот эффект, похоже, увеличивается по мере увеличения высоты дерева.Так, например, если для дерева введена высота 4, то тело будет нарисовано 2 раза.если высота 5, то это нарисовано 3 раза.6 4 раза и так далее.

Любая помощь?

#include <iostream>
using namespace std;

const char BLANK = ' ';     
const char LEAF = '#';      
const char WOOD = '|';      

void drawAXmasTree();
void drawFoliage(int);
void drawTrunk(int);
void getValidHeight(int&);
void drawALineOfFoliage(int, int);

int main()
{
    cout << "Due on 11 December 2018 \n\n";
    drawAXmasTree();
}

void drawAXmasTree()
{
    int treeHeight = 0;

    getValidHeight(treeHeight); //read in a valid value for the tree height
    drawFoliage(treeHeight);            //draw tree foliage
    drawTrunk(treeHeight);          //draw tree trunk
}

void drawFoliage(int trHgt) //draw the foliage
{
    int branchLine = 1;
    int treeHeight = trHgt;

    while (branchLine <= (trHgt - 2))
    {
        drawALineOfFoliage(treeHeight, branchLine); 
        branchLine += 1;
    }
}

void drawTrunk(int trHgt)   //draw the trunk
{
    int trunkLine = 1;
    int spaces;

    while (trunkLine <= 2)  // for each line in the truck
    {
        spaces = 1;

        while (spaces <= (trHgt - 2))   //draw the spaces on the left
        {
            cout << BLANK;
            spaces += 1;
        }

        cout << WOOD;       //draw the truck
        cout << endl;           //go to next line
        trunkLine += 1;
    }
}

void getValidHeight(int& trHgt)
{
    do
    {
        cout << "Enter the size of the tree(4 - 20): ";
        cin >> trHgt;
        if (trHgt < 4 || trHgt > 20)
        {
            cout << "ERROR: Invalid height! ";
        }
    } 
    while (trHgt < 4 || trHgt > 20);
}

void drawALineOfFoliage(int trHgt, int brLine)
{
    int treeHeight = trHgt;
    int branchLine = brLine;
    int spaces = trHgt - 2;

    for (int i = 0; i < (treeHeight - 2); i++) {
        for (int j = spaces; j > 0; j--)
        {
            cout << BLANK;
        }
        for (int foliage = 0; foliage <= i * 2; foliage++)
        {
            cout << LEAF;
        }
        spaces--;
        cout << endl;
    }
}

Ответы [ 3 ]

0 голосов
/ 10 декабря 2018

Спасибо за помощь, мне удалось решить эту проблему, потому что, как люди говорили, оно рисует целое дерево, а не одну линию.Все, что мне нужно было сделать, это изменить функцию drawALineOfFoliage на следующее:

void drawALineOfFoliage(int trHgt, int brLine)
{
    int treeHeight = trHgt;
    int branchLine = brLine - 1;
    int spaces = trHgt - 2;

    for (int i = spaces; i > branchLine; i--)
    {
        cout << BLANK;
    }
    for (int foliage = 0; foliage <= branchLine * 2; foliage++)
    {
        cout << LEAF;
    }
    spaces--;
    cout << endl;   
}
0 голосов
/ 11 декабря 2018

Проверьте это:

    #include <iostream>
    using namespace std;

    const char BLANK = ' ';
    const char LEAF = '#';
    const char WOOD = '|';

    void drawAXmasTree();
    void drawFoliage(int);
    void drawTrunk(int);
    void getValidHeight(int&);
    void drawALineOfFoliage(int, int);

    int main()
    {
        cout << "Due on 11 December 2018 \n\n";
        drawAXmasTree();

        system("pause");
    }

    void drawAXmasTree()
    {
        int treeHeight = 0;

        getValidHeight(treeHeight); 
        drawFoliage(treeHeight);             
        drawTrunk(treeHeight);          
    }

    void drawFoliage(int trHgt) 
    {
        int branchLine = 1;
        int treeHeight = trHgt;

        while (branchLine <= (trHgt - 2))
        {
            drawALineOfFoliage(treeHeight, branchLine);
            branchLine += 1;
        }
    }

    void drawTrunk(int trHgt)   
    {
        int trunkLine = 1;
        int spaces;

        for (trunkLine; trunkLine <= 2; trunkLine++)
        {
            for (spaces = 1; spaces <= (trHgt - 1); spaces++)
            {
                cout << BLANK;
            }
            cout << WOOD;
            cout << "\n";

        }
    }

    void getValidHeight(int& trHgt)
    {
        do
        {
            cout << "Enter the size of the tree(4 - 20): ";
            cin >> trHgt;
            if (trHgt < 4 || trHgt > 20)
            {
                cout << "ERROR: Invalid height! ";
            }
        } while (trHgt < 4 || trHgt > 20);
    }

    void drawALineOfFoliage(int trHgt, int brLine)
    {
        int treeHeight = trHgt;
        int branchLine = brLine;
        int spaces(0);
        int tree(0);

        for (spaces; spaces < (trHgt - branchLine); spaces++)
        {
            cout << BLANK;
        }
        for (tree; tree < (branchLine * 2 - 1); tree++)
        {
            cout << LEAF;
        }
        cout << endl;
    }
0 голосов
/ 10 декабря 2018

Проблема в вашем коде заключается в следующем:

В функции drawFoliage вы намеревались выполнить цикл и вызывать drawALineOfFoliage для каждой строки.Но вы фактически рисуете целое дерево каждый раз, когда вызываете drawALineOfFoliage.

. Чтобы исправить ваш код, просто замените drawFoliage на drawALineOfFoliage в функции drawAXMasTree, например:

void drawAXmasTree()
{
    int treeHeight = 0;

    getValidHeight(treeHeight); //read in a valid value for the tree height
    drawALineOfFoliage(treeHeight); 
    drawTrunk(treeHeight);          
}

Обратите внимание, что вам не нужен второй аргумент в drawALineOfFoliage, поскольку вы на самом деле его не используете.

Что касается drawFoliage, вы можете просто стеретьэто.

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