С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/47: Рейтинг темы: голосов - 47, средняя оценка - 4.60
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
1

Проверка каждого элемента массива

01.01.2016, 21:29. Показов 9273. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет, у меня в программе крестики нолики есть массив board[3][3]. В начале моей программе все элементы массива становятся равны ' ' (пробелу), пользователь постепенно заполняет каждый элемент крестиком или ноликом. И у меня вопрос, когда пользователь заполнит все пробелы, как мне сделать так, чтобы программа проверяла, остались ли еще пробелы в массиве или же пользователь уже все заполнил?
Я что-то писал и получилось так:
C++
1
2
3
4
5
6
7
for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            if (board[j][i] != ' ') {
                cout << "Draw!\n";
            }
        }
    }
Это, конечно же, не работает, но я вроде на правильном пути, не так ли? Если не трудно, скажите, как написать проверку каждого элемента на неравенство пробелу.
У меня только так вышло, но это очень некрасиво:
C++
1
2
3
4
5
if (((board[0][0]) != ' ') && ((board[0][1]) != ' ') && ((board[0][2]) != ' ') && ((board[1][0]) != ' ') && ((board[1][1]) != ' ') && ((board[1][2]) != ' ') && ((board[2][0]) != ' ') && ((board[2][1]) != ' ') && ((board[2][2]) != ' ') && Draw == 1) {
        cout << "\n--------------------------------------------------------------------------------\n" << endl;
        cout << "Draw!";
        gameEnd = 1;
    }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.01.2016, 21:29
Ответы с готовыми решениями:

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

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

После каждого нечетного элемента массива вставить максимальный простой элемент этого же массива
ЗАДАЧА 1. В целочисленный массив X(n) после каждого нечетного элемента вставить максимальный...

Вставить после каждого нечетного элемента массива максимальный простой элемент этого же массива
В целочисленный массив X(n) после каждого нечетного элемента вставить максимальный простой элемент...

22
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
01.01.2016, 21:59 2
Цитата Сообщение от meJevin Посмотреть сообщение
Это, конечно же, не работает,
Должно работать, только индексы (i, j) ты там спутал.

