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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2012, 12:47   #1
student14
 
Регистрация: 26.04.2012
Сообщений: 4
Восклицание Не могу найти ошику в коде (игра Сапер)

Пишу игру Сапер. Вроди бы поле составляет мины показывает и тд, но есть одна ошибка: не появляются на клетках вокруг мин цифры
компилятор никакой ошибки не выдает но я знаю, что ошибка заключается в следующем:
в классе MyField в методе Init в конце когда я передаю остальным клеткам значение value, он че-то у меня не определяет его
Код прграммы:
реализация класса MyCellBomb

Код:
// Реализация класса MyCellWob, т.е. ячейки без бомбы

void MyCellWob::Draw(CDC* dc) // рисуем ячейку без бомбы
{
	if (GetState() == 0) // если закрыто, то рисуем закрытую ячейку
		MyCell::DrawClosedCell(dc); 
	else
		if (GetState() == 2) // если стоит флажок, то рисуем флажок
			MyCell::DrawBlockedCell(dc); 
		else
		// рисуем ячейку
			{
				CPen pen(PS_SOLID, 1, RGB(0, 0, 0)); 
				CBrush brush(RGB(210, 230, 255));
				dc->SetBkColor(RGB(210, 230, 255));
				CPen *oldPen = dc->SelectObject(&pen); 
				CBrush *oldBrush = dc->SelectObject(&brush); 
				dc->Rectangle(10 + GetY()*(SIZE + 2), 10 + GetX()*(SIZE + 2), 10 + GetY()*(SIZE + 2) + SIZE, 10 + GetX()*(SIZE + 2) + SIZE); 
				dc->TextOutW(10 + GetY()*(SIZE + 2) + 6, 10 + GetX()*(SIZE + 2) + 3, L"");
				dc->SelectObject(oldBrush); 
				dc->SelectObject(oldPen);
			}
		
			
}

int MyCellWob::Click(CDC* dc) // проверка на щелчок
{
	if (GetState() == BLOCK) // если стоит флажок, то ячейка не откроется при нажатии
		return 0; 
	SetState(OPENED); // открытие ячейки
	Draw(dc); 
	return OPEN_NULL_VALUES; // т. к. в ячейке находится бомба, а вы ее открываете, то следовательно вы проиграли
}

bool MyCellWob::isBomb() const // есть ли это бомба
{
	return false; 
}


MyField:
void MyField::SetFindBombsCount(int kol) 
{
	kolFindBombs = kol; 
}

MyCell* MyField::GetCellByIndex(int i, int j) 
{
	if (field == NULL) // если щелчок просто по полю, то ничего не происходит
		return NULL; // error
	if (i >= 0 && i < GetCols() && j >= 0 && j < GetRows()) // чтоб ячейка не выходила за рамки поля
		return field[i][j] ; // расширение-сужение поля
	return NULL; //ошибка
}



vоid MyField::SetCellByIndex(int i, int j, MyCell* cell) // установка ячейки по индексу
{
	if (field == NULL) // если поле пустое
		return; //ошибка
	if (i >= 0 && i < GetCols() && j >= 0 && j < GetRows()) 
		field[i][j].SetPointer(cell); 
}

void MyField::Init(int cs, int rs, int kb) // задаем значения
{
	if (field!= NULL) // поле не пустое
		return; //ошибка
	if (cs * rs <= kb) 
		return; //ошибка
	SetCols(cs); 
	SetRows(rs); 
	SetBombsCount(kb); 
	if (cols == 0 || rows == 0) 
		return; //ошибка

	// Создаем поле
	field = new  PMyCell* [GetCols()] ; // создание двумерного массива в виде строк и столбцов
	for (int i = 0; i < GetCols(); i++) 
		field [i] = new PMyCell [GetRows()] ; 
	// Конструктор это делает по умолчанию сам, но если вдруг разкоментировать
	// for (int i = 0; i < GetCols() * GetRows(); i++) 
	// field [i] ->SetPointer(NULL); 
	// Генерируем, где расспалагаются бомбы
	int tmp = GetBombsCount(); // временные переменные
	int tmp_cs = 0; 
	int tmp_rs = 0; 
	while(tmp!= 0) 
		{ // выставляем случайно бомбы
			tmp_cs = rand()% GetCols(); 
			tmp_rs = rand()% GetRows(); 
			if (field[tmp_cs][tmp_rs].GetPointer() == NULL) // если нет бомбы
			{
				tmp--; // уменьшаем количество бомб на еденицу
				field[tmp_cs][tmp_rs].SetPointer(new MyCellBomb(tmp_cs, tmp_rs, CLOSED)); 
			}
			else
			continue; 
		}
	// Генерируем остальные ячейки
	for (int i = 0; i < GetCols(); i++) 
		for (int j = 0; j < GetRows(); j++)
		{
			if (field[i][j].GetPointer() == NULL) // Значит не занятая бомбой
				field[i][j].SetPointer(new MyCellWob(i, j, CLOSED, CalcValueForCell(i, j)));
		}
	SetFindBombsCount(0); 
}



