Hatta Schmidt Ответов: 4

исходный код змеиной игры на c++


мне нужен код змеиной игры souce на c++ для моего project..it просто простая игра.надеюсь, кто-нибудь сможет мне помочь ... спасибо...

-------------------------------------------------------------------------------------------------------------------------
У меня есть простой код для змеиной игры, но он не работает..есть много ошибок, когда я компилирую его..надеюсь, что кто-нибудь может мне помочь..большое спасибо..
#include <stdio>
#include <stdlib>
#include <windows>
#include <conio>
#include <time>
#include <iostream>

void draw(char main[][75], int score);
void reset(char main[][75]);
void move(char main[][75], int &parts, int pastCounter, int past[][2], int &apples, int &score, int &quit);
void check (int &direction);
void directionn(int direction, int &pastCounter, int past[][2]);
void apple (int &apples, char main[][75]);
void quitGame (int score);

int main()
{
    int past[1000][2];
    int parts = 3;
    char main[23][75];
    int pastCounter = 6;
    int direction = 0;
    int apples = 0;
    int score = 0;
    int quit = 0;
    int playAgain = 1;
    unsigned time;
    srand(time(0));

    for (int x = 0; x < 1000; x ++)
    {
        for (int y = 0; y < 2; y ++)
        {
            past [x][y] = 0;
        }
    }
    past[pastCounter][0] = 1;
    past[pastCounter][1] = 1;
    while(quit == 0)
    {
        draw(main, score);
        check(direction);
        directionn(direction, pastCounter, past);
        reset(main);
        move(main, parts, pastCounter, past, apples, score, quit);

        if (apples == 0)
        {
            apple(apples, main);
        }

    }
    quitGame(score);



}
void draw(char main[][75], int score)
{
    system("cls");
    cout<<"Score : %d\n"<<score;
    for (int x = 0; x < 23; x ++)
    {
        for (int y = 0; y < 75; y ++)
        {
            cout << "%c"<< main[x][y];
        }
        cout<<"\n";
    }

}

void reset(char main[][75])
{
    for (int x = 0; x < 23; x++)
        {
            for (int y = 0; y < 75; y++)
            {
                if (main[x][y] == '@')
                {
                    main[x][y] == '@';
                }
                else
                {
                    if (x == 0 || x == 22 || y == 0 || y == 74)
                    {
                        main[x][y] = 177;
                    }
                    else
                    {
                        main[x][y] = ' ';
                    }
                }
            }
        }
}

void move(char main[][75], int &parts, int pastCounter, int past[][2], int &apples, int &score, int &quit)
{
    if (past[pastCounter][0] == 22 || past[pastCounter][0] == 0)
    {
        quit = 1;
    }
    if (past[pastCounter][1] == 74 || past[pastCounter][1] == 0)
    {
        quit = 1;
    }

    for (int x = 0; x < parts; x++)
    {
        if (main[past[pastCounter - x][0]][past[pastCounter - x][1]] == '@')
        {
            apples--;
            parts++;
            score += 10;
        }
        if (main[past[pastCounter - x][0]][past[pastCounter - x][1]] == 'o')
        {
            quit = 1;
        }
        else
        {
        main[past[pastCounter - x][0]][past[pastCounter - x][1]] = 'o';
        }
    }
}
void check (int &direction)
{
    int key = 0;
    if (kbhit())
    {
        key = -getch();
        switch (key)
        {
        case -72:
            direction = 2;
            break;
        case -77:
            direction = 0;
            break;
        case -80:
            direction = 3;
            break;
        case -75:
            direction = 1;
            break;
        }
    }

}
void directionn(int direction, int &pastCounter, int past[][2])
{
    int down;
    right = past[pastCounter][1];
    down = past[pastCounter][0];
    switch (direction)
    {
    case 0:
        right ++;
        break;
    case 1:
        right --;
        break;
    case 2:
        down --;
        break;
    case 3:
        down ++;
    }

    pastCounter ++;
    past[pastCounter][0] = down;
    past[pastCounter][1] = right;
}
void apple (int &apples, char main[][75])
{
    int up = 0;
    int left = 0;
    apples = 3;

    for (int x = 0; x < apples; x ++)
    {
        up = (rand() % 22);
        left = (rand() % 74);

        if (main[up][left] == 'o')
        {
            apple(apples, main);
        }
        if (main[up][left] == '*')
        {
            apple(apples, main);
        }
        else
        {
            main[up][left] = '@';
        }
    }
}




void quitGame (int score)
{
    int quit = 0;
    system ("cls");
    cout << "GAME OVER!!!!\n\n";
    cout << "You got a score of %d\n"<<score;
}

Stefan_Lang

исправлены неверно установленные HTML теги
(пожалуйста, кто бы ни вставил туда этот код: убедитесь, что вы установили правильный предварительный тип!! Единственные символы, которые по какой-то причине требуют HTML-тегов, - это угловые скобки, используемые для операторов include и для аргументов шаблона; все остальное должно быть нет используйте HTML-теги, это может просто исказить вывод)

Member 9432459

что делать если я хочу иметь уровень скорости как уровень 1 для медленного 2 для умеренного до 5

4 Ответов

Рейтинг:
8

_Damian S_

