Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 18.09.2016
Сообщений: 3

Не работает код из игры "Сапер"

18.09.2016, 19:18. Показов 1243. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
На данном этапе я изучаю программирование для себя. И для закрепления знаний я решил написать известную игру Сапер, но в консоли.
Игра написана, основные функции работают. Но вот уже второй день все никак не могу написать последнюю и завершающую функцию: надо, чтобы при попадании в пустую клетку открывались все пустые клетки, стоящие "впритык" к этой, вплоть до цифр, а также все цифры, к которые примыкают ко всем открывшимся пустым клеткам (думаю, любители этой игры меня поняли). Сам код для этого написан, но он почему-то работает криво, и я не могу понять, почему.

Сразу говорю – кода много. И я буду благодарен всем, кто попытается хотя бы вникнуть в суть проблемы.

Код целиком я здесь разместить не могу, т.к. в итоговом сообщении у меня получилось 24209 символов вместо 8000. Поэтому прилагаю текст и ссылку на pastebin (извиняюсь за немного мусора в нем – это из-за постоянной отладки):
http://pastebin.com/LYjz1MAD

На данным момент программа при попадании в пустую клетку только умеет открывать клетки в радиусе одно клетки.

Итак, что в коде отвечает за поиск нулевых клеток, и как это должно работать по задумке?
Все начинается с функции CheckZeros(int x, int y)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        static void CheckZeros(int x, int y) // первая итерация
        {
            if (map[x, y] == zeroOnMap) // проверка, является ли клетка нулем
            {
                zeros.Clear();
                zeroX = x;
                zeroY = y;
 
                //do
                {
                    ZeroQuad(zeroX, zeroY); //в выходе из цикла не участвует
                    //ZeroSubstitution();
                }
                //while (zeros.Count != 0);
            }
        }
Она активируется каждый раз при нажатии кнопки NumPad0. Далее идет ZeroQuad(int x, int y)
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
        static void ZeroQuad(int x, int y) // ищет в квадрате нули
        {
            if(zeros.Count != 0)
            {
                zeros.RemoveAt(zeroPoints - 2);
                zeros.RemoveAt(zeroPoints - 1);
            }
 
            int a, b;
            for (a = x - 1; a < x + 2; a++)
            {
                for (b = y - 1; b < y + 2; b++)
                {
                    fogOfWar[a, b] = 0;
                    if (map[a, b] == zeroOnMap && (a != x || b != y))
                    {
                        zeros.Add(a);
                        zeros.Add(b);
                        zeroPoints += 2;
                    }
                }
            }
            //
            //Console.WriteLine("\nZeroQuad zeros.Count " + zeros.Count + " zeroPoints = " + zeroPoints
            //    + " ");
            //Console.ReadKey();
            //
        }
По задумке:
Она просматривает квадрат 9х9, в центре которого находится нажатая клетка. Все клетки приравниваются к значению, которое на карте, которой является массив char map[,], обозначаются нулевые клетки (около которых нет мин, обозначаются на карте символом Convert.ToChar(Convert.ToString(0))) Все подходящие значения добавляются в список zeros (сначала координата х, потом у). Так же прибавляется двойка к счетчику (почему двойка - для удобства, дальше будет понятно).
Потом запускается функция ZeroSubstitution()
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
static void ZeroSubstitution()
        {
            if (zeros.Count != 0)
            {
                zeroX = zeros[zeroPoints - 2];
                zeroY = zeros[zeroPoints - 1];
                zeroPoints -= 2;
            }
            //
            //Console.WriteLine("ZeroSub. zeros.Count " + zeros.Count + " zeroPoints = " + zeroPoints+
            //    "zeroX = "+ zeroX+ " zeroY = "+ zeroY);
            //Console.ReadKey();
            //
        }
Она должна подставлять последние два значения в списке zero в переменные, которые отправляются в функциюZeroQuad(int x, int y), чтобы она просмотрела соседние клетки, добавляя новые значения в список zero, если будут встречаться нулевые клетки. И по задумке, они в цикле do while (который отключен) должны обработать все соседние пустые клетки.

Но на практике эти функции начинают добавлять значения в список zero и счетчик zeroPoints бесконечно.

Чтобы лучше понять их работу, я немного изменил код:
Часть главной программы:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
            while (game)
            {
 
                RenderInvisibleMap();
                PlayerCursor();
                PlayerMoveController();
 
                /*
                RenderVisibleMap();
                //RenderInvisibleMap();
                RenderInterface(fieldSizeX);
                PlayerCursor(); //отрисовка курсора
                //FindChar(0, 200);
                PlayerMoveController();
 
                CheckWin();
 
                Thread.Sleep(50);
                */
            }
И изменил эти две функции.
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
static void ZeroQuad(int x, int y) // ищет в квадрате нули
        {
            if(zeros.Count != 0)
            {
                zeros.RemoveAt(zeroPoints - 2);
                zeros.RemoveAt(zeroPoints - 1);
            }
 
            int a, b;
            for (a = x - 1; a < x + 2; a++)
            {
                for (b = y - 1; b < y + 2; b++)
                {
                    fogOfWar[a, b] = 0;
                    if (map[a, b] == zeroOnMap && (a != x || b != y))
                    {
                        zeros.Add(a);
                        zeros.Add(b);
                        zeroPoints += 2;
                    }
                }
            }
            //
            Console.WriteLine("\nZeroQuad zeros.Count " + zeros.Count + " zeroPoints = " + zeroPoints
                + " ");
            //Console.ReadKey();
            //
        }
 
        static void ZeroSubstitution()
        {
            if (zeros.Count != 0)
            {
                zeroX = zeros[zeroPoints - 2];
                zeroY = zeros[zeroPoints - 1];
                zeroPoints -= 2;
            }
            //
            Console.WriteLine("ZeroSub. zeros.Count " + zeros.Count + " zeroPoints = " + zeroPoints+
                "zeroX = "+ zeroX+ " zeroY = "+ zeroY);
            Console.ReadKey();
            //
        }
И с помощь пошаговой отладки получил скриншот, на котором немного видна работа этих функций.

В общем, спасибо тем, кто только осилил эту простыню.
Лично меня эта программа уже сильно измотала, и сил на новые идеи и попытки решения уже нет. Поэтому я прошу помощи у коллективного разума
Миниатюры
Не работает код из игры "Сапер"  
Вложения
Тип файла: txt sapper_from_carpet.txt (17.8 Кб, 5 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.09.2016, 19:18
Ответы с готовыми решениями:

Объясните как работает код игры "Сапер"
Здравствуйте, мне дали код игры &quot;Сапера&quot; как пример, а я не понимаю как он работает не мог бы кто помочь расписать его, пожалуйста?...

Как готовый код игры сапер переделать в ООП варианте?
Всех приветствую! Появилась проблема при написаний кода игры сапер в ооп. Я уже написал код, но никак не могу переписать в ооп версию...

Исходный код игры "Сапер" на PascalABC.Net
Доброго времени суток. Скиньте кто-небудь пожалуйста исходный код игры &quot;Сапер&quot; (упрощенный вариант).

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.09.2016, 19:18
Помогаю со студенческими работами здесь

Доработка игры Сапёр
Привет, есть код игры сапёр, писал по учебнику &quot;КУЛЬТИН Visual C++ в задачах&quot;, переписал всё верно, проверил несколько раз. Сделал вывод...

Нужен исходник игры Сапер
Нигде не могу найти нормальный исходник игры Сапер 2002. Помогите пожалуйста.

Сапер (поле для игры)
Начал писать сапер и столкнулся с такой проблемой: когда выбираем уровень сложности то нам нужно менять внешний вид поля игры(за основу я...

Диаграммы для игры сапёр
помогите написать диаграмму вариантов использования и модель предметной области для создания игры сапёр

Сетка для игры «Сапер»
Скажите нет ли в WPF какого то совсем простого грида у которого можно было бы просто указать количество строк и количество столбцов и они...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru