Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль

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

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

Купить рекламу на форуме 15-35 тыс рублей в месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.09.2016, 18:00   #1
Ковер
Пользователь
 
Регистрация: 18.09.2016
Сообщений: 30
Вопрос Не работает код (С#)

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

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

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

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

Итак, что в коде отвечает за поиск нулевых клеток, и как это должно работать по задумке?
Все начинается с функции CheckZeros(int x, int y)
Код:
        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)
Код:
        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()
Код:
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 бесконечно.

Чтобы лучше понять их работу, я немного изменил код:
Часть главной программы:
Код:
            while (game)
            {

                RenderInvisibleMap();
                PlayerCursor();
                PlayerMoveController();

                /*
                RenderVisibleMap();
                //RenderInvisibleMap();
                RenderInterface(fieldSizeX);
                PlayerCursor(); //отрисовка курсора
                //FindChar(0, 200);
                PlayerMoveController();

                CheckWin();

                Thread.Sleep(50);
                */
            }
И изменил эти две функции.
Код:
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();
            //
        }
И с помощь пошаговой отладки получил скриншот, на котором немного видна работа этих функций.

Лично меня эта программа уже сильно измотала, и сил на новые идеи и попытки решения уже нет. Поэтому я прошу помощи у коллективного разума
Изображения
Тип файла: png 1.png (17.6 Кб, 47 просмотров)
Вложения
Тип файла: txt sapper_from_carpet.txt (17.8 Кб, 135 просмотров)
Ковер вне форума Ответить с цитированием
Старый 18.09.2016, 20:03   #2
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Так что? Ты узнал как запустить ОТЛАДКУ? Как смотреть значения переменных?
А ведь это поможет тебе найти все свои ошибки (не только теперешние, но и те, что будут в будущем).

Лучше говорить как есть.

В принципе, если хочешь, я мог бы сделать небольшое видео (или дать ссылку на уже имеющиеся в интернет) как пользоваться ОТЛАДКОЙ. Но, напомню, у меня Microsoft Visual Studio 12.0 и устанавливать что-то другое ради 5-мин видео или ответа на один-два вопроса нецелесообразно.

Последний раз редактировалось ura_111; 18.09.2016 в 20:06.
ura_111 вне форума Ответить с цитированием
Старый 18.09.2016, 20:11   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,503
По умолчанию

Ничего что он сказал, что умеет ей пользоваться?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 18.09.2016, 20:16   #4
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Он не умеет ей пользоваться.
Под фразой: "...простите за этот мусор, связанный с отладкой..." Он имел ввиду:

0.jpg

Вывести значения переменных на экран. Такая "ОТЛАДКА" слишком медленная и не удобная.

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

Последний раз редактировалось ura_111; 18.09.2016 в 20:30.
ura_111 вне форума Ответить с цитированием
Старый 18.09.2016, 20:28   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,503
По умолчанию

Ну отладка это не только использование отладчика
И бывает вывод удобнее.

Про отладчик он писал
Цитата:
Сообщение от Ковер Посмотреть сообщение
с помощь пошаговой отладки получил
и
Цитата:
Сообщение от Ковер Посмотреть сообщение
с отладкой знаком. Но как сделать такой выпадающий список в центре экрана?
что скорее всего подразумевает, что отладчиком он пользовался, только не знал о (не самой важной) фиче просмотра значений по наведению мыши.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 18.09.2016, 20:36   #6
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Ковер, у тебя Microsoft Visual Studio 2015?
Я пытался у себя установить, но запорол всю систему и поэтому пришлось всё перестанавливать (так и не разобрался что случилось)... А вот версия 2013 установилась без проблем.
Ковер, у тебя русифицированная версия или английская?
ura_111 вне форума Ответить с цитированием
Старый 18.09.2016, 20:46   #7
Ковер
Пользователь
 
Регистрация: 18.09.2016
Сообщений: 30
По умолчанию

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

Последний раз редактировалось Ковер; 18.09.2016 в 20:52.
Ковер вне форума Ответить с цитированием
Старый 18.09.2016, 21:00   #8
Ковер
Пользователь
 
Регистрация: 18.09.2016
Сообщений: 30
По умолчанию

Цитата:
Сообщение от ura_111 Посмотреть сообщение
Ковер, у тебя Microsoft Visual Studio 2015?
Я пытался у себя установить, но запорол всю систему и поэтому пришлось всё перестанавливать (так и не разобрался что случилось)... А вот версия 2013 установилась без проблем.
Ковер, у тебя русифицированная версия или английская?
У меня Microsoft Visual Studio Community 2015, русифицированная, скачанная с официального сайта.В самом деле были какие-то проблемы с установкой (во время нее выскакивала ошибка). Я начал с версии с их сайта. Потом полез на торренты – те тоже не ставились. Честно говоря, я не помню, что сделал в итоге. К слову, ставил на чистый только что установленный Windows 7. На сколько помню, исходил из таблички с ошибкой. Возможно, я экспериментировал в Программах и компонентах из раздела Панель управления с фрэймвоками (устанавливал/удалял).
Ковер вне форума Ответить с цитированием
Старый 18.09.2016, 21:14   #9
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Я особо пока не вдовался в твою программу, скажи:
1) Ты работаешь в консоли, а что такое: "... при нажатии кнопки NumPad0 ..."?
2) Сегодня я устал и мне лень разбираться в таком большом коде... Ковер, ты можешь сделать небольшое видео "где ошибка и что не получается"? Какое-то простенькое (из серии фоток-скриншотов). Такое видео можно выложить здесь или разместить на ютубе.

Там, кстате есть и простенькие видеоредакторы.
ura_111 вне форума Ответить с цитированием
Старый 22.09.2016, 10:31   #10
Ковер
Пользователь
 
Регистрация: 18.09.2016
Сообщений: 30
Радость

ura_111
Спасибо за заинтересованность. Я тут после некоторой паузы сел за код и понял, в чем проблема. Немного исправил – программа начала искать клетки вокруг. Но не совсем правильно. Почему все происходит именно так, я не понял – слишком запутанно и нелогично она себя ведет. Начал переписывать код... и грядут новые темы с новыми вопросами

P.S.
модератор, могу ли я закрыть тему самостоятельно?

Последний раз редактировалось Ковер; 22.09.2016 в 10:36.
Ковер вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает код!!! Hattak HTML и CSS 6 15.04.2016 09:41
Не работает код sergeant94 БД в Delphi 11 19.06.2013 12:53
не работает код Кинельски Общие вопросы Delphi 1 26.10.2011 19:26
Не работает код hello19 Общие вопросы C/C++ 11 08.08.2011 15:08

Реклама для незарегистрированных, регистрация на форуме