| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Абстракция игрока в крестиках-ноликах |
| Автор: YankovskyAndrey 4.3.2011, 09:48 |
| Я пишу крестики-нолики. хочу создать единый метод для проведения игры внезависимости от типа игроков(человек/компьютер) то есть должны работать человек-человек, компьютер-компьютер, человек-компьютер. Пробовал подходить с разных сторон, но в цельную картинку сложить не удаётся. Туплю Спасибо. |
| Автор: YankovskyAndrey 4.3.2011, 17:18 | ||
у меня есть несколько проблем. примерно картинка такая:
в коде могут быть ошибки. но проблема, я думаю, ясна Как свести процесс нажатия на клетку пользователем и процесс высчитывания позиции компьютером под общий интерфейс. чтобы игра могла проходить в контексте класса Player? или это всё зря и я дурной? хочу пробовать разные алгоритмы для компьютера и чтоб они могли соревноваться между собой +хочу сделать сетевой режим для живых игроков Добавлено @ 17:26 фабрика не подойдёт насколько я понимаю. её можно было бы применить, если бы имелось два семейства алгоритмов выбора ходов и надо было бы провести турнир. я ведь не могу предложить несколько реализаций человека. не бог же. я правильно понял принцип? |
| Автор: YankovskyAndrey 4.3.2011, 17:56 |
| я ещё игрушку написал, остановка на том же самом месте. |
| Автор: Экскалупатор 4.3.2011, 20:27 | ||
не совсем, фабрика дает возможность использовать разные алгоритмы, т.е. к примеру у тебя есть интерфейс в котором есть метод "сделать ход", при этом программе все равно кто делает ход, компьютер или игрок, вызывающему классу нужен результат, а фабрика инициализирует класс который будет делать то что тебе нужно, очевидно что игрок-компьютер и игрок-человек будут делать одни и те же действия(совершать ходы), а значит у тебя должно быть два класса(или больше) но один должен "работать с человеком"(ждать нажатия и пр.) , а второй запускать работу разработанного тобой ИИ, но для вызывающего класса никакой разницы, в этом и есть суть. Добавлено через 11 минут и 53 секунды
все поля уже содержаться в твоей программе(ведь ты же их как то рисуешь) сделай что бы твой класс мог "нажимать" на клетки. но вообще я думаю тут надо разделить, надо что бы класс который выполняет обсчет игровой ситуации получал данные от "игроков" и потом рисовал результаты на форме(ну а игроки в свою очередь должны либо генерить ход(как комп), либо ждать информации от игрока), я думаю у тебя сейчас сделано наоборот, т.е. человек нажимает и это сразу видно и потом все передается на обработку. |
| Автор: YankovskyAndrey 5.3.2011, 08:43 | ||
| всё надоело, написал консольную модель игры. я не знаю почему не мог так раньше сделать. просто бред. два дня сидел. видимо всё из-за работы с интерфейсом пользовательским затуманивает разум
видимо проблема в этом "я думаю у тебя сейчас сделано наоборот, т.е. человек нажимает и это сразу видно и потом все передается на обработку" спасибо и извините за глупые вопросы. |
| Автор: gambit 5.3.2011, 11:49 |
| Посмотри еще паттерн стртегия, я его применял когда писал игру танчики, у меня был игрок и несколько логик для разных танчиков, и все все имели одинаковый доступ к полю |
| Автор: YankovskyAndrey 5.3.2011, 12:14 | ||
| Круто!) у меня всё ещё есть ступор в плане обобщения компьютера и человека. то есть как написать с десяток стратегий для танчиков - понятно. а как запихнуть сюда человека для меня неочевидно. Можно ваши танчики посмотреть? и я так понимаю в стратегии важно не привязывание разных стратегий(есть другие способы), а возможность их менять налету.
я так понимаю что паттерн хорош для смены стратегий танчиков во время игры. Ориентировка на защиту, на нападение. как-то так. человек опять ни к месту) |
| Автор: Экскалупатор 5.3.2011, 12:46 |
| YankovskyAndrey, а чем не подходит(что не понятно) в том что я написал? отдели логику игры от "игроков"(неважно компьютера или человека), логика должна ждать сообщений от "игроков"(ей должно быть все равно ходит человек или машина). при этом класс реализующий работу машины и класс реализующий работу живого игрока должны наследовать одному интерфейсу, через этот интерфейс и будет происходить передача сообщений. |
| Автор: YankovskyAndrey 5.3.2011, 12:51 |
| я сейчас так и делаю) я так с самого начала пытаюсь делать)) |
| Автор: Экскалупатор 5.3.2011, 13:02 |
| YankovskyAndrey, так расскажи что конкретно не выходит. у тебя должны получиться несколько "независимых" друг от друга слоев. 1. логика игры 2. логика игроков(разных) 3. собственно поле игры 4. интерфейс на котором все это будет отображаться *это на вскидку в реале может и отличаться логика игры не должна вообще знать кто играет, она просто опрашивает игроков и получает от них информацию о ходах. потом изменяет поле(не интерфейс, а то где хранятся данные по игре(может матрица какая или еще что)), а потом рисует эти изменения на экране что бы пользователь видел. в случае класса "ИИ" все просто, получил данные от класса, изменил на экране... PROFIT!!!. с игроком сложнее потому что игрок пользуется тем же интерфейсом для ввода данных что и логика для вывода, но с другой стороны, если форма ждет нажатия значит должны отработать события которые изменяют класс игрока и сообщают логике что событие таки произошло, в остальных случаях логика просто изменяет данные на форме. Добавлено через 1 минуту и 19 секунд при этом, как мне кажется, лучше сделать что бы форма отображала данные именно из слоя 3(поле игры - данные), а не хранила данные о ходах в себе. |
| Автор: YankovskyAndrey 5.3.2011, 13:11 |
| мне кажется я уже близок я делаю silverlight + MVVM проблема была ещё и в том, что я логику игры(читай модель) загонял в ViewModel. там и корень зол видимо. мне ещё пара часов нужна и вроде заработает |
| Автор: Экскалупатор 5.3.2011, 13:46 |
| тут главное не спутать логику программы и логику собственно игры, я в своем описании имел ввиду именно логику программы |
| Автор: YankovskyAndrey 5.3.2011, 15:31 | ||||||
| хорошо, я не понимаю как ждать пользовательского ввода) нашёл "The problem is you are trying to make a procedural system in an event driven environment. If you switch to an event driven system, then this will no longer be a problem." вот тут такой же как я http://www.gamedev.net/topic/488236-waiting-for-user-input-in-c-gui-program/ )) мне стыдно, но я не понимаю у меня сейчас есть в классе Player метод void MakeMove() видимо надо двигать к событию OnMoveMaked м?) Добавлено @ 15:36 вот мой базовый класс игры
Добавлено @ 15:40 игра для двух игроков
игрок
|
| Автор: YankovskyAndrey 5.3.2011, 16:27 |
| всю малину портит ожидание пользовательских действий надо видимо поменять в Player MakeTurn на что-то) Добавлено через 8 минут и 59 секунд event driven environment event driven environment event driven environment event driven environment event driven environment |
| Автор: Экскалупатор 5.3.2011, 16:50 |
почему? у тебя когда два игрока играют ты же ждешь пользовательских действий? и тут тоже самое |
| Автор: YankovskyAndrey 5.3.2011, 17:20 |
| УРА! ВСЁ! Дошло! "The problem is you are trying to make a procedural system in an event driven environment. If you switch to an event driven system, then this will no longer be a problem." повторюсь я пытался сделать игру по такому принципу, что игра просила игроков сделать ход. а надо наоборот, чтобы игроки сообщали о том, что походили. у меня это долго в голове не укладывалось. Экскалупатор, Спасибо большое! |
| Автор: gambit 5.3.2011, 18:05 | ||||||
Там был метод который решал что делать в данный момент.
И была стратегия для человека
Упрощенно, это так выглядело. |
| Автор: YankovskyAndrey 5.3.2011, 18:29 |
| на XNA? всё время проверялось состояние клавиатуры? я только что въехал, что не игра играет игроками, а с точностью наоборот и пытаюсь блеснуть знаниями |
| Автор: Экскалупатор 5.3.2011, 20:14 | ||
это зависит от специфики игры, думаю в твоем случае это будет просто клик, приложение(та часть которая UI) должна его ожидать и сообщать что оно произошло. |