Никто не собирается давать вам ответы на домашние задания. Вам нужно показать, что вы сами пытались выполнить эту работу, а затем опубликовать бит кода, на котором вы застряли.

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


Рейтинг:
35

Stefan_Lang

В ответ на ваш вопрос, смысл сообщений об ошибках компилятора заключается в указании фрагментов кода с неправильным синтаксисом. Для этого компилятор, по крайней мере, выведет номер строки, вызвавшей ошибку, и код ошибки вместе с сообщением, объясняющим код. Поскольку иногда синтаксическая ошибка не может быть решена до следующей строки кода (например, когда отсутствует';'), указанная строка иногда может быть слишком низкой, поэтому убедитесь, что вы смотрите не только на эту строку, но и на строку выше.

Check your compiler output for the very first error or warning (i. e. the first line in your code). Then look at that line and what comes immediately before that. Try to understand the error message - sometimes that text may not appear meaningful to you, but often it can at give a useful hint at what is really wrong. Now try to discern, why the line you're looking at is syntacticaly wrong. If you can find it, fix it. You might want to do that with the other errors as well, but often one syntactical error will get the compiler confused, causing him to indicate a lot more errors that are in truth just a consequence of it's confused state, rather than actual errors. Therefore it may be prudent to just rerun the compiler after fixing the first error you find.

Если вы наткнетесь на сообщение об ошибке, которое не можете решить самостоятельно, не стесняйтесь вернуться к нам и спросить конкретно об этой ошибке. Когда вы это сделаете, пожалуйста, разместите исходный код в указанной строке, а также за несколько строк до этого. Также опубликуйте точное сообщение об ошибке, которое вы получили, чтобы мы могли догадаться, что может быть не так. В большинстве случаев этого должно быть достаточно, чтобы найти проблему или, по крайней мере, задать правильные вопросы, чтобы добраться до ее сути.


Рейтинг:
2

Stefan_Lang

Чтобы добавить к "драгоценным камням", найденным Чаком, похоже, существует полное отсутствие понимания потоков ввода-вывода. Например, когда вы смотрите на функцию draw() :

void draw(char main[][75], int score)
{
    system("cls");
    cout<<"Score : %d\n"<<score;        // 1
    for (int x = 0; x < 23; x ++)
    {
        for (int y = 0; y < 75; y ++)
        {
            cout << "%c"<< main[x][y];  // 2
        }
        cout<<"\n";                     // 3
    }
 
}

1. Вы, кажется, ошибочно принимаете выходные потоки за printf() Форматирование строк для выходных потоков совершенно другое! Нет необходимости указывать тип переменной, так как она автоматически выводится! Поэтому просто опустите "%d " в вашей выходной строке, иначе она будет напечатана буквально.
Кроме того, символ конца строки в конце будет напечатан вместе с остальной строкой, перед счетом. Я сомневаюсь, что это было вашим намерением. (Также см. пункт 3.)

2. то же самое, что и один, и вдобавок вы будете скремблировать свой вывод с бесчисленными выходами строки "%c". Просто удалите эту строку - main[x][y] иметь тип char и будет напечатан как таковой просто отлично.

3. в то время как принудительный разрыв строки, как это будет работать на большинстве систем, некоторые системы используют различные символы для разрыва строки. Поэтому лучше вместо стиля использовать константу std::endl (для конечной линии)

Вот исправленная версия:
void draw(char main[][75], int score)
{
    system("cls");
    cout<<"Score : "<<score << endl;
    for (int x = 0; x < 23; x ++)
    {
        for (int y = 0; y < 75; y ++)
        {
            cout << main[x][y];
        }
        cout<<endl;
    }
 
}


Hatta Schmidt

у меня есть еще один вопрос..как сделать обработку файлов на этом коде..надеюсь, кто-нибудь может мне помочь..пожалуйста!

Stefan_Lang

Что вы подразумеваете под обработкой файлов? Вы хотите читать и записывать в файлы (и что)? Вы можете использовать ifstream и ofstream для этого, они работают почти точно так же, как cin и cout соответственно. Вы можете найти в google дополнительную информацию об этих потоках и, например, код.

Рейтинг:
19

Chuck O'Toole

Поскольку мне было скучно, я попытался скомпилировать это (используя исправленный пост со всеми исправленными и исправленными, спасибо Стефану!).

Вам нужно вернуться туда, где вы это получили, и либо связаться с автором, либо вступить в дискуссию на этом веб-сайте. Этот код испорчен.

Есть такие последовательности, как эта:

if (main[x][y] == '@')
{
    main[x][y] == '@';
}
else ......


Обратите внимание на двойную букву " = " во второй строке. И даже если бы это было единственное"=", утверждение не имеет смысла. "если это знак Ат, установите его как знак Ат". Может быть, это просто наполнитель, потому что другой случай более интересен, но он также может быть просто испорченным программированием.

Там есть и другие драгоценные камни, подобные этому.
unsigned time;
srand(time(0));
где время-это *и* переменная, и функция, которая получает время в качестве основы для семени (я предполагаю, что unix / linux). Компилятору это тоже не нравится.

Я бы сказал, что даже если вы получите его для компиляции, есть шанс, что он не будет работать.

Вот и все для меня на этот раз.