_Q12_ Ответов: 2

Философия программирования-ядро


Как говорится в названии ^

Я хочу-воспроизвести-игру в карты. Игра называется Hearthstone, потому что мне она нравится. Но я хочу сделать его "лучше", поэтому я решил попробовать. Пожалуйста, попытайтесь увидеть это как меня, как упражнение и ничего общего с рекламой или чем-то еще.

Главная проблема у меня есть:
структура ! Как вы можете посоветовать мне его структуру? Двигатель. Ядро, как я это сказал. Я думаю, что ядро ​​- это графический интерфейс, и все вокруг него вращается и связывает. Проблема в том, как сделать это Ядро? Теперь у меня две проблемы: одна - видимость в порядке организации кода (в файлах, все вместе, в объектах), а вторая - сложности в плане деталей кода. Хотел бы я как-то сделать это на объектах ... Я частично это сделал (я сделал объект Card) - но это все, что я мог придумать успешно. Я думал об объекте Table, но выбрасываю его. У объекта карты есть 4 свойства, и он быстро становится очень запутанным. Если мне придется добавить к карточке дополнительные свойства - нестандартные вещи - она ​​станет почти нечитаемой.
Любые хорошие идеи, более чем приветствуются.
Представьте план атаки о том, как действовать - из вашего опыта лучше всего.
В некотором смысле я представляю себе, что это самая хрупкая часть области программирования, и не многие готовы выразить свою внутреннюю борьбу с этим монстром, который является структурой.
Спасибо вам и надеюсь на приятную беседу !

Что я уже пробовал:

все, что я пробовал-теперь буду слушать.

Dave Kreskowiak

Не хочу вас обидеть, но, судя по вашим вопросам, этот проект гораздо сложнее, чем вы готовы взяться.

_Q12_

Я полагаю, что это труднее, чем я могу нести. Это побочный проект, к которому я время от времени прибегал. Я думаю об этом некоторое время(1 год или больше). Теперь мне нужны идеи, потому что я поглотил все, что у меня было. И прогресс идет ужасно медленно. Любые идеи очень приветствуются !

Dave Kreskowiak

Вам труднее всего понять основы языка C#. Что заставляет вас думать, что вы поймете сложные темы, которые потребуются для создания такого проекта? Потому что это те "идеи", которые вам понадобятся.

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

Что касается идей, вы должны научиться планировать часть программного обеспечения, не говоря уже о написании одной строки кода. Например, вы уже полностью сформулировали свои правила игры? Если нет, то почему вы вообще пишете класс под названием "Карта"?

_Q12_

Я понимаю, Спасибо.

[no name]

"Как вы можете посоветовать мне его структуру", мы не можем. Мы не можем, потому что вы пытаетесь заставить людей учить вас программированию по одному вопросу за раз через интернет. Невозможно научить вас программированию через интернет.

_Q12_

Спасибо.

2 Ответов

Рейтинг:
19

HobbyProggy

Поскольку это должно быть решение, я могу попытаться дать вам его, но я должен сказать, что ваша проблема довольно огромна, поэтому правильное решение было бы невозможно дать.

Прежде всего, я восхищаюсь вашей волей улучшить что-то такое сложное ( я сам знаю эту игру), но, как уже говорили другие, я должен сказать, что это большое усилие и большая проблема, так как над этой игрой работали несколько (если не даже сотни) разработчиков в своей конкретной области.

Что касается структурной части, я предлагаю вам прочитать «Шаблоны проектирования» и подумать о том, какой может быть возможная структура, как вы начали с объекта «Карты». В основном я предлагаю вам иметь разделения, такие как объекты (фактически, Datahold), которые подключены через контроллеры (классы, которые выполняют работу) к пользовательскому интерфейсу, который должен быть более глупым, чем интеллектуальным. Это известно как MVC (если вы еще не знаете). В качестве общей структуры подумайте об основных частях, таких как конфигурация и прочее, другой пример - обработка исключений. Вам может понадобиться «движок», который запускает все, включая запуск и обновление пользовательского интерфейса, обработку событий. Между тем вам также нужна графика, которая с одной стороны является объектами, а с другой - "Контроллер" или "Фабрика", как бы вы это ни называли.

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

Он огромен, и ваша архитектура должна адаптироваться к нему, поэтому вам сначала нужно определить, что вам нужно и как вы можете его отделить. Имеет смысл отделить как можно больше и наследовать там, где вам это может понадобиться (например, карты). У вас может быть базовая карта, которая действительно имеет общую необходимую специфику, а затем сокращенно от нее получить карты атаки (Мостеры) и карты защиты (ловушки или что-то подобное) (Если вы хотите, чтобы это было так, так что просто пример).

Я предлагаю вам начать с чего-то маленького, и как только вы поняли, как отделить и построить маленькое, вы можете масштабировать больше, возможно, вы уже можете использовать свой материал и просто улучшить его, чтобы добраться до следующей цели. Хорошо сделанная архитектура может помочь развиваться все больше и больше, так как основы могут быть одинаковыми, и вы можете использовать ее для других проектов. У меня для себя есть, например, один базовый проект, который компилируется в a .dll, которая содержит доступ к базе данных, конфигурационные материалы, обработку исключений и тому подобное.

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


HobbyProggy

Кстати, нет никакого "правильного способа" или "лучшего способа" справиться с этим. Это очень специфично, и поэтому вы должны решать это каждый раз. Рецепт вроде Сделай это таким образом, и ты преуспел, АФАИК, не существует.

_Q12_

Да, именно на такой разговор я и рассчитывал. Спасибо за добрые мысли. Значит, все-таки это огромная проблема не только для меня, но и для других? Я думал, что я недостаточно хорош, хех. Хорошо.
-
Мне очень любопытно ваше .dll и" бизнес-классы " - можете ли вы привести их более наглядные примеры для меня? Когда вы его используете, в каких ситуациях и где? Если у вас есть удовольствие, конечно - думайте об этой дискуссии как о хорошей возможности немного похвастаться чем-то, что у вас есть хорошего. Я думаю, как вы только что сказали - я предполагаю, что это должно быть что - то базовое, как ядро, очень тонкий скелет, который представляет идею для всей игры или ее направления, и вдобавок ко всему, одетый множеством объектов извне-даже из файлов, из dll ,из разных классов, одного и того же кода, чего угодно.
-
В частности, в этом проекте карточной игры все, о чем я мог думать и работать должным образом, - это объект карты, и, как вы сказали, это базовый объект для любого типа карты, которую я буду создавать с этого момента, с любым количеством способностей. в теме. НО (я использую большое НО), этот объект карты является объектом, находящимся за пределами ЯДРА. Эта карта будет прикреплена к ЯДлю. Само ядро, я еще не понял его, я вернусь к его достижению, исходя из того, что я могу наблюдать - и под этим я имею в виду, что я, вероятно, сначала построю объекты, и все они (надеюсь) дадут мне подсказки об этом ЯДРЕ, о котором я мечтаю. Я не уверен, что это ЯДРО вообще существует !! может быть, в моем воображении. Это основная причина, по которой я пришел спросить вас, ребята. Итак ... какие-нибудь хорошие предложения, которые помогут мне понять эту вещь (если это так)?
-
Самое сложное, что я могу придумать, - это как сделать это ядро таким образом, чтобы я мог добавить к нему любое количество объектов. И не только предметы, но и события, и все остальное. Каковы бы ни были потребности, это ядро должно быть способно принимать что угодно и в неограниченном количестве и управлять им должным образом. Кроме того, чтобы быть читаемым и для программиста. Подобно дереву. Ствол дерева очень виден и его легко найти, а листья-это объекты, прикрепленные к этому стволу дерева(или сердцевине).
-
Как я уже сказал, Я не программист, Я художник. Я надеюсь, что вы можете дать мне свое мнение, далее.

_Q12_

"Шаблоны проектирования" - это книга? или это глава на языке c#? Я не очень хорошо в этом разбираюсь.
Я ничего не знаю о MVC.
Но мне нравится, как вы просто приводите пример: "связь между кучей объектов, называемых Datahold, подключенных через контроллеры (классы, которые выполняют эту работу) к пользовательскому интерфейсу, который должен быть более тупым."
-
Это очень близко к тому, что я себе представляю, только на практике это ваааааааай сложнее, чем кажется. Полагаю, дело в том, чтобы привыкнуть к такой конструкции. Верно?
-
Моя большая проблема заключается в том,как распространить их - весь код (obj,события,clases, все) в одном файле? Или каждая вещь в этом отдельном файле? например, иметь 1000 файлов для всей программы. Я пытаюсь визуализировать структуру здесь, поэтому я спрашиваю, как лучше всего подойти. Лучше всего, может быть, это большое слово, но как вы, ребята, делаете это из своей практики, это все, что я спрашиваю.

HobbyProggy

Рад, что вы получили немного того, на что я хотел указать, и да, это проблема для большинства программистов, так как это работа архитектора. Это трудно для всех, но с опытом и " шаблонами дизайна "мы справляемся с этим, потому что знаем, как это сделать, и у нас есть для этого" инструменты". Так что вы, вероятно, достаточно хороши, но вам не хватает опыта.
-
Чтобы спроектировать шаблоны, это не книга, это слово для набора конструктивных структур, которые вы можете использовать. Так что есть севаральские книги и статьи в Википедии об этом.
-
К.Dll-файлы, я думаю, вы знаете, для чего они нужны? Если нет, то просто запрограммируйте небольшое программное обеспечение, которое имеет 2 файла проекта, Один из которых настроен на компиляцию как dll, а другой-как исполняемый файл. Исполняемый проект нуждается в проекте dll в качестве ссылки и видит, как происходит "волшебство".
"Проект. dll" (если его можно так назвать) - это просто файл проекта, состоящий из классов, представлений, всего того, что может быть использовано реальными "проектами.exe". Таким образом, вы создаете модульную систему, способную изменять одну часть без" необходимости " прикасаться к другой.
-
Бизнес-класс для меня - это класс, который занимается бизнесом (забавно, правда?), Например, у меня есть пользовательский интерфейс, который отображает набор данных (подумайте о листе Excel). Я нажимаю на отображение данных -> пользовательский интерфейс теперь вызывает его контроллер и запрашивает данные -> контроллер запрашивает у бизнес-класса данные, которые он хочет -> бизнес-класс теперь выполняет свою работу и использует базовый модуль для получения запрошенных объектов . Как только бизнес-класс получает объекты, он передает их контроллеру -> контроллер сохраняет их в своем хранилище данных и заполняет данными пользовательский интерфейс. Вуаля, вы видите данные на экране. Поскольку это всего лишь пример, он может не соответствовать вашему случаю на 100%, но я надеюсь, что вы понимаете это. И хотя это звучит сложно, оно того стоит, поскольку вы можете изменить на каждом слое без необходимости (иногда вам может потребоваться изменить) что-то менять в других частях.
Чтобы сказать это в одном предложении: "бизнес-класс должен быть классом, который посвящен ровно одной работе или предмету и имеет код "производство/бизнес" для этой работы или предмета".
-
Я могу сказать вам, что это ядро, о котором вы говорите, существует, поскольку каждое приложение нуждается в сердце, которое продолжает качать. Как будет выглядеть" ядро", вы должны выяснить сами. Но вам не нужно создавать ядро, а затем переключаться на другие вещи. Сделайте это так, как вы думаете, вы найдете решение. Может быть, начать с объектов и выяснить, как их соединить. Вы должны найти свой способ создания системы, никто не может научить вас этому, мы просто можем дать подсказки или перспективы, как мы это сделаем.
-
Это, безусловно, самое сложное, но если вы правильно используете свои инструменты, вы можете построить ядро, а затем отделить его, расширить, снова отделить, и у вас, наконец, будет ядро, состоящее из нескольких классов, работающих вместе и приводящих машину туда, где она вам нужна. Вы художник, подумайте о картине, вы начинаете с одной точки и заполняете ее, вы разделяете взгляды на объекты на ней и конкретизируете ее по частям, чтобы сделать окончательную целую картину, верно? Это просто так, но более технически :)
-
MVC - один из наиболее часто используемых (надеюсь, я прав :) ) паттернов, хотя он выталкивается MVVM, который является еще одним паттерном, который я не могу объяснить очень хорошо ^^.
Идея MVC (Model-View-Controler) состоит в том, чтобы сохранить пользовательский интерфейс как пользовательский интерфейс, который является тупым и просто представляет данные. Контроллер выполняет эту работу, запрашивая данные или запихивая их в пользовательский интерфейс. Модель-это фактический объект данных, который удерживается контроллером. Идея заключается в том, что если пользовательский интерфейс запрашивает обновление, то контроллер делает это, а если модель обновилась, то контроллер запихивает ее в пользовательский интерфейс. Вы можете изменить пользовательский интерфейс и позволить контроллеру быть и наоборот, то же самое касается изменений в модели, так как все хорошо разделено и имеет свою специальную работу.
-
И да, это вопрос попадания в него, как только у вас есть опыт, вы создаете свои собственные шаблоны в соответствии с вашими предыдущими шагами и будете легче брать на себя такую работу.
-
Способ 2, это звучит как много, но вы увидите, что это меньше, чем 1000 файлов

_Q12_

Я делаю практический код после вашего объяснения, чтобы лучше понять, что вы объясняете. Только если вы чувствуете потребность или удовольствие исправить это, пожалуйста, сделайте. Я старался как можно ближе подойти к тому, что вы там сказали. Это немного умопомрачительно для меня. Мне определенно нужна практика с этим материалом. Вы полностью помогаете прямо сейчас!!
-
весь код здесь:
-
использование системы;
использование системы.Коллекции.Общий;
использование системы.ComponentModel;
используя системы.Сведения;
использование системы.Рисование;
использование System. Linq;
используя системы.Текст;
использование системы.Окна.Формы;

пространство имен WindowsFormsApplication4
{
общественности частичного класс form1 : форма
{
открытый form1()
{
метод InitializeComponent();
}

//вот запросы пользовательского интерфейса:
частный недействительными обработчика button1_click(объект отправителя, EventArgs в электронной)
{
Бизнес b = новый бизнес();
б.ИП();
этикетка 1.Текст = б.ИП();
}
}


// это полезно для компартиментализации / наслоения-теперь я вижу.
// если я не ошибаюсь, этот класс выглядит очень близко к моей основной штуке. Верно? Ocieni interesnaia :)
общественный класс Бизнес
{
публичный строковый пользовательский интерфейс()
{
if (Controller ()! = null) return Controller();
else return " ошибка: контроллер пуст";
//эта другая часть бессмысленна - у меня есть внутри контроллера еще один другой, который делает то же самое !!!
}


регулятор публичных строку ()
{
Бизнес b = новый бизнес();
Basic_Module bm = новый Basic_Module();
// только так я могу истолковать ваше утверждение: "контролер спрашивает, Что это бизнес-класс" +
// + "бизнес-класс теперь выполняет эту работу и использует базовый модуль для получения запрошенных объектов"
if (b. Contains(bm. Data01 ()))/ / если вы видите одни и те же данные в обоих местах(здесь, в бизнесе, и в Basic_Module)? тефак?
{
вернуться Data01();
}
ещё
{
возвращение "никакой текстовой информации";
}
}



public bool содержит (строковые данные)
{
if (data != null) возвращает true;
else return false;
}

общественного строка Data01()
{
возврат "большого количества текстовых данных";
}
}


публичный класс Basic_Module
{
общественного строка Data01()
{
возврат "большого количества текстовых данных";
}
}
}

HobbyProggy

Близко, но не 100% ;)

Вот "правильный" порядок того, что я сказал.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form, Interface1
{
Controler _c = null;

public Form1()
{
InitializeComponent();
_c = new Controler(this);
}

public void SetUI(string Data)
{
label1.Text = Data;
}

//here is the UI Requests:
private void button1_Click(object sender, EventArgs e)
{
_c.GetData();
}
}

//The Business Class
public class Business
{
public string UI()
{
string _uiData = "";
Base _base = new Base();
_uiData = _base.requestDataFromDatabase();
return _uiData;
}
}

//The controler Class
public class Controler
{
Interface1 _view = null;

public Controler(Interface1 View)
{
_view = View;
}

public void GetData()
{
Business _b = new Business();
string _data = _b.UI();
_view.SetUI(_data);
}
}

public class Base
{
//Somehow this grabs data with specified methods
public string requestDataFromDatabase()
{
string _data = "";
//Grab data
_data = "Hello";
//If Data is bad
if (string.IsNullOrEmpty(_data))
{
return "No Data";
}
else
{
return _data;
}
}
}

public interface Interface1
{
void SetUI(string Data);
}
}


Я забыл интерфейс, чтобы было более понятно, как работает разделение, я добавил его сейчас. Как вы можете видеть в интерфейсе, вы объявляете метод head. Это означает, что все, что вы меняете внутри метода, пока голова не затронута, не имеет значения для остальных ваших классов.

Кстати, это очень сложно, с большим количеством шестеренок, работающих на нем, так что если вы хотите просто сделать это. Как я уже говорил, начинайте и отделяйтесь время от времени, и вы получите представление о том, как это работает. Трудно, но эффект обучения больше.

* Обновил код, чтобы он работал, кое-что забыл ^^* я не часто программирую без своей IDE.

_Q12_

Спасибо Вам за ваш код! Она действительно очень развита. Не могу сказать, что многое из этого я понял, только часть. Я вставляю его в свой VS 2010, и я получаю много красных волнистых линий по всему коду. Может быть, это псевдокод?
-
Мне давно рассказывали об интерфейсах, я их просматриваю, но толку от них мало. Они должны быть из более широкого контекста, который я пока не понимаю. Я понимаю, что они делают, но когда я пытался использовать их, это очень запутывало все, и я оставлял это в покое.
-
Я очень ценю все, что вы мне рассказали. Но в этой части с вашим кодексом я потерян, если быть искренним. Из того, что я могу понять, в обоих кодах мы используем это расслоение, используя разные классы. Работая над своим кодом (до вашего кода), я пытаюсь добавить возможность обновления, и это беспорядок. Это очень трудно реализовать и проследить визуально и логически, разделяя одно и то же во многих классах. Но, может быть, это потому, что мой код очень простой и не настолько продвинутый. Ваш код должен быть переведен на что-то базовое, как это сделал я. - Нет?

_Q12_

Ваш код можно преобразовать во что-то более простое ? Я имею в виду, не для того, чтобы узнать что-то новое, а чтобы сделать это с тем, что я уже знаю. То, что я спрашиваю сейчас, звучит глупо, я знаю. В конце концов я научусь всему высокоуровневому, но..... Сначала я должен попытаться ткнуть в куст.

_Q12_

Кроме того, что такое хорошая книга/учебник по этому предмету, которую я могу продолжить/прочитать/посмотреть ?
-
У меня уже есть предложение от нашего друга Ричарда Маккатчана с книгой: .NET Book Zero Чарльза Петцольда - я ее прочитаю.

HobbyProggy

Кстати, извините за поздний ответ, я забыл отправить свой ответ в пятницу, и у меня не было времени на выходные.

HobbyProggy

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

_Q12_

О, вы мне очень помогли ! Спасибо Вам за все ответы ! Мне чрезвычайно любопытно, как работают и думают другие люди - я занимаюсь программированием в качестве хобби, совсем один. Я не программист. Вот почему я спрашиваю. Извиняюсь. :) Хорошего вам следующего года, в 2017-м.
-
как всегда...
В12

Рейтинг:
1

Richard MacCutchan

Вчера я сделал тебе предложение. Как создать массив void?[^] что помогло бы вам. Но пока вы не последуете этому и не станете действительно опытным в C'#, вы не добьетесь никакого прогресса. Размещение вопросов о программировании, когда вы еще не до конца понимаете язык, - это просто пустая трата нашего времени и, что более важно, пустая трата вашего.


_Q12_

Вашим предложением была книга "ноль" Чарльза Петцольда-я ее прочту.