int MyField::CalcValueForCell(int i, int j)
{
	int value = 0;
	// Обходим все соседние ячейки в поисках бомб 
	if (CheckCell(i, j - 1)) 
		if (GetCellByIndex(i, j - 1) != NULL && GetCellByIndex(i, j - 1)->isBomb()) 
			value++;

	if (CheckCell(i - 1, j - 1)) 
		if (GetCellByIndex(i - 1, j - 1) != NULL && GetCellByIndex(i - 1, j - 1)->isBomb()) 
			value++; 

	if (CheckCell(i - 1, j)) 
		if (GetCellByIndex(i - 1, j) != NULL && GetCellByIndex(i - 1, j)->isBomb()) 
			value++; 

	if (CheckCell(i - 1, j + 1)) 
		if (GetCellByIndex(i - 1, j + 1) != NULL && GetCellByIndex(i - 1, j + 1)->isBomb()) 
			value++; 

	if (CheckCell(i, j + 1)) 
		if (GetCellByIndex(i, j + 1) != NULL && GetCellByIndex(i, j + 1)->isBomb()) 
			value++; 

	if (CheckCell(i + 1, j + 1)) 
		if (GetCellByIndex(i + 1, j + 1) != NULL && GetCellByIndex(i + 1, j + 1)->isBomb()) 
			value++; 

	if (CheckCell(i + 1, j)) 
		if (GetCellByIndex(i + 1, j) != NULL && GetCellByIndex(i + 1, j)->isBomb()) 
			value++; 

	if (CheckCell(i + 1, j - 1)) 
		if (GetCellByIndex(i + 1, j - 1) != NULL && GetCellByIndex(i + 1, j - 1)->isBomb()) 
			value++; 
	
	return value; 
}SetBkColor(RGB(210, 230, 255));
				CPen *oldPen = dc-

Последний раз редактировалось Stilet; 15.05.2012 в 13:45.
student14 вне форума Ответить с цитированием
Старый 16.05.2012, 16:11   #2
student14
 
Регистрация: 26.04.2012
Сообщений: 4
По умолчанию

кстати забыл, исходник программы находится на сайте http://coolreferat.com/%D0%A1%D0%B0%D0%BF%D0%B5%D1%80 , кому интересно поразберайтесь - найдете ошибку напишите
student14 вне форума Ответить с цитированием
Старый 16.05.2012, 16:28   #3
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Цитата:
кому интересно поразберайтесь - найдете ошибку напишите
Во мне потихоньку просыпается тролль...но потом засыпает. Будешь пренебрежительно относиться к людям, как ты сейчас сделал, к тебе так же будут относиться. Ни "Здравствуйте", ни "благодарю", а сделай, отпишись и иди своей дорогой. Где, $&^#! , культура общения?
По делу. Скачай книгу: Фленов,"Основы программирования в TurboDelphi". Там разбирается игра "сапер". И исходный код в книге есть.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 17.05.2012, 14:26   #4
student14
 
Регистрация: 26.04.2012
Сообщений: 4
По умолчанию

Если я кого-то этим жестом обидел или оскорбил, то приношу свои глубочайшие извинения! Просто ну очень сейчас нужна программа, уже сил нет, программу написал, а из-за одной ошибки она работает не правильно.
student14 вне форума Ответить с цитированием
Старый 17.05.2012, 14:36   #5
student14
 
Регистрация: 26.04.2012
Сообщений: 4
По умолчанию

спасибо за совет на счет книги
student14 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу найти ошибку в коде sashmedv Паскаль, Turbo Pascal, PascalABC.NET 2 25.03.2012 08:31
игра сапер julia_g Помощь студентам 0 19.11.2011 20:28
ошибка в коде. не могу найти Giffon Общие вопросы C/C++ 3 30.11.2009 15:24
не могу найти ошибку в коде pavelstraut Общие вопросы C/C++ 5 24.07.2009 23:20
Не могу найти ошибку в коде! Natasha666 Помощь студентам 1 20.05.2009 09:27