Ошибки кода

Ошибки кода

Был написан код игры «Крестики-нолики»:

#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <Windows.h>
using namespace std;
int board_filling[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; // заполнение отдельных клеток поля: 0 - пустая, 1 - крестик, 2 - нолик, 11 - выбор крестика игроком, 22 - выбор нолика игроком
int score[2] = {0, 0}; // счет игрока и компьютера
int team; // чем ходит игрок: 0 - не определено, 1 - крестики, 2 - нолики
int battle; // номер сражения
int text; // текст под полем: 0 - пусто, 1 - жребий
void blue(string text) // синий текст
{
    HANDLE hwnd = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hwnd, (WORD) ((15 << 4) | 9));
    cout << text;
}
void red(string text) // красный текст
{
    HANDLE hwnd = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hwnd, (WORD) ((15 << 4) | 12));
    cout << text;
}
void black(string text) // черный текст
{
    HANDLE hwnd = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hwnd, (WORD) ((15 << 4) | 0));
    cout << text;
}
void square(int square_) // проверка параметров поля и показ клетки соответственно им
{
    switch(board_filling[square_])
    {
        case 0: black(" "); break;
        case 1: black("X"); break;
        case 2: black("O"); break;
        case 11: blue("X"); break;
        case 22: red("O"); break;
    }
}
void board() // проверка параметров игры и показ поля соответственно им
{
    black("  Ты       ");
    switch(team)
    {
        case 0: black("?"); break;
        case 1: blue("X"); break;
        case 2: red("O"); break;
    }
    black("    ");
    switch(score[0])
    {
        case 10: black("10"); break;
        default: black(" "); cout << score[0]; break;
    }
    black("   :   ");
    switch(score[1])
    {
        case 10: black("10"); break;
        default: cout << score[0]; black(" "); break;
    }
    black("   ");
    switch(team)
    {
        case 0: black("?"); break;
        case 1: red("O"); break;
        case 2: blue("X"); break;
    }
    black("  Компьютер \n\n");
    black("               |---|---|---| \n");
    black("               | ");
    square(board_filling[0]);
    black(" | ");
    square(board_filling[1]);
    black(" | ");
    square(board_filling[2]);
    black(" | \n               |---|---|---| \n");
    black("               | ");
    square(board_filling[3]);
    black(" | ");
    square(board_filling[4]);
    black(" | ");
    square(board_filling[5]);
    black(" | \n               |---|---|---| \n");
    black("               | ");
    square(board_filling[6]);
    black(" | ");
    square(board_filling[7]);
    black(" | ");
    square(board_filling[8]);
    black(" | \n               |---|---|---| \n");
    black("               Сражение");
    switch(battle)
    {
        case 10: black("10"); break;
        default: black(" "); cout << battle; break;
    }
    black("/10\n\n");
    switch(text)
    {
        case 0: break;
        case 1: black(" Крестики ходят первыми! Бросаем жребий..."); break;
    }
}
int main()
{
    HANDLE hwnd = GetStdHandle(STD_OUTPUT_HANDLE);
    setlocale(0, "");
    system("color F0");
    // не написан код
    system("pause");
    return 0;
}

В функции main напишем:

int main()
{
    HANDLE hwnd = GetStdHandle(STD_OUTPUT_HANDLE);
    setlocale(0, "");
    system("color F0");
    int board_filling[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
    int score[2] = {0, 0};
    int team = 0;
    int battle = 0;
    int text = 0;
    board();
    system("pause");
    return 0;
}

Выводит в консоль:

Всё хорошо? Изменяем функцию main для вывода крестика в верхнем левом углу:

int main()
{
    HANDLE hwnd = GetStdHandle(STD_OUTPUT_HANDLE);
    setlocale(0, "");
    system("color F0");
    int board_filling[9] = {1, 0, 0, 0, 0, 0, 0, 0, 0};
    int score[2] = {0, 0};
    int team = 0;
    int battle = 0;
    int text = 0;
    board();
    system("pause");
    return 0;
}

Вывод:

Как видим, ничего не изменилось.
Изменим еще и значения переменных перед функциями:

#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <Windows.h>
using namespace std;
int board_filling[9] = {1, 0, 0, 0, 0, 0, 0, 0, 0};
int score[2] = {0, 0};
int team;
int battle;
int text;
// дальнейший код

Выводит:

Наверное, не имеет смысла пояснять вопрос: что происходит?

Во-первых, твой код не скомпилируется.

#include <iostream>
#include <string>        // <-- это необходимо!
//#include <stdio.h>        <-- а эти два хедера можно убрать
//#include <conio.h>
#include <Windows.h>

Во-вторых, здесь

int main()
{
    HANDLE hwnd = GetStdHandle(STD_OUTPUT_HANDLE);
    setlocale(0, "");
    system("color F0");
    int board_filling[9] = {1, 0, 0, 0, 0, 0, 0, 0, 0};
    int score[2] = {0, 0};
    int team = 0;
    int battle = 0;
    int text = 0;
    board();
    system("pause");
    return 0;
}

ты объявляешь новые переменные, локальные для функции main(), которые не имеют никакого отношения к тем переменным, которые объявлены в глобальной области, и которые используются внутри функции board(). Глобальные переменные — зло, но здесь не об этом.

В-третьих, ты просто запутался с функцией square(). Должно быть так:

void square(int square_) // проверка параметров поля и показ клетки соответственно им
{
    switch (square_) {
    case 0: black(" "); break;
    case 1: black("X"); break;
    case 2: black("O"); break;
    case 11: blue("X"); break;
    case 22: red("O"); break;
    default: red("We are in deep ass!"); exit(1);
    }
}
default: red("We are in deep ass!"); exit(1);

🤦🏻‍♂️
Мда, глубже не бывает...

Это я к тому, что здесь в операторе switch ветка default как раз желательна. Она сработает, если у тебя вдруг почему-то в массиве окажется мусор.

А вот конструкции типа

    switch(score[1])
    {
        case 10: black("10"); break;
        default: cout << score[0]; black(" "); break;
    }

лучше переделать на обычный if/else. Работать это конечно будет, но выглядит непривычно — с толку сбивает.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.