Курсы по программированию

Формула программиста
основатель — Волосатов Евгений Витольдович

Игра Сокобан / Сокобан - Игра - На двоих по сети

  • На этом уроке мы наконец-таки сделаем сетевую версию программы Sokoban для двоих.
    Мы будем использовать телефонный класс Phone с прошлого урока.
  • Дата отправки отчёта: 24 августа 2015 г.
  • Задание выполнено: за 1 час. 30 мин.
  • Чему научился: Передавать данные по сети. Общаться из программы с консолью
  • Что было сложным: Сфотографировать два компьютера)
  • Комментарии: Или это я пропустил, или это сделано преподавателем намеренно - но я не увидел объяснения, как непосредственно соединить два РАЗНЫХ компьютера по сети. Во всех сетевых уроках мы работали на IP 127.0.0.1 (т.е. на localhost'е). Поэтому для разных компьютеров я придумал решение сам(скорее всего дико неоптимальное) - при инициализации сервера программа открывает консоль и посылает туда запрос "ipconfig", считывает ответ, находит строку, в которой написан IP-адрес, вытаскивает его из этой строки и вставляет в текстовое поле. Далее при нажатии на кнопку запуска игры появляется сообщение о том, какой IP-адрес нужно сообщить клиенту. Как-то так.
    P.S. Не очень получилась фотография двух компьютеров.
  • Оценка видео-уроку:
Отчёт от 4362 за Игра Сокобан / Сокобан - Игра - На двоих по сети


Отчёт от 4362 за Игра Сокобан / Сокобан - Игра - На двоих по сети




Оцени работу

 
Сохранить страницу:

24. Оля
Оля
ответить
→  Сергей  # Игра Сокобан / Сокобан - Игра - На двоих по сети / 2015-08-24 23:56

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


4362. Сергей
Сергей
ответить
→  Оля  # Игра Сокобан / Сокобан - Игра - На двоих по сети / 2015-08-24 23:51

А разве IP виртуальной машины и самого компьютера не должны совпадать? Железо же одно)


4362. Сергей
Сергей
ответить
# Игра Сокобан / Сокобан - Игра - На двоих по сети / 2015-08-24 23:44

Да, конечно можно, вот код, который этим делом занимается (пример работы с консолью я нашел на каком-то форуме и адаптировал его под свои нужды, а до этого тоже не знал, как "общаться" с консолью) :
         
            //Создание процесса
            ProcessStartInfo psiOpt = new ProcessStartInfo(@"cmd.exe", @"/C ipconfig /all");

            //Установка скрытого режима (чтобы окно консоли с запросом не выводилось на экран и не мешало работать)
            psiOpt.WindowStyle = ProcessWindowStyle.Hidden;

            //Это, честно говоря, не помню что такое)
            psiOpt.UseShellExecute = false;

            //Разрешение перенаправления выходного потока данных (ответа от консоли)
            psiOpt.RedirectStandardOutput = true;

            // запускаем процесс
            Process procCommand = Process.Start(psiOpt);

            // получаем ответ запущенного процесса
            StreamReader srIncoming = procCommand.StandardOutput;
            string stringg = srIncoming.ReadToEnd();

            //Преобразуем ответ в массив строк
            string[] st = stringg.Split('\n');

            // закрываем процесс
            procCommand.WaitForExit();
            foreach (var s in st)
            {
                //Ищем строчку, в которой указан наш IP (в ней есть фраза "IPv4")
                if (s.Contains("IPv4"))
                {
                    //Вытаскиваем из нее сам IP адрес
                    string ss = s.Substring(s.IndexOf(":") + 2, s.IndexOf("(") - s.IndexOf(":") - 2);
                    Console.WriteLine(string.Format("Сообщите IP {0} своему коллеге-клиенту", ss));
                    host = ss;
                    break;
                }
            }


2146. Иван
Иван
ответить
→  Сергей  # Игра Сокобан / Сокобан - Игра - На двоих по сети / 2015-08-24 23:18

Здорово! Было бы здорово этот "костыль" показать. Здорово, что все получилось. Я вообще не представляю, как считать ответ из консоли в программу, да еще и отпарсить его правильно. Может можно какой-нибудь скриншотик с кодом этого дела? Думаю все будут признательны.


24. Оля
Оля
ответить
→  Сергей  # Игра Сокобан / Сокобан - Игра - На двоих по сети / 2015-08-24 22:57

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


1. Евгений Витольдович
Евгений Витольдович
ответить
→  Сергей  # Игра Сокобан / Сокобан - Игра - На двоих по сети / 2015-08-24 21:39

Сергей, ты первый :)
Да ещё и с таким анализом, у меня даже в мыслях не было - таким способом подсказывать пользователю айпи адрес :)


  • Отчёт оценивали:
    Посетитель+1   4972looker+1  

Начинаем практику по языку C#




Чтобы стать хорошим программистом — нужно писать программы. На нашем сайте очень много практических упражнений.

После заполнения формы ты будешь подписан на рассылку «C# Вебинары и Видеоуроки», у тебя появится доступ к видеоурокам и консольным задачам.

Несколько раз в неделю тебе будут приходить письма — приглашения на вебинары, информация об акциях и скидках, полезная информация по C#.

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