С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
PascalABC.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/19: Рейтинг темы: голосов - 19, средняя оценка - 4.63
gorus95
6 / 6 / 1
Регистрация: 22.12.2012
Сообщений: 169
Завершенные тесты: 1
1

Расстановка мин в игре "Сапёр"

03.07.2013, 19:28. Просмотров 3800. Ответов 10
Метки нет (Все метки)

Я делаю игру "Сапер" (точнее уже сделал, теперь исправляю найденные ошибки и баги)
Вот один из них, сам справиться не могу...

Как известно мины в игре расставляются после первого хода, поэтому проиграть на первом ходу нельзя. То есть первой должна открыться клетка без мины.
Но вопрос - это обязательно должна быть пустая (кол. соседних мин равно нулю) или может быть клетка с цифрой?
Сколько не пытался мучить виндовский сапер, кажется что первой должна быть полностью пустая клетка.
Тогда как расставить мины на поле если количество мин очень большое так чтоб первой оказалась пустая клетка? У меня в программе мины расставляются случайно пока не будут в подходящей позиции (т.е. пока клетка выбранная пользователем не станет пустой). Но когда мин очень много, этот цикл тупо зависает, т.к. найти полностью пустую клетку почти нереально.
В такой ситуации единственный выход - расставить мины вокруг выбраной клетки в порядке (см. рисунок)
Но так как в моей программе они расставляются рандомно, то в такой ситуации оно тупо зависает.
Уже есть рабочая игра, всё супер. Вот только при большом количестве мин на первом клике вылетает ошибка.


Что подскажите?
0
Изображения
 
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2013, 19:28
Ответы с готовыми решениями:

Заменить в строке "." на ";", "." на ".", убрать лишние пробелы. Не могу доделать один кусочек
Не соображу, как уместить два действия так, чтобы работали оба, а именно, ...

Нужно доделать курсовую работу по игре "Хождение по лабиринту"
В принципе лабиринт у меня готов, надо только сделать чтобы через стены...

Реакция на клик мышью, чтобы в игре "жизнь" забивать начальную конфигурацию
Сделал "жизнь", но пока вбивать начальную конфигурацию приходится, вводя...

В чем ошибка? Когда печатаю "а" или "б" все работает, а когда "А" или "Б" то он не меняет "А" на "Б"
{Программа заменяет буквы "а" на буквы "б" в введенном тексте} var stroka :...

Обработка столкновений в игре "Танчики"
Здравствуйте, ув. форумчане! Мне нужна помощь с обработкой столкновений...

10
КонецСвета
Почетный модератор
7932 / 3903 / 2464
Регистрация: 30.10.2011
Сообщений: 5,379
03.07.2013, 19:45 2
gorus95, а у меня с первого запуска виндовского сапера открылась с цифрой клетка
и со второго, и с третьего ... везет
---
0
gorus95
6 / 6 / 1
Регистрация: 22.12.2012
Сообщений: 169
Завершенные тесты: 1
03.07.2013, 20:04  [ТС] 3
уже разобрался.
сделал генератор случайных чисел, который исключает числа с заданного квадрата.

Добавлено через 28 секунд
КонецСвета, оО я раз 60 запускал з большим количеством мин...
не может быть... у вас точно семерка?
0
КонецСвета
Почетный модератор
7932 / 3903 / 2464
Регистрация: 30.10.2011
Сообщений: 5,379
03.07.2013, 20:16 4
не.. у меня XP )
0
gorus95
6 / 6 / 1
Регистрация: 22.12.2012
Сообщений: 169
Завершенные тесты: 1
03.07.2013, 22:55  [ТС] 5
КонецСвета, я то думаю)
так как по правилах? вроде должно пустую открывать... иначе нам первый ход практически ничего не дает.
0
КонецСвета
Почетный модератор
7932 / 3903 / 2464
Регистрация: 30.10.2011
Сообщений: 5,379
03.07.2013, 23:14 6
не удалось найти ответ на вопрос "как правильно" )
зато попалась интересная вещь:
Расположение мин генерируется заранее, но с первого раза попасть на мину невозможно по причине того, что, будучи угаданной, мина будет сразу же перенесена в неоткрытый угол поля.
так же, наверное, модно поступить и с ячейкой с числом, обменяв ее с любым пустым полем, как вариант
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26542 / 17828 / 7051
Регистрация: 22.10.2011
Сообщений: 31,371
Записей в блоге: 6
04.07.2013, 10:59 7
Цитата Сообщение от gorus95 Посмотреть сообщение
Сколько не пытался мучить виндовский сапер, кажется что первой должна быть полностью пустая клетка.
Не обязательно, попадаются и пустые, и с цифрой. Да, проверял под Win7.
0
gorus95
6 / 6 / 1
Регистрация: 22.12.2012
Сообщений: 169
Завершенные тесты: 1
04.07.2013, 16:37  [ТС] 8
UI, Ничего не понимаю. Уже несколько дней занимаюсь этим. Беру максимальное количество мин для данного поля. Еще ни разу не попал на число с первого хода...
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26542 / 17828 / 7051
Регистрация: 22.10.2011
Сообщений: 31,371
Записей в блоге: 6
04.07.2013, 17:16 9
gorus95,
Windows Minesweeper always allows makes your first click safe. No matter how ridiculously dense the board, if your first click would have landed you on a bomb, the program swaps this bomb with a blank space. After this you are on your own.
То есть, если нарвался на бомбу первым ходом - то тебе откроют пустую клетку, но если попал на клетку с цифрой - то нет никаких причин, чтобы ее менять, она и будет открыта.
0
Syrax
26 / 17 / 15
Регистрация: 09.12.2009
Сообщений: 125
20.09.2013, 14:20 10
Не хочется создавать новую тему, да и эта еще относительно свежая.
Помогите, пожалуйста! Решил немного побаловаться и также сделать сапера консольную версию, да только застрял с открытием свободного поля. В программировании я относительный нуб, и у меня плохо с рекурсивными функциями. В общем-то, пытаюсь делать вот такую процедуру:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure open(var i,j:integer);
begin
  if a[i,j]=' ' then
  begin
    b[i,j]:=a[i,j];
    open(i,j-1);
    open(i-1,j);
    open(i,j+1);
    open(i+1,j);
    open(i+1,j+1);
    open(i+1,j-1);
    open(i-1,j+1);
    open(i-1,j-1);
  end;
end;
И ABC.Net начинает ругаться, мол, 'cminer.pas(102) : Данный объект не может быть передан как var-параметр'.

Я запихиваю руки в попу и делаю так:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procedure open(var i,j:integer);
begin
  if a[i,j]=' ' then
  begin
    b[i,j]:=a[i,j];
    j-=1;
    open(i,j);
    j+=1; i-=1;
    open(i,j);
    i+=1; j+=1;
    open(i,j);
    j-=1; i+=1;
    open(i,j); j+=1;
    open(i,j);
    j-=2;
    open(i,j);
    j+=2; i-=2;
    open(i,j);
    j-=2;
    open(i,j);
    j+=1; i+=1;
  end;
end;
Вроде бы работает, но при открытии пустой ячейки, если рядом есть еще такая, программа тут же кричит 'Process is terminated due to StackOverflowException.' и вылетает. // Одну ячейку открывает без ругани.
Собственно, вопрос. Как можно выпрямить руки? -)

Если необходимо, скину кривопопый код программы. Заранее благодарю за помощь.
0
Syrax
26 / 17 / 15
Регистрация: 09.12.2009
Сообщений: 125
22.09.2013, 00:24 11
UPхDoublePost.

После долгих усилий, поисков, чтения литературы, сумел выяснить, что я делал не так с процедурой. Однако, эта рекурсия все равно забивает память до отказа при количестве пустых ячеек больше пяти. Подскажите, пожалуйста, как можно освобождать память?
0
22.09.2013, 00:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.09.2013, 00:24

"Ручное" освещение в 2D игре
Здравствуйте. Делаю небольшую 2D игру, в которой НЕ использую готовые игровые...

Заменить в строке "Мама мыла раму" буквы "а" на знак "_" . Вывести полученный массив на экран
Заменить в строке "Мама мыла раму" буквы "а" на знак "_" . Вывести полученный...

Составьте программу замены в слове Х всех букв "а" и "я" на слог "по"
Составьте программу замены в слове Х всех букв "а" и "я" на слог "по". заранее...


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

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

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