Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.08.2013, 11:31   #1
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию Крестики-нолики

Доброго времени суток. Хочу написать игру крестики-нолики. Вроде все работает, но есть одна ошибка. Условие конца игры работает неправильно. На скринах показаны ходы компьютера. На первом 3 нолика и в столбце, и в строке. На втором скрине трех ноликов нету вообще. Подскажите, в чем ошибка?
P.S. Условие конца игры полностью переписал из книги, и все равно где то косяк.

Код:
#pragma warning(disable:4996);
#include <iostream>
#include <conio.h>
#include <time.h>

using namespace std;

char matrix[3][3]; //игровое поле

void init_matrix(); // инициализируем матрицу
void display_matrix(); // выводим матрицу на экран
void get_player_move(); // ход игрока
void get_comp_move(); // ход компьютера
bool is_nothing(int, int); // проверка правильности хода
char is_over(); // проверка конца игры

int main()
{
	srand(time(NULL));
	setlocale(LC_ALL, "Russian");
	char over = ' ';
	init_matrix();
	do
	{
		system("cls");
		display_matrix();
		/*get_player_move();
		over = is_over();
		if (over != ' ')
		{
			break;
		}*/
		get_comp_move();
		over = is_over();
	}
	while (over == ' ');
	system("cls");
	display_matrix(); // конечное отображение матрицы
	if (over == 'X') // поиск победителя
	{
		cout << "Ты выиграл. " << endl;
	}
	else if (over == 'O')
	{
		cout << "Ты проиграл. " << endl;
	}
	system("pause");
	return 0;
}

void init_matrix()
{
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			matrix[i][j] = ' ';
		}
	}
}

void display_matrix()
{
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			cout << matrix[i][j] << ' ';
		}
		cout << endl;
	}
}
void get_player_move()
{
	int x, y;
	cout << "Введите координаты: ";
	cin >> x >> y;
	while (!is_nothing(x, y))
	{
		cout << "Неверный ход. " << endl;
		cout << "Введите координаты: ";
		cin >> x >> y;
	}
	matrix[--x][--y] = 'X';
}

void get_comp_move() // ставит О в случайную клетку
{
	int x, y;
	x = rand() % 3 + 1;
	y = rand() % 3 + 1;
	while (!is_nothing(x, y))
	{
		x = rand() % 3 + 1;
		y = rand() % 3 + 1;
	}
	matrix[--x][--y] = 'O';
}

bool is_nothing(int x, int y)
{
	if (x <= 0 || x > 3 || y <= 0 || y > 3) // если введены неверные координаты
	{
		return false;
	}
	return (matrix[--x][--y] == ' ') ? true : false; // если клетка уже занята
}

char is_over()
{
	int i;
	for (i = 0; i < 3; i++) // проверяем строки
	{
		if (matrix[i][0] == matrix[i][1] && matrix[i][0] == matrix[i][2])
		{
			return matrix[i][0];
		}
	}
	for (i = 0; i < 3; i++) // проверяем столбцы
	{
		if (matrix[0][i] == matrix[1][i] && matrix[0][i] == matrix[2][i])
		{
			return matrix[0][i];
		}
	}
	if (matrix[0][0] == matrix[1][1] && matrix[1][1] == matrix[2][2]) // проверяем главную диагональ
	{
		return matrix[0][0];
	}
	if (matrix[0][2] == matrix[1][1] && matrix[1][1] == matrix[2][0]) // проверяем побочную диагональ
	{
		return matrix[0][2];
	}
}

Изображения
Тип файла: jpg cpp1.jpg (10.4 Кб, 130 просмотров)
Тип файла: jpg cpp2.jpg (11.3 Кб, 165 просмотров)

Последний раз редактировалось Dima-War; 02.08.2013 в 12:59.
Dima-War вне форума Ответить с цитированием
Старый 02.08.2013, 13:47   #2
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Код:
	for (i = 0; i < 3; i++) // проверяем строки
	{
		if (matrix[i][0] == matrix[i][1] && matrix[i][0] == matrix[i][2])
		{
			return matrix[i][0];
		}
	}
	for (i = 0; i < 3; i++) // проверяем столбцы
	{
		if (matrix[0][i] == matrix[1][i] && matrix[0][i] == matrix[2][i])
		{
			return matrix[0][i];
		}
	}
	if (matrix[0][0] == matrix[1][1] && matrix[1][1] == matrix[2][2]) // проверяем главную диагональ
	{
		return matrix[0][0];
	}
	if (matrix[0][2] == matrix[1][1] && matrix[1][1] == matrix[2][0]) // проверяем побочную диагональ
	{
		return matrix[0][2];
	}