Добавлено через 1 минуту
И зачем на неравенство пробелу проверяешь? Проверяй на равенство. Если есть пробел, то массив не заполнен.
0
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
01.01.2016, 22:15  [ТС] 3
Неа, оно не работает. Я могу скинуть всю программу, чтобы виднее было, как там все работает. Попробуй заполнить все клетки, чтобы ни один игрок не выиграл. Она работает, но в конце TicTacToeGame.cpp есть та некрасивая линия, которую я и хочу заменить на for луп(она отмечена комментарием //Checking for draw). Но когда и заменяю ту некрасивую линию на for луп, ничья перестает показываться.
Main.cpp:
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
#include <iostream> 
#include <string>
#include <vector>
#include <conio.h>
#include "TicTacToeGame.h"
 
using namespace std;
 
char answer;
 
int main() {
 
    TicTacToeGame ticTac;
    game:
    ticTac.clearBoard();
    do {
        do {
            ticTac.printBoard();
            ticTac.makeMove();
            ticTac.checkEnd();
            ticTac.printBoard();
        } while (ticTac.checkEnd() == 0);
        cout << " Wanna play again(Y or N)? "; cin >> answer;
        if (answer == 'y' || answer == 'Y') 
            goto  game;
        else if (answer == 'n' || answer == 'N') 
            break;
        else
            cout << "Invalid inpput. Try again!\n";
    } while (answer != 'n' || answer != 'N');
 
    return 0;
}
TicTacToeGame.h:
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
#pragma once
#include <iostream> 
#include <string>
#include <vector>
#include <conio.h>
 
using namespace std;
 
class TicTacToeGame
{
public:
    TicTacToeGame();
    void printBoard();
    void makeMove();
    int checkEnd();
    void clearBoard();
    void coutWin(string playerName);
private:
    char board[3][3];
    int x; int y;
    char turn = '1';
    int endMove = 0;
    int gameEnd = 0; int Draw = 1;
    char P1 = 'X'; char P2 = 'O';
    string P1name; string P2name;
};
TicTacToeGame.cpp:
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include "TicTacToeGame.h"
 
 
 
TicTacToeGame::TicTacToeGame(){
    system("cls");
    cout << "\n________________________________________________________________________________\n\n" << "                          Welcome to TicTacToe v0.3!\n\n";
    cout << "\n________________________________________________________________________________\n";
    cout << "\n\nPlease enter a first player's name: ";
    cin >> P1name;
    cout << "\n\n" << "Please enter a second player's name: ";
    cin >> P2name;
}
void TicTacToeGame::clearBoard() {
    turn = '1';
    endMove = 0;
    gameEnd = 0;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            board[j][i] = ' ';
        }
        cout << endl;
    }
}
void TicTacToeGame::printBoard(){
    system("cls");
    cout << "\n________________________________________________________________________________\n";
    cout << "                                 "; cout << " 1  2  3\n";
    cout << "                                 "; cout << "=========\n";
    for (int i = 0; i < 3; i++) {
        cout << "                                 ";
        for (int j = 0; j < 3; j++) {
            cout << "|"; cout << board[j][i]; cout << "|";
        }
        cout << " " << (i+1);
        cout << endl  << "                                 " << "=========" << endl;
    }
}
void TicTacToeGame::makeMove() {
    cout << "\n--------------------------------------------------------------------------------\n" << endl;
    if (turn == '1') {
        do {
            endMove = 0;
            cout << P1name << ", plaese, enter X coordinates of your move: ";
            cin >> x;
            cout << P1name << ", please, enter Y coordinates of your move: ";
            cin >> y;
            if (board[x - 1][y - 1] == ' ') {
                board[x - 1][y - 1] = P1;
                endMove = 1;
                turn = '2';
            }
            else {
                cout << "Invalid move! Try again\n";
            }
        } while (endMove != 1);
    }
    else if (turn == '2') {
        do {
            endMove = 0;
            cout << P2name << ", plaese, enter X coordinates of your move: ";
            cin >> x;
            cout << P2name << ", plaese, enter Y coordinates of your move: ";
            cin >> y;
            if (board[x - 1][y - 1] == ' ') {
                board[x - 1][y - 1] = P2;
                endMove = 1;
                turn = '1';
            }
            else {
                cout << "Invalid move! Try again\n";
            }
        } while (endMove != 1);
    }
}
int TicTacToeGame::checkEnd() {
 
    //Check for player 1 win
    for (int i = 0; i < 3; i++) {
        if ((board[0][i] == P1) && (board[1][i] == P1) && (board[2][i] == P1)) {
            coutWin(P1name);
        }
    }
    if ((board[0][0] == P1) && (board[1][1] == P1) && (board[2][2] == P1)) {
        coutWin(P1name);
    }
    if ((board[0][2] == P1) && (board[1][1] == P1) && (board[2][0] == P1)) {
        coutWin(P1name);
    }
    for (int i = 0; i < 3; i++) {
        if ((board[i][0] == P1) && (board[i][1] == P1) && (board[i][2] == P1)) {
            coutWin(P1name);
        }
    }
 
    //Check for player 2 win
    for (int i = 0; i < 3; i++) {
        if ((board[0][i] == P2) && (board[1][i] == P2) && (board[2][i] == P2)) {
            coutWin(P2name);
        }
    }
    if ((board[0][0] == P2) && (board[1][1] == P2) && (board[2][2] == P2)) {
        coutWin(P2name);
    }
    if ((board[0][2] == P2) && (board[1][1] == P2) && (board[2][0] == P2)) {
        coutWin(P2name);
    }
    for (int i = 0; i < 3; i++) {
        if ((board[i][0] == P2) && (board[i][1] == P2) && (board[i][2] == P2)) {
            coutWin(P2name);
        }
    }
    //Checking for a draw
    if (((board[0][0]) != ' ') && ((board[0][1]) != ' ') && ((board[0][2]) != ' ') && ((board[1][0]) != ' ') && ((board[1][1]) != ' ') && ((board[1][2]) != ' ') && ((board[2][0]) != ' ') && ((board[2][1]) != ' ') && ((board[2][2]) != ' ') && Draw == 1) {
        cout << "\n--------------------------------------------------------------------------------\n" << endl;
        cout << "Draw!";
        gameEnd = 1;
    }
    return gameEnd;
}
void TicTacToeGame::coutWin(string playerName) {
    Draw = 0;
    cout << "\n--------------------------------------------------------------------------------\n" << endl;
    cout << playerName << " won!";
    gameEnd = 1;
}
Добавлено через 7 минут
Цитата Сообщение от nord_v Посмотреть сообщение
Должно работать, только индексы (i, j) ты там спутал.
Добавлено через 1 минуту
И зачем на неравенство пробелу проверяешь? Проверяй на равенство. Если есть пробел, то массив не заполнен.
Я скинул выше программу.
0
Dimension
594 / 462 / 223
Регистрация: 08.04.2014
Сообщений: 1,710
01.01.2016, 22:26 4
Цитата Сообщение от meJevin Посмотреть сообщение
if (board[j][i] != ' ')
C++
1
if (board[j][i] == ' ')
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
01.01.2016, 22:37 5
Цитата Сообщение от meJevin Посмотреть сообщение
//Checking for a draw
C++
1
2
3
4
5
if (((board[0][0]) != ' ') && ((board[0][1]) != ' ') && ((board[0][2]) != ' ') && ((board[1][0]) != ' ') && ((board[1][1]) != ' ') && ((board[1][2]) != ' ') && ((board[2][0]) != ' ') && ((board[2][1]) != ' ') && ((board[2][2]) != ' ') && Draw == 1) {
cout << "\n--------------------------------------------------------------------------------\n" << endl;
cout << "Draw!";
gameEnd = 1;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
bool flag = true;
for (int i = 0; i < 3; i++) 
{
        for (int j = 0; j < 3; j++) 
        {
            if (board[i][j] == ' ') 
            {
                flag = false;
                break;
            }
        }
        if (!false)
            break;
}
 if (!flag && Draw == 1)
 {
     cout << "\n--------------------------------------------------------------------------------\n" << endl;
     cout << "Draw!";
     gameEnd = 1;
 }
0
6 / 6 / 1
Регистрация: 27.12.2014
Сообщений: 67
01.01.2016, 22:38 6
Цитата Сообщение от nord_v Посмотреть сообщение
C++
1
if (i == 3 && j == 3 && Draw == 1)
Ага, i, j undeclared in this statment.
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
01.01.2016, 22:39 7
Добавлено через 1 минуту
Цитата Сообщение от Kirik516 Посмотреть сообщение
Ага, i, j undeclared in this statment.
Это-то не проблема (достаточно объявить их до for), но у меня там другое не учитывалось, исправил уже.
0
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
01.01.2016, 22:42  [ТС] 8
Цитата Сообщение от nord_v Посмотреть сообщение
...
Неа. Не все клетки заполнены
Миниатюры
Проверка каждого элемента массива  
0
6 / 6 / 1
Регистрация: 27.12.2014
Сообщений: 67
01.01.2016, 22:42 9
Цитата Сообщение от meJevin Посмотреть сообщение
C++
1
2
3
4
5
6
char turn = '1';
int endMove = 0; 
nt gameEnd = 0;
int Draw = 1;
char P1 = 'X';
char P2 = 'O';
Инициализировать во время объявления класса нехорошо. Все инициализации неплохо бы в конструктор перенести.
Кроме того есть метод clearBoard();. Непонятно зачем нужна тогда эта инициализация.
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
01.01.2016, 22:43 10
Цитата Сообщение от meJevin Посмотреть сообщение
Неа. Не все клетки заполнены
Вот это исправь:
C++
1
if (flag && Draw == 1)
0
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
01.01.2016, 22:52  [ТС] 11
Цитата Сообщение от Kirik516 Посмотреть сообщение
Инициализировать во время объявления класса нехорошо. Все инициализации неплохо бы в конструктор перенести.
Кроме того есть метод clearBoard();. Непонятно зачем нужна тогда эта инициализация.
Я не долго изучаю С++, поэтому я об инициализации в классе не так сильно забочусь. Я просто хочу заставить for луп проверить каждый элемента моего массива board на неравенство пробелу, чтобы вывести ничью.
0
6 / 6 / 1
Регистрация: 27.12.2014
Сообщений: 67
01.01.2016, 22:56 12
Цитата Сообщение от meJevin Посмотреть сообщение
Я просто хочу заставить for луп проверить каждый элемента моего массива board на неравенство пробелу, чтобы вывести ничью.
А разве изначально неверно было?
C++
1
2
3
4
5
6
7
for (int i = 0; i < 3; i++)
   for (int j = 0; j < 3; j++)
      if (board[i][j] == ' ')
      {
         flag = 1; // есть клетка с пробелом, значит можно еще что-то сделать
         break;
      }
Так как раз советовал nord_v.
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
01.01.2016, 23:00 13
Цитата Сообщение от Kirik516 Посмотреть сообщение
Так как раз советовал nord_v.
Я там условие (по выходу из циклов) неправильно задал (10 пост - исправление). Так должно работать.
0
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
01.01.2016, 23:04  [ТС] 14
Ахххх, ладно. Нафиг эти лупы и массивы проклятые. Я сделал в итоге переменную, которая считает ходы. Когда ходов было сделано 9 - программа пишет ничью и игра заканчивается. Все равно, всем спасибо за помощь) Может как-нибудь вернусь к этой проге и сделаю то, что хотел.
0
6 / 6 / 1
Регистрация: 27.12.2014
Сообщений: 67
01.01.2016, 23:08 15
Цитата Сообщение от nord_v Посмотреть сообщение
(по выходу из циклов)
Выхода из функции ты имеешь ввиду? Т.к. условие уже после цикла написано.

Добавлено через 2 минуты
Цитата Сообщение от meJevin Посмотреть сообщение
Я сделал в итоге переменную, которая считает ходы. Когда ходов было сделано 9 - программа пишет ничью и игра заканчивается.
Зря ты так. Там же только причесать осталось. Да и с циклами все нормально.
Просто скорее всего мы друг друга не до конца понимаем.
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
01.01.2016, 23:08 16
Цитата Сообщение от meJevin Посмотреть сообщение
Может как-нибудь вернусь к этой проге и сделаю то, что хотел.
За тебя уже всё сделали. Так не работает что ли?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
bool flag = true;
for (int i = 0; i < 3; i++) 
{
        for (int j = 0; j < 3; j++) 
        {
            if (board[i][j] == ' ') 
            {
                flag = false;
                break;
            }
        }
        if (!false)
            break;
}
 if (flag && Draw == 1)
 {
     cout << "\n--------------------------------------------------------------------------------\n" << endl;
     cout << "Draw!";
     gameEnd = 1;
 }
Цитата Сообщение от Kirik516 Посмотреть сообщение
Т.к. условие уже после цикла написано.
Я и пишу, что при выходе из циклов (for()).
0
6 / 6 / 1
Регистрация: 27.12.2014
Сообщений: 67
01.01.2016, 23:14 17
Цитата Сообщение от nord_v Посмотреть сообщение
C++
1
2
if (!false)
   break;
Не понимаю зачем это нужно. Может там не false, а flag?
Цитата Сообщение от nord_v Посмотреть сообщение
C++
1
if (flag && Draw == 1)
Ну так эта штука написана после циклов. И в ней "== 1" бесполезен.
0
0 / 0 / 0
Регистрация: 21.12.2015
Сообщений: 5
02.01.2016, 00:11 18
Может такая функция подойдет для проверки окончания игры.

C++
1
2
3
4
5
6
7
8
9
10
bool EndGame(char board[3][3])
{
    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            if (board[i][j] == ' ') // есть клетка с пробелом и
                return false;     // значит игра еще не закончена
 
    // Дошли до этого места, значит нет пустых клеток
    return true;
}
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
02.01.2016, 00:41 19
Цитата Сообщение от Kirik516 Посмотреть сообщение
Может там не false, а flag?
Естественно.
Цитата Сообщение от Kirik516 Посмотреть сообщение
Ну так эта штука написана после циклов.
Естественно, тогда зачем этот вопрос:
Цитата Сообщение от Kirik516 Посмотреть сообщение
Выхода из функции ты имеешь ввиду?
Цитата Сообщение от Kirik516 Посмотреть сообщение
И в ней "== 1" бесполезен.
Без понятия: полезен или нет, переписано из кода ТС:
Цитата Сообщение от meJevin Посмотреть сообщение
C++
1
if (((board[0][0]) != ' ') && ((board[0][1]) != ' ') && ((board[0][2]) != ' ') && ((board[1][0]) != ' ') && ((board[1][1]) != ' ') && ((board[1][2]) != ' ') && ((board[2][0]) != ' ') && ((board[2][1]) != ' ') && ((board[2][2]) != ' ') && Draw == 1)
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
02.01.2016, 01:05 20
...
Миниатюры
Проверка каждого элемента массива  
0
02.01.2016, 01:05
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.01.2016, 01:05
Помогаю со студенческими работами здесь

Из двумерного массива [Bi,j]m,n построить массив С, выполняя деления каждого элемента массива В на min элемент в столбце
Я написал программу, идея которой должна быть верна, но при компиляции возникает ошибка на 33-й...

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

Сумма цифр каждого элемента массива
В одномерный массив с 50 элементами заносятся рандомные 3-х значные числа. Нужно вывести на экран...

Функция вывода каждого третьего элемента массива
Срочно, не могу реализовать, помогите Задание: написать функциювывода каждого третьего элемента...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
Что лучше использовать при создании класса в Java: сеттеры или конструктор?
Alexander-7 08.01.2025
Вопрос подробнее: На вопрос: «Когда одновременно создаются конструктор и сеттеры в классе – это нормально?» куратор уточнил: «Ваш класс может вообще не иметь сеттеров, а только конструктор и геттеры. . .
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru