Не работает как надо, не выводит ничего на доску и игра заканчивается после первого хода. Пробовала всё из play перекинуть в main, но тогда выводятся только нолики. Уже даже не знаю как мне быть
#include <iostream>
#include <Windows.h>
using namespace std;

char board[9] = {'-','-', '-', '-', '-', '-', '-', '-', '-'};//массив поля

bool has_won(char player)//условие выигрыша
{
	int wins[][3] = { {0,1,2},{3,4,5},{6,7,8},{0,3,6},{1,4,7},{2,5,8},{0,4,8},{2,4,6} };
	for (int i = 0; i < 8; i++)
	{
		int count = 0;
		for (int j = 0; j < 2; j++)
		{
			if (board[wins[i][j]] == player);
			count++;
			if (count==3)
				return true;
			else
				return false;
		}
	}

}

void print_board()//вывод поля
{
	cout << "Игровое поле\n";
	cout << "-" << board[6] << "-|-" << board[7] << "-|-" << board[8] << "-\n";
	cout << "-" << board[3] << "-|-" << board[4] << "-|-" << board[5] << "-\n";
	cout << "-" << board[0] << "-|-" << board[1] << "-|-" << board[2] << "-\n";
	cout << "Ваш ход:\n";
}

int get_move()
{
	system("cls");
	setlocale(0, "ru");
	//подсказка
	cout << "Управление\n";
	cout << "-7-|-8-|-9-\n";
	cout << "-4-|-5-|-6-\n";
	cout << "-1-|-2-|-3-\n";
	cout << endl;

	print_board();

	int move;
	cin >> move;
		while (move > 9 || move < 1 || board[move - 1] != '-') //проверка введённого числа
		{
			cout << "Ведите правильное число (1-9)\n";
			cin >> move;
		}
		return move;
	
}

char play()//игра и проверка комбинаций
{
	
	int turn = 0;
	while (!has_won('X') && !has_won('O'))
	{
		get_move();
		int move = get_move();
		for (int i = 0; i < 10; i++)
		{
			if (turn % 2 == 0)
			{
				board[move - 1] = 'X';
				if (has_won('X'))
				{
					cout << "Выиграл игрок 'X'!\n";
					return 'X';
				}
			}
			else
			{
				board[move - 1] = 'O';
				if (has_won('O'))
				{
					cout << "Выиграл игрок 'O'!\n";
					return 'O';
				}
			}

			turn++;
			if (turn == 9)
			{
				cout << "Ничья :(\n";
				return 'D';
			}
		}
	}

}

		void main()
		{
			system("Title TicTacToe");
			system("color 2");

			play();
		}

turn++ делается в цикле который выполняется 10 раз после ввода, поэтому номер хода достигает числа 9 и т.к. проверка на win возвращает false выходит ничья
там где проверка на вин, всегда будет возвращать false потому что после первой же итерации (j=0) будет проверка что count==3, а он никак не может быть равен 3 на первой итерации. return false должен быть после обоих циклов for
code
#include <iostream>
using namespace std;

char board[9] = {'-','-', '-', '-', '-', '-', '-', '-', '-'};//массив поля

bool has_won(char player)//условие выигрыша
{
	int wins[][3] = { {0,1,2},{3,4,5},{6,7,8},{0,3,6},{1,4,7},{2,5,8},{0,4,8},{2,4,6} };
	for (int i = 0; i < 8; i++)
	{
		int count = 0;
		for (int j = 0; j <= 2; j++)
		{
			if (board[wins[i][j]] == player)
				count++;
			if (count==3)
				return true;
		}
	}
	return false;
}

void print_board()//вывод поля
{
	cout << "Игровое поле\n";
	cout << "-" << board[6] << "-|-" << board[7] << "-|-" << board[8] << "-\n";
	cout << "-" << board[3] << "-|-" << board[4] << "-|-" << board[5] << "-\n";
	cout << "-" << board[0] << "-|-" << board[1] << "-|-" << board[2] << "-\n";
	cout << "Ваш ход:\n";
}

int get_move()
{
	system("cls");
	setlocale(0, "ru");
	//подсказка
	cout << "Управление\n";
	cout << "-7-|-8-|-9-\n";
	cout << "-4-|-5-|-6-\n";
	cout << "-1-|-2-|-3-\n";
	cout << endl;

	print_board();

	int move;
	cin >> move;
		while (move > 9 || move < 1 || board[move - 1] != '-') //проверка введённого числа
		{
			cout << "Ведите правильное число (1-9)\n";
			cin >> move;
		}
		return move;
	
}

char play()//игра и проверка комбинаций
{
	
	int turn = 0;
	while (!has_won('X') && !has_won('O') && turn < 9)
	{
		int move = get_move();
			if (turn % 2 == 0)
			{
				board[move - 1] = 'X';
				if (has_won('X'))
				{
					cout << "Выиграл игрок 'X'!\n";
					return 'X';
				}
			}
			else
			{
				board[move - 1] = 'O';
				if (has_won('O'))
				{
					cout << "Выиграл игрок 'O'!\n";
					return 'O';
				}
			}

			turn++;
	}
				cout << "Ничья :(\n";
				return 'D';
}

int _tmain(int argc, _TCHAR* argv[])
{
	system("Title TicTacToe");
	system("color 2");

	play();
	int a;
	cin >> a;
	return 0;
}
вроде работает как надо
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
24
первое что бросается в глаза: get_move(); вызывается один раз до цикла, без обработки результата, это ок?
if (has_won('O'))
	cout << "Выиграл игрок 'O'!\n";
return 'O';
Это точно должно быть так? тут return вне ифа получается т.к. скобок нет
15
prog, переделала, но всё равно ничего не изменилось, разве что теперь ничью выводит
24
Мышкоблудка, аналогичных мест в коде было больше одного... да, уже вижу, что все поправлены
upd: нашел еще одну проблему - лишний цикл, из-за которого один ход считается за 10
28
можно сделать дебаг
лучше писать в лог и кинуть его сюда
и у тебя get_move(); вызывается дважды
15
вообще подобные проблемы изи решаются без лога. просто дебаг и листочек с ручкой. поэтому мне и не охота жестко учить джасс потому что там нет адекватного дебага в отличие от нормальных яп. Считаю что логи необходимы в действительно замысловатых случаях например в рекурсивных функциях с множеством действий и с действительно большим вызовом рекурсии.
22
turn++ делается в цикле который выполняется 10 раз после ввода, поэтому номер хода достигает числа 9 и т.к. проверка на win возвращает false выходит ничья
там где проверка на вин, всегда будет возвращать false потому что после первой же итерации (j=0) будет проверка что count==3, а он никак не может быть равен 3 на первой итерации. return false должен быть после обоих циклов for
code
#include <iostream>
using namespace std;

char board[9] = {'-','-', '-', '-', '-', '-', '-', '-', '-'};//массив поля

bool has_won(char player)//условие выигрыша
{
	int wins[][3] = { {0,1,2},{3,4,5},{6,7,8},{0,3,6},{1,4,7},{2,5,8},{0,4,8},{2,4,6} };
	for (int i = 0; i < 8; i++)
	{
		int count = 0;
		for (int j = 0; j <= 2; j++)
		{
			if (board[wins[i][j]] == player)
				count++;
			if (count==3)
				return true;
		}
	}
	return false;
}

void print_board()//вывод поля
{
	cout << "Игровое поле\n";
	cout << "-" << board[6] << "-|-" << board[7] << "-|-" << board[8] << "-\n";
	cout << "-" << board[3] << "-|-" << board[4] << "-|-" << board[5] << "-\n";
	cout << "-" << board[0] << "-|-" << board[1] << "-|-" << board[2] << "-\n";
	cout << "Ваш ход:\n";
}

int get_move()
{
	system("cls");
	setlocale(0, "ru");
	//подсказка
	cout << "Управление\n";
	cout << "-7-|-8-|-9-\n";
	cout << "-4-|-5-|-6-\n";
	cout << "-1-|-2-|-3-\n";
	cout << endl;

	print_board();

	int move;
	cin >> move;
		while (move > 9 || move < 1 || board[move - 1] != '-') //проверка введённого числа
		{
			cout << "Ведите правильное число (1-9)\n";
			cin >> move;
		}
		return move;
	
}

char play()//игра и проверка комбинаций
{
	
	int turn = 0;
	while (!has_won('X') && !has_won('O') && turn < 9)
	{
		int move = get_move();
			if (turn % 2 == 0)
			{
				board[move - 1] = 'X';
				if (has_won('X'))
				{
					cout << "Выиграл игрок 'X'!\n";
					return 'X';
				}
			}
			else
			{
				board[move - 1] = 'O';
				if (has_won('O'))
				{
					cout << "Выиграл игрок 'O'!\n";
					return 'O';
				}
			}

			turn++;
	}
				cout << "Ничья :(\n";
				return 'D';
}

int _tmain(int argc, _TCHAR* argv[])
{
	system("Title TicTacToe");
	system("color 2");

	play();
	int a;
	cin >> a;
	return 0;
}
вроде работает как надо
Принятый ответ
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.