Скобки правильно в логических условиях расставьте.
Например,
Код:
if ((matrix[0][2] == matrix[1][1]) && (matrix[1][1] == matrix[2][0])) // проверяем побочную диагональ
Igor95 вне форума Ответить с цитированием
Старый 02.08.2013, 13:56   #3
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию

Цитата:
Сообщение от Igor95 Посмотреть сообщение
Скобки правильно в логических условиях расставьте.
Проблему это не решило.
Dima-War вне форума Ответить с цитированием
Старый 03.08.2013, 14:02   #4
frommars
Форумчанин
 
Регистрация: 02.07.2011
Сообщений: 144
По умолчанию

http://kde-look.org/content/download...nt=123968&id=2
frommars вне форума Ответить с цитированием
Старый 03.08.2013, 16:13   #5
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию

Слишком тяжело для меня. Просто надо, чтобы кто то подсказал что не так с функцией проверки конца игры и все.
Dima-War вне форума Ответить с цитированием
Старый 03.08.2013, 20:45   #6
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

На. как увидиш ошибку отпишись.
(подсказка - смотри на уловие победы, а конкретно на оператор "==" и то как инициализируется матрица)
Цитата:
#include <stdio.h>
char matrix[3][3];

char is_over(void)
{
int i;
for (i = 0; i < 3; i++)
if (matrix[i][0] == matrix[i][1] && matrix[i][0] == matrix[i][2])
return matrix[i][0];

for (i = 0; i < 3; i++)
if (matrix[0][i] == matrix[1][i] && matrix[0][i] == matrix[2][i])
return matrix[0][i];

if (matrix[0][0] == matrix[1][1] && matrix[1][1] == matrix[2][2])
return matrix[0][0];

if (matrix[0][2] == matrix[1][1] && matrix[1][1] == matrix[2][0])
return matrix[0][2];

return -1;
}

int main(void){
int i, n;char s[2];

for(i = 0; i < 3; i++){
for(n = 0; n < 3; n++){
matrix[i][n] = 'Z';
if(i == 1) matrix[i][n] = 'X';
printf("%s ", &matrix[i][n]);
}
puts("\n");
}
if((s[0] = is_over()) != -1){
s[1] = '\0';
printf("Win = %s\n", s);
}

return 0;
}
ещё подсказка - исключи символ которым иницализируеш матрицу из уловия победы
do not use your brain

Последний раз редактировалось Кащей; 03.08.2013 в 20:48.
Кащей вне форума Ответить с цитированием
Старый 03.08.2013, 22:13   #7
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию

Такс... Ок, я исключил пробел из условия победы, а дальше непонятно что за массив s и какое отношение он имеет к полю игры. В общем не вдупляю что то..
Dima-War вне форума Ответить с цитированием
Старый 03.08.2013, 22:15   #8
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

S - он только для отображения символа как строки с нультерминатором, без него пёрло XXXYYY чтото такое.
Наверно хватило бы и putchar().
do not use your brain

Последний раз редактировалось Кащей; 03.08.2013 в 22:19.
Кащей вне форума Ответить с цитированием
Старый 03.08.2013, 22:36   #9
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию

В общем подскажи, пожалуйста, что мне исправить в моем коде. Уже 3ий день сижу и никак не могу дописать игру, задолбался..
Dima-War вне форума Ответить с цитированием
Старый 03.08.2013, 22:49   #10
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

Ну так ты уловие исправил, и какие изменения?
do not use your brain
Кащей вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Крестики - Нолики на С# RaTyS Фриланс 3 28.11.2011 23:11
Крестики-Нолики Jasper92 Помощь студентам 3 01.11.2010 18:35
крестики нолики neformalblack Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 18.04.2010 19:04
крестики нолики neformalblack Qt и кроссплатформенное программирование С/С++ 3 15.04.2010 21:33