Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.82/141: Рейтинг темы: голосов - 141, средняя оценка - 4.82
2 / 2 / 2
Регистрация: 26.10.2015
Сообщений: 45
1

Игра "Крестики - нолики"

28.10.2015, 23:26. Просмотров 28110. Ответов 7
Метки нет (Все метки)

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <iostream> //Стандартная библиотека ввода-вывода
#include <cstring> //Стандартная библиотека для работы со строками
using namespace std;
 
char PlayerName1[80],PlayerName2[80]; //Переменные для имен игроков
char cells[9]= {'-','-','-','-','-','-','-','-','-'};//Здесь будут хранится данные о ячейках
 
 
 
// show_cells////
//функция не имеет возвращающего типа, потому что она просто выводит поле
//system("cls") системная функция, которая очищает экран для того чтобы выглядело солидно
void show_cells(){
    system("cls");
 
    cout << "Числа клеток: \n";
    cout << "-" << 1 << "-" <<"|" << "-" << 2 <<"-" << "|" << "-" <<3 << "-"<<endl;
    cout << "-" << 4 << "-" <<"|" << "-" << 5 <<"-" << "|" << "-" <<6 << "-"<<endl;
    cout << "-" << 7 << "-" <<"|" << "-" << 8 <<"-" << "|" << "-" <<9 << "-"<<endl;
 
    cout << "Текущая ситуация (---пустой):\n" << endl;
    cout << "-" << cells[0] << "-" << '|' << "-" << cells[1] << "-" << '|' << "-" << cells[2] << "-" << endl;
    cout << "-" << cells[3] << "-" << '|' << "-" << cells[4] << "-" << '|' << "-" << cells[5] << "-" << endl;
    cout << "-" << cells[6] << "-" << '|' << "-" << cells[7] << "-" << '|' << "-" << cells[8] << "-" << "\n" << endl;
 
}
 
// make_move///////
void make_move(int num){/*это функция тоже ничего не возвращает, но у нее есть аргумент - номеригрока, который будет делать ход*/
    if (num ==1) cout << PlayerName1;
    else cout << PlayerName2;
    int cell;
    cout << ",введите номер ячейки,сделайте свой ход:";
    cin >> cell;
//    cout << "/n";
 
    //Нужно сделать проверку на не занятость клеток
    while(cell > 9 || cell < 1 || cells[cell-1] == 'O' || cells[cell-1] == 'X')
        cout <<"Введите номер правильного ( 1-9 ) или пустой ( --- ) клетки , чтобы сделать ход:";
        cin>>cell;
        cout << "\n";
        //Первый игрок играет "крестиками", а второй - "ноликами"
        if(num == 1) cells[cell-1] = 'X';
            else cells[cell-1] = 'O';
}
 
 
 
char check()
{
   for(int i = 0; i < 3; i++) //Для победы нужны 3 клеточки
      if (cells[i*3] == cells[i*3+1] && cells[i*3+1] == cells[i*3+2]) //Комбинации для победы вычисляются по
         return cells[i]; //разным формулам, эта - по горизонтали
         //0-1-2, 3-4-5 и 6-7-8
         //нумерация в массиве начинается с 0
      else if (cells[i] == cells[i+3] && cells[i+3] == cells[i+6]) //Вертикальная
         return cells[i]; //0-3-6, 1-4-7 и 2-5-8
      else if ((cells[2] == cells[4] && cells[4] == cells[6]) || (cells[0] == cells[4] && cells[4] == cells[8]))
         return cells[i]; //И по диагонали: 0-4-8 и 2-4-6
      return '-'; //Иначе - ничья
}
 
void result() {
   if (win=='X') 
   cout << PlayerName1 << " Выиграли поздравляем " << PlayerName2 << " Вы проиграли..." << endl;
   else if (win=='O') cout << PlayerName2 << " Вы выиграли " << PlayerName1 << " вы проиграли..." << endl;
   else cout << "!!!" << endl;
}
 
char win='-'; //Символ победы ("-" - ничья, "Х" - первого игрока, "О" - второго)
 
int main (int argc, char** argv) {
 
//Вводить имена пользователей//////
/*Функция gets использована для ввода имен игроков с пробелами, в ином случае имя показывалось бы до первого пробела*/
/*Функция из cstring для проверки разности строк она возвращает 0, если строки равны*/
 
 
   do {
      cout << "Введите имя первого игрока : ";
      gets(PlayerName1);
 
      cout << "Введите имя второго игрока: ";
      gets(PlayerName2);
      cout << "\n";
      } while (!strcmp(PlayerName1, PlayerName2));
// //////////////////////////////////////////
   show_cells();
 
   for (int move =1 ;move <=9;move++){
       if(move % 2) make_move(1); //Если ход нечетный, то остаток от деления на будет равен 1 (то есть true)
       else make_move(2);//Если четный, то 0 (false). Тогда если ход нечетный ходит первый игрок
 
       show_cells();
       /*Если номер хода 5 или больше, то проходит проверка на победу (раньше, чем на 5-ом ходе победить нельзя)*/
       if(move >=5)
       {
           win=check();
           if(win!='-')
              break;
       }
       //Цикл закончился и ничто не победил - ничья
 
   }
 
   result();
   system ("pause");
   return 0;
}
Компилятор выдает такую ошибку


/home/wladua/XO/main.cpp:-1: In function 'void result()':

/home/wladua/XO/main.cpp:64: ошибка: 'win' was not declared in this scope
if (win=='X'){
^

0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.10.2015, 23:26
Ответы с готовыми решениями:

"Крестики-нолики": проверить, закончена ли игра выигрышем "крестиков"
Клеточное поле размером 5х5 является результатом игры в крестики-нолики. проверить, закончена игра...

Игра "Крестики нолики", почему не работает проверка окончания?
#include &lt;iostream&gt; using namespace std; int main () { int a,k=0; char mas; while(k&lt;10)...

Игра "Крестики-нолики": правильно выстроить поле
Я очень сильно начинающий программист. Поэтому попрошу сразу не кидатся что я делаю не так и как...

Игра "Крестики-нолики" формат 5х5
Есть данный код игры (позаимствован у юзера Fixer 84), но с массивом 3х3. Нужно сделать 5х5, суть я...

7
Эксперт С++
3057 / 1399 / 421
Регистрация: 19.01.2009
Сообщений: 3,770
28.10.2015, 23:39 2
Цитата Сообщение от wladua2015 Посмотреть сообщение
/home/wladua/XO/main.cpp:64: ошибка: 'win' was not declared in this scope
Переместите строку 70 на строку 4.
0
2 / 2 / 2
Регистрация: 26.10.2015
Сообщений: 45
28.10.2015, 23:46  [ТС] 3
Все спасибо работает!

Добавлено через 1 минуту
Вот работающий код

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <iostream> //Стандартная библиотека ввода-вывода
#include <cstring> //Стандартная библиотека для работы со строками
using namespace std;
 
char win='-'; //Символ победы ("-" - ничья, "Х" - первого игрока, "О" - второго)
char PlayerName1[80],PlayerName2[80]; //Переменные для имен игроков
char cells[9]= {'-','-','-','-','-','-','-','-','-'};//Здесь будут хранится данные о ячейках
 
 
 
// show_cells////
//функция не имеет возвращающего типа, потому что она просто выводит поле
//system("cls") системная функция, которая очищает экран для того чтобы выглядело солидно
void show_cells(){
    system("cls");
 
    cout << "Числа клеток: \n";
    cout << "-" << 1 << "-" <<"|" << "-" << 2 <<"-" << "|" << "-" <<3 << "-"<<endl;
    cout << "-" << 4 << "-" <<"|" << "-" << 5 <<"-" << "|" << "-" <<6 << "-"<<endl;
    cout << "-" << 7 << "-" <<"|" << "-" << 8 <<"-" << "|" << "-" <<9 << "-"<<endl;
 
    cout << "Текущая ситуация (---пустой):\n" << endl;
    cout << "-" << cells[0] << "-" << '|' << "-" << cells[1] << "-" << '|' << "-" << cells[2] << "-" << endl;
    cout << "-" << cells[3] << "-" << '|' << "-" << cells[4] << "-" << '|' << "-" << cells[5] << "-" << endl;
    cout << "-" << cells[6] << "-" << '|' << "-" << cells[7] << "-" << '|' << "-" << cells[8] << "-" << "\n" << endl;
 
}
 
// make_move///////
void make_move(int num){/*это функция тоже ничего не возвращает, но у нее есть аргумент - номеригрока, который будет делать ход*/
    if (num ==1) cout << PlayerName1;
    else cout << PlayerName2;
    int cell;
    cout << ",введите номер ячейки,сделайте свой ход:";
    cin >> cell;
//    cout << "/n";
 
    //Нужно сделать проверку на не занятость клеток
    while(cell > 9 || cell < 1 || cells[cell-1] == 'O' || cells[cell-1] == 'X')
        cout <<"Введите номер правильного ( 1-9 ) или пустой ( --- ) клетки , чтобы сделать ход:";
        cin>>cell;
        cout << "\n";
        //Первый игрок играет "крестиками", а второй - "ноликами"
        if(num == 1) cells[cell-1] = 'X';
            else cells[cell-1] = 'O';
}
 
 
 
char check()
{
   for(int i = 0; i < 3; i++) //Для победы нужны 3 клеточки
      if (cells[i*3] == cells[i*3+1] && cells[i*3+1] == cells[i*3+2]) //Комбинации для победы вычисляются по
         return cells[i]; //разным формулам, эта - по горизонтали
         //0-1-2, 3-4-5 и 6-7-8
         //нумерация в массиве начинается с 0
      else if (cells[i] == cells[i+3] && cells[i+3] == cells[i+6]) //Вертикальная
         return cells[i]; //0-3-6, 1-4-7 и 2-5-8
      else if ((cells[2] == cells[4] && cells[4] == cells[6]) || (cells[0] == cells[4] && cells[4] == cells[8]))
         return cells[i]; //И по диагонали: 0-4-8 и 2-4-6
      return '-'; //Иначе - ничья
}
 
void result() {
   if (win=='X')
   cout << PlayerName1 << "вы  выиграли поздравляем " << PlayerName2 << " а вы проиграли..." << endl;
   else if (win=='O') cout << PlayerName2 << "вы  выиграли поздравляем  " << PlayerName1 << " а вы проиграли..." << endl;
 
}
 
 
int main (int argc, char** argv) {
 
//Вводить имена пользователей//////
/*Функция gets использована для ввода имен игроков с пробелами, в ином случае имя показывалось бы до первого пробела*/
/*Функция из cstring для проверки разности строк она возвращает 0, если строки равны*/
 
 
   do {
      cout << "Введите имя первого игрока : ";
      gets(PlayerName1);
 
      cout << "Введите имя второго игрока: ";
      gets(PlayerName2);
      cout << "\n";
      } while (!strcmp(PlayerName1, PlayerName2));
// //////////////////////////////////////////
   show_cells();
 
   for (int move =1 ;move <=9;move++){
       if(move % 2) make_move(1); //Если ход нечетный, то остаток от деления на будет равен 1 (то есть true)
       else make_move(2);//Если четный, то 0 (false). Тогда если ход нечетный ходит первый игрок
 
       show_cells();
       /*Если номер хода 5 или больше, то проходит проверка на победу (раньше, чем на 5-ом ходе победить нельзя)*/
       if(move >=5)
       {
           win=check();
           if(win!='-')
              break;
       }
       //Цикл закончился и ничто не победил - ничья
 
   }
 
   result();
   system ("pause");
   return 0;
}
Добавлено через 32 секунды
спасибо работает
1
1 / 1 / 0
Регистрация: 26.05.2019
Сообщений: 3
26.05.2019, 15:23 4
У меня этот код не работает, пишет ошибку 'system' was not declared in this scope|
Что system не объявлена в этой области, подскажите пожалуйста, как объявить ?
1
3310 / 2689 / 727
Регистрация: 25.03.2012
Сообщений: 9,716
Записей в блоге: 1
28.05.2019, 02:21 5
StetXEM, ну не стоит буквально брать первый попавшийся код. Возьми лучше мой - он гораздо сложнее и запутаннее, короче, но при этом больше функционала, есть ИИ и управление стрелками - впечатлишься.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <iostream>
#include <functional>
#include <Windows.h>
using namespace std;
const int cell = 4;
void draw_board() {
    for (int y = 0; y <= 3*cell; ++y){
        for (int x = 0; x <= 3 * cell; ++x)
            if (x%cell == 0 && y%cell == 0) cout << "+";
            else if (x%cell == 0) cout << "|";
            else if (y%cell == 0) cout << "-";
            else cout << " ";
        cout << endl;
    }
}
HANDLE output;
COORD input() {
    static COORD cursor = { 2, 2 };
    SetConsoleCursorPosition(output, cursor);
    while (!GetAsyncKeyState(VK_RETURN)){
        const int max_move = 4;
        COORD moves[max_move] = { {2,0}, {0,2}, {1,0}, {0,1} };
        bool moved = false;
        for(int i=0; i< max_move; ++i)
            if (GetAsyncKeyState(VK_LEFT+i)){
                moved = true;
                cursor.X = (moves[i].X*cell + cursor.X) % (3 * cell);
                cursor.Y = (moves[i].Y*cell + cursor.Y) % (3 * cell);
            }
        if (moved) SetConsoleCursorPosition(output, cursor);
        Sleep(100);
    }
    return { (cursor.X - 2) / cell, (cursor.Y - 2) / cell };
}
char board[3][4] = { "   ","   ", "   " };
void iterate(SHORT& it, SHORT& i, SHORT& j,int& x_counter, int& o_counter, COORD& space, function<SHORT(SHORT)> adjust ){
    x_counter = 0, o_counter = 0;   
    for (it = 0; it < 3; ++it)
        if (board[i][adjust(j)] == 'X') ++x_counter;
        else if (board[i][adjust(j)] == 'O') ++o_counter;
        else space = { i, adjust(j) };
}
bool seek_row(COORD& space, int triggerX, int triggerO){
    int x_counter, o_counter;
    SHORT i, j;
    for (i = 0; i < 3; ++i) {
        iterate(j, i, j, x_counter = 0, o_counter = 0, space, [](SHORT x) {return x; } );
        if (x_counter == triggerX && o_counter == triggerO) return true;
        iterate(j, j, i, x_counter = 0, o_counter = 0, space, [](SHORT x) {return x; });
        if (x_counter == triggerX && o_counter == triggerO) return true;
    }
    iterate(i, i, i, x_counter = 0, o_counter = 0, space, [](SHORT x) {return x; });
    if (x_counter == triggerX && o_counter == triggerO) return true;
    iterate(i, i, i, x_counter = 0, o_counter = 0, space, [](SHORT x) {return 2-x; });
    if (x_counter == triggerX && o_counter == triggerO) return true;
    return false;
}
COORD solve(int turn, bool& gameover) {
    gameover = false;
    if (turn == 0) return { 1, 1 };
    if (turn == 1) {
        const int max_case = 8;
        COORD cases[] = { {0,0}, {0,2}, {2,2}, {2,0}, {1,0}, {2,1}, {1,2}, {0,1} };
        COORD answs[] = { {0,2}, {2,2}, {0,2}, {2,2}, {0,2}, {0,0}, {0,0}, {0,2} };
        for (int i = 0; i < max_case; ++i)
            if (board[cases[i].X][cases[i].Y] == 'O') return answs[i];
    }
    COORD space;
    if (seek_row(space, 2, 0)) {
        gameover = true;
        return space;
    }
    if (seek_row(space, 0, 2)) return space;
    return space;
}
void put_X(COORD cursor) {
    board[cursor.X][cursor.Y] = 'X';
    cursor.X = (cursor.X*cell) + 2;
    cursor.Y = (cursor.Y*cell) + 2;
    SetConsoleCursorPosition(output, cursor);
    cout << 'X';
}
int main(){
    output=GetStdHandle(STD_OUTPUT_HANDLE);
    bool gameover = false;
    draw_board();
    int counter = 0;
    while (!gameover) {
        put_X(solve(counter, gameover));
        if (gameover || counter==4) break;
        COORD plr;
        do {
            plr = input();
        } while (board[plr.X][plr.Y] != ' ');
        cout << (board[plr.X][plr.Y] = 'O');
        ++counter;
    }
    SetConsoleCursorPosition(output, {0, 13});
    return 0;
}
0
3310 / 2689 / 727
Регистрация: 25.03.2012
Сообщений: 9,716
Записей в блоге: 1
28.05.2019, 14:20 6
ну как оно? Отзывы? Предложения по коду? Что изменить в стиле программирования?
0
3310 / 2689 / 727
Регистрация: 25.03.2012
Сообщений: 9,716
Записей в блоге: 1
28.05.2019, 21:28 7
исправил.
0
1 / 1 / 0
Регистрация: 26.05.2019
Сообщений: 3
17.09.2019, 07:13 8
В строчке 36
void iterate(SHORT& it, SHORT& i, SHORT& j,int& x_counter, int& o_counter, COORD& space, function<SHORT(SHORT)> adjust )
пишет ошибку, что функция не была объявлена
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.09.2019, 07:13

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Cетевая игра "крестики-нолики"
Помогите, на курсовой задали, сделать сетевую игру крестики-нолики в консоли, нужно сделать сервер...

Игра "Крестики-нолики"
Помогите дописать программу, чтобы выводило, кто победил и может исправить некоторые недочеты,...

Игра "Крестики - Нолики"
Я новичек и захотел написать игру на c++: крестики нолики. Только вместо крестиков и ноликов у меня...

Игра "Крестики-нолики"
Доброго времени суток. Нуждаюсь в помощи! Я написал код игры &quot;Крестики-нолики&quot; по книге и при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.