Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Free Heroes II
DF2 :: ФОРУМЫ > Игровые форумы > Heroes of Might & Magic > Heroes II
Страницы: 1, 2, 3, 4, 5
Orzie
Я тебе ещё раз говорю: FreeHeroes в текущем виде неиграбельна из-за тупого искусственного интеллекта, и турниров по этой причине на ней не будет.

Цитата
И жалуются что кампании нет. А теперь кампании будут !!!

Они хотят, эм, не твои кампании, а оригинальные.
t800
Цитата(Orzie @ 14 Sep 2015, 22:28) *
Цитата
И жалуются что кампании нет. А теперь кампании будут !!!

Они хотят, эм, не твои кампании, а оригинальные.


Думаешь им нужны оригинальные? Оригинальные кампании тоже можно загрузить.
Вот загрузил archi.gif roland.gif yahoo.gif yahoo.gif yahoo.gif


Для этого просто надо было переименовать файлы оригинальных кампаний из .НС2 сперва в .MP2 потом отрыть эпизоды через Standart Game пересохранить перенести сейвы в папочку campain и переименовать их в .саm и все получилось!

И можно играть оригинальные. Надо только рейтинг сделать и чтобы из файликов порядок сценариев брала.

Хотя я думаю что интересней играть кампании которые не знаешь! И в кампанию T-800 играть им будет интересней чем в оригиринальные. Потому что в оригинальные уже играли а в T-800 еще ни разу не играли.
Orzie
Давай не будем сравнивать наколенную поделку 11летнего мальчика и официальную кампанию. Я тебе что про самокритику говорил?

Людям нужны оригинальные. И ты их не починил, потому что стартовые экраны с видео и описаниями, а также Наградами по-прежнему не работают.
t800
Ну никак не могу разобоаться с командами чтобы игра порядок эпизодов брала из текстового файликиков t800.txt good1.txt и evil1.txt которые я положил в папочку campain с именами эпизодов no.gif no.gif

Вот например good1.txt

Код
CAMPG01.cam
CAMPG02.cam
CAMPG03.cam
CAMPG04.cam
CAMPG05B.cam
CAMPG05.cam
CAMPG06.cam
CAMPG07.cam
CAMPG08.cam
CAMPG09.cam
CAMPG10.cam
CAMPE11.cam


Не могу разобраться какие команды надо вставить в

Код
int Game::NextCampain(void)
{
   std::string file = "files/campain/T-800 Epizode 1.sav";
   if(file.empty() || !Game::Load(file)) return MAINMENU;
   return STARTGAME;
}


вместо std::string file = "files/campain/T-800 Epizode 1.sav";
чтобы игра брала список из файла смотрела какую игру она сейчас закончила
например CAMPG01.cam и загружала бы следующую по списку.
Эроласт
Гугли что-нибудь вроде "c++ работа с файлами" или "c++ read a file".
https://www.google.com/search?q=c%2B%2B+работа+с+файлами
t800
Цитата(Эроласт @ 15 Sep 2015, 17:06) *
Гугли что-нибудь вроде "c++ работа с файлами" или "c++ read a file".
https://www.google.com/search?q=c%2B%2B+работа+с+файлами


Нашел вот такие команды

Код
std::string item_name;
std::ifstream nameFile;

nameFile.open("files/campain/t800.txt");
while (nameFile >> item_name)
{
    std::getline(nameFile, item_name);
}
nameFile.close();


Попробовал вставить в


Код
int Game::NewCampain(void)
{

std::string item_name;
std::ifstream nameFile;

nameFile.open("files/campain/t800.txt");
while (nameFile >> item_name)
{
    std::getline(nameFile, item_name);
}
nameFile.close();

std::string file = item_name;
//std::string file = "files/campain/T-800 Epizode 1.sav";
if(file.empty() || !Game::Load(file)) return MAINMENU;
return STARTGAME;
    
}


Собрал игру нажимаю ничего не загружается просто выкидаывает в главное меню

Я даже попробовал только одну строчку в t800.txt отставить. Чтобы проверить возмет игра название из файлика
Все равно ничего не загружается. И выкидывает в главное меню. no.gif no.gif


t800
Cчас даже вот так сделал

Код
int Game::NewСampain(void)
{
std::string item_name;
std::ifstream nameFile;

nameFile.open("files/campain/t800.txt");
std::getline(nameFile, item_name);
nameFile.close();

std::string file = item_name;
//std::string file = "files/campain/T-800 Epizode 1.sav";

if(file.empty() || !Game::Load(file)) return MAINMENU;
return STARTGAME;
    
}



Все равно не загружает. В чем дело?
Эроласт
Компилятор никак ругается? "#include <iostream>" в самом верху файла есть? Каково содержание файла "files/campain/t800.txt"? Путь до него правильный?

Касательно кода, не используй излишние переменные и называй их по-нормальному:
Код
int Game::NewСampain(void)
{
    std::ifstream scenarioListFile;
    std::string scenarioFilePath;

    scenarioListFile.open("files/campain/t800.txt");
    std::getline(scenarioListFile, scenarioFilePath);
    scenarioListFile.close();

    if(scenarioFilePath.empty() || !Game::Load(scenarioFilePath)) return MAINMENU;
    return STARTGAME;
}
t800
Цитата(Эроласт @ 15 Sep 2015, 18:26) *
Компилятор никак ругается? "#include <iostream>" в самом верху файла есть? Каково содержание файла "files/campain/t800.txt"? Путь до него правильный?

Касательно кода, не используй излишние переменные и называй их по-нормальному:
Код
int Game::NewСampain(void)
{
    std::ifstream scenarioListFile;
    std::string scenarioFilePath;

    scenarioListFile.open("files/campain/t800.txt");
    std::getline(scenarioListFile, scenarioFilePath);
    scenarioListFile.close();

    if(scenarioFilePath.empty() || !Game::Load(scenarioFilePath)) return MAINMENU;
    return STARTGAME;
}



Нет не ругается. Игру собирает нормально.
Я никак и не называл. Я же команды из примера взял.



Цитата(Эроласт @ 15 Sep 2015, 18:26) *
Компилятор никак ругается? "#include <iostream>" в самом верху файла есть? Каково содержание файла "files/campain/t800.txt"? Путь до него правильный?


Получилось!!!!!!!!!!!! barb_metal.gif barb_metal.gif

Сперва вставил команды

Код
    std::ifstream scenarioListFile;
    std::string scenarioFilePath;

    scenarioListFile.open("files/campain/t800.txt");
    std::getline(scenarioListFile, scenarioFilePath);
    scenarioListFile.close();

    if(scenarioFilePath.empty() || !Game::Load(scenarioFilePath)) return MAINMENU;
    return STARTGAME;


Собрал игру. Запустил нажал на кпопку. И все равно попал в главное меню sad.gif

А потом нашел!!! brags.gif brags.gif

В файлике t800.txt !!!!!

Вместо

Код
test.cam


Написал

Код
files/campain/test.cam


И компания запустилась!!! brags.gif brags.gif brags.gif




Игра оказывается не там искала!

Теперь осталось только придумать как сделать чтобы игра нужную строчку в файлике искала, не только первую
t800
Кажется получилось! И чтобы игры брала имена из списка надо переименовать сейвы кампаний обратно в как назывались их карты. И записывать в файлах .txt названия файлов карт (сейвов переименованных в их карты) потому что при сейвах игра помнит имена исходных карт!!! А не сейвов. biting.gif

Команды такие

Код
    int Game::NextCampain(void)
    {
       std::string file;
       Settings & conf = Settings::Get();
       std::string savname = conf.MapsFile();
       std::string path = Settings::GetCampainDir();
       std::cout << path << " Путь\n";
       std::cout << savname << " Имя карты\n";
        std::string listname = StringLower(conf.MapsFile().substr(0,4)) + ".txt";
        std::cout << listname << " Имя списка\n";
        listname = System::ConcatePath(path,listname);
        std::cout << listname << " Имя списка с путем\n";
    
        std::ifstream scenarioListFile;
        std::string scenarioFileName;
    
        scenarioListFile.open(listname.c_str());
        while(getline(scenarioListFile, scenarioFileName))
       {
        if(savname == scenarioFileName)
          {
          getline(scenarioListFile, scenarioFileName);
          break;
          }
       }
      
       file = System::ConcatePath(path,scenarioFileName);
       std::cout << file << " Имя файла чтобы загружать\n";
      
    if(file.empty() || !Game::Load(file)) return MAINMENU;
    return STARTGAME;
    }






И еще я разобрался как смотреть имена в терминале!!! barb_metal.gif barb_metal.gif barb_metal.gif

для этого надо вставлять команды

Код
       std::cout << path << " Путь\n";
       std::cout << savname << " Имя карты\n";


И тогда когда нажимаешь в игре кнопки в терминале можно посмотреть какие файлы игра открывает!!!
t800
А как надо считать рейтинги для кампаний? Просто складывать обычный рейтинг для каждого из сценарие? Или как?
Эроласт
Цитата
надо вставлять команды

Я же уже говорил: термин "команды" в программировании не употребляется. Код, операции, алгоритм, но никак не "команды".

По поводу переменных. Если пишешь части слова вместе, без подчеркивания, то начинай каждое новое с большой буквы. Это называется camel case.
t800
Решил сделать рейтигин для кампаний! Открыл файлик highscores_game.cpp который его делает


Код
#include <algorithm>
#include <sstream>
#include <vector>
#include <string>
#include <cstring>
#include <ctime>

#include "system.h"
#include "gamedefs.h"
#include "text.h"
#include "agg.h"
#include "cursor.h"
#include "button.h"
#include "dialog.h"
#include "settings.h"
#include "world.h"
#include "zzlib.h"
#include "game.h"
#include "game_over.h"

#define HGS_ID    0xF1F3
#define HGS_MAX    10

struct hgs_t
{
    hgs_t() : days(0), rating(0) {};

    bool operator== (const hgs_t &) const;

    std::string    player;
    std::string    land;
    u32        localtime;
    u32        days;
    u32        rating;
};

StreamBase & operator<< (StreamBase & msg, const hgs_t & hgs)
{
    return msg << hgs.player << hgs.land << hgs.localtime << hgs.days << hgs.rating;
}

StreamBase & operator>> (StreamBase & msg, hgs_t & hgs)
{
    return msg >> hgs.player >> hgs.land >> hgs.localtime >> hgs.days >> hgs.rating;
}

bool hgs_t::operator== (const hgs_t & h) const
{
    return player == h.player && land == h.land && days == h.days;
}

bool RatingSort(const hgs_t & h1, const hgs_t & h2)
{
    return h1.rating > h2.rating;
}

class HGSData
{
public:
    HGSData() {}

    bool Load(const std::string &);
    bool Save(const std::string &);
    void ScoreRegistry(const std::string &, const std::string &, u32, u32);
    void RedrawList(s32, s32);
private:
    std::vector<hgs_t> list;
};

bool HGSData::Load(const std::string & fn)
{
    ZStreamFile hdata;
    if(! hdata.read(fn)) return false;

    hdata.setbigendian(true);
    u16 hgs_id = 0;

    hdata >> hgs_id;

#ifdef FORMAT_VERSION_3225
    // old stream ver. skip 4 byte
    if(hgs_id != HGS_ID)
    hdata >> hgs_id >> hgs_id;
#endif

    if(hgs_id == HGS_ID)
    {
    hdata >> list;
    return ! hdata.fail();
    }

    return false;
}

bool HGSData::Save(const std::string & fn)
{
    ZStreamFile hdata;
    hdata.setbigendian(true);
    hdata << static_cast<u16>(HGS_ID) << list;
    if(hdata.fail() || ! hdata.write(fn)) return false;

    return true;
}

void HGSData::ScoreRegistry(const std::string & p, const std::string & m, u32 r, u32 s)
{
    hgs_t h;

    h.player = p;
    h.land = m;
    h.localtime = std::time(NULL);
    h.days = r;
    h.rating = s;

    if(list.end() == std::find(list.begin(), list.end(), h))
    {
    list.push_back(h);
    std::sort(list.begin(), list.end(), RatingSort);
    if(list.size() > HGS_MAX) list.resize(HGS_MAX);
    }
}

void HGSData::RedrawList(s32 ox, s32 oy)
{
    const Settings & conf = Settings::Get();

    // image background
    const Sprite &back = AGG::GetICN(ICN::HSBKG, 0);
    back.Blit(ox, oy);

    const Sprite &head = AGG::GetICN(ICN::HISCORE, 6);
    if(conf.QVGA())
    head.Blit(ox + 25, oy + 15);
    else
    head.Blit(ox + 50, oy + 31);

    std::sort(list.begin(), list.end(), RatingSort);

    std::vector<hgs_t>::const_iterator it1 = list.begin();
    std::vector<hgs_t>::const_iterator it2 = list.end();

    Text text;
    text.Set(conf.QVGA() ? Font::SMALL : Font::BIG);

    for(; it1 != it2 && (it1 - list.begin() < HGS_MAX); ++it1)
    {
    const hgs_t & hgs = *it1;

    text.Set(hgs.player);
    text.Blit(ox + (conf.QVGA() ? 45 : 88), oy + (conf.QVGA() ? 33 : 70));

    text.Set(hgs.land);
    text.Blit(ox + (conf.QVGA() ? 170 : 260), oy + (conf.QVGA() ? 33 : 70));

    text.Set(GetString(hgs.days));
    text.Blit(ox + (conf.QVGA() ? 250 : 420), oy + (conf.QVGA() ? 33 : 70));

    text.Set(GetString(hgs.rating));
    text.Blit(ox + (conf.QVGA() ? 270 : 480), oy + (conf.QVGA() ? 33 : 70));

    oy += conf.QVGA() ? 20 : 40;
    }
}

int Game::HighScores(bool fill)
{
    Cursor & cursor = Cursor::Get();
    Display & display = Display::Get();
    const Settings & conf = Settings::Get();

    cursor.Hide();
    if(fill) display.Fill(ColorBlack);

#ifdef WITH_DEBUG
    if(IS_DEVEL() && world.CountDay())
    {
    std::string msg = std::string("Devepoper mode, not save! \n \n Your result: ") + GetString(GetGameOverScores());
    Dialog::Message("High Scores", msg, Font::BIG, Dialog::OK);
    return MAINMENU;
    }
#endif

    HGSData hgs;

    std::ostringstream stream;
    stream << System::ConcatePath(conf.GetSaveDir(), "fheroes2.hgs");

    cursor.SetThemes(cursor.POINTER);
    Mixer::Pause();
    AGG::PlayMusic(MUS::MAINMENU);
    hgs.Load(stream.str().c_str());

    const Sprite &back = AGG::GetICN(ICN::HSBKG, 0);

    cursor.Hide();
    const Point top((display.w() - back.w()) / 2, (display.h() - back.h()) / 2);

    hgs.RedrawList(top.x, top.y);

    LocalEvent & le = LocalEvent::Get();

    Button buttonCampain(top.x + (conf.QVGA() ? 0 : 9), top.y + (conf.QVGA() ? 100 : 315), ICN::HISCORE, 0, 1);
    Button buttonExit(top.x + back.w() - (conf.QVGA() ? 27 : 36), top.y + (conf.QVGA() ? 100 : 315), ICN::HISCORE, 4, 5);

    buttonCampain.Draw();
    buttonExit.Draw();

    cursor.Show();
    display.Flip();

    const u32 rating = GetGameOverScores();
    const u32 days = world.CountDay();
    GameOver::Result & gameResult = GameOver::Result::Get();

    if(rating && (gameResult.GetResult() & GameOver::WINS))
    {
    std::string player(_("Unknown Hero"));
    Dialog::InputString(_("Your Name"), player);
    cursor.Hide();
    if(player.empty()) player = _("Unknown Hero");
    hgs.ScoreRegistry(player, Settings::Get().CurrentFileInfo().name, days, rating);
    hgs.Save(stream.str().c_str());
    hgs.RedrawList(top.x, top.y);
    buttonCampain.Draw();
    buttonExit.Draw();
    cursor.Show();
    display.Flip();
    gameResult.Reset();
    }

    // highscores loop    {
    // key code info
        if(Settings::Get().Debug() == 0x12 && le.KeyPress())
            Dialog::Message("Key Press:", GetString(le.KeyValue()), Font::SMALL, Dialog::OK);
    le.MousePressLeft(buttonCampain) ? buttonCampain.PressDraw() : buttonCampain.ReleaseDraw();
    le.MousePressLeft(buttonExit) ? buttonExit.PressDraw() : buttonExit.ReleaseDraw();

    if(le.MouseClickLeft(buttonExit) || HotKeyCloseWindow) return MAINMENU;
    }

    return QUITGAME;
}


У меня впопрос как лучше сделать? Я хочу просто скопировать код команд начинася с

Код
#define HGS_ID    0xF1F3
#define HGS_MAX    10


И до

Код
// highscores loop


Вставить тут же в файл ниже. Везде где стоит HGS переименовать в HGSС , а везде где стоит hgs переименовать в hgsc и потом смотреть как надо менять код команд с HGSС и hgsc чтобы рейтиг кампаний зарабоатал. Так правильно будет?


И еще у меня вопрос что такое вот это
Код
#define HGS_ID    0xF1F3
#define HGS_MAX    10


И что оно делает? И если я это скопирую и переименую для камапании в

Код
#define HGSС_ID    0xF1F3
#define HGSС_MAX    10


Надо писать HGSС_ID 0xF1F3 или вместо 0xF1F3 надо будет что-то другое написать? И если другое то какое?
t800
Я сейчас скоприровал и переименовал все HGS в HGSС , а все hgs в hgsc и RatingSort в RatingSortСampain. Собрал игру при сборке не заругалалась. Теперь осталось понять как рейтинг компании надо считать.
t800
Сейчас сделал так в файлике gameover.cpp всместо

Цитата
res = Game::NEXTCAMPAIN;


Написал

Цитата
res = Game::HIGHSCORESCAMPAIN;


Собрал игру запустил. Выиграл одну карту из тестовой кампании и сразу попал в Рейтинг для кампании!



t800
Сейчас в highscores_game.cpp в


Код
int Game::HighScoresCampain(bool fill)
{
    Cursor & cursor = Cursor::Get();
    Display & display = Display::Get();
    const Settings & conf = Settings::Get();

    cursor.Hide();
    if(fill) display.Fill(ColorBlack);

#ifdef WITH_DEBUG
    if(IS_DEVEL() && world.CountDay())
    {
    std::string msg = std::string("Devepoper mode, not save! \n \n Your result: ") + GetString(GetGameOverScores());
    Dialog::Message("High Scores", msg, Font::BIG, Dialog::OK);
    return MAINMENU;
    }
#endif

    HGSCData hgsc;

    std::ostringstream stream;
    stream << System::ConcatePath(conf.GetSaveDir(), "fheroes2.hgsc");

    cursor.SetThemes(cursor.POINTER);
    Mixer::Pause();
    AGG::PlayMusic(MUS::MAINMENU);
    hgsc.Load(stream.str().c_str());

    const Sprite &back = AGG::GetICN(ICN::HSBKG, 0);

    cursor.Hide();
    const Point top((display.w() - back.w()) / 2, (display.h() - back.h()) / 2);

    hgsc.RedrawList(top.x, top.y);

    LocalEvent & le = LocalEvent::Get();

    Button buttonStandart(top.x + (conf.QVGA() ? 0 : 9), top.y + (conf.QVGA() ? 100 : 315), ICN::HISCORE, 2, 3);
    Button buttonExit(top.x + back.w() - (conf.QVGA() ? 27 : 36), top.y + (conf.QVGA() ? 100 : 315), ICN::HISCORE, 4, 5);

    buttonStandart.Draw();
    buttonExit.Draw();

    cursor.Show();
    display.Flip();

    const u32 rating = GetGameOverScores();
    const u32 days = world.CountDay();
    GameOver::Result & gameResult = GameOver::Result::Get();

    if(rating && (gameResult.GetResult() & GameOver::WINS))
    {
    std::string player(_("Unknown Hero"));
    Dialog::InputString(_("Your Name"), player);
    cursor.Hide();
    if(player.empty()) player = _("Unknown Hero");
    hgsc.ScoreRegistryC(player, Settings::Get().CurrentFileInfo().name, days, rating);
    hgsc.Save(stream.str().c_str());
    hgsc.RedrawList(top.x, top.y);
    buttonStandart.Draw();
    buttonExit.Draw();
    cursor.Show();
    display.Flip();
    gameResult.Reset();
    }

    // highscores loop
    while(le.HandleEvents())
    {
    // key code info
        if(Settings::Get().Debug() == 0x12 && le.KeyPress())
            Dialog::Message("Key Press:", GetString(le.KeyValue()), Font::SMALL, Dialog::OK);
    le.MousePressLeft(buttonStandart) ? buttonStandart.PressDraw() : buttonStandart.ReleaseDraw();
    le.MousePressLeft(buttonExit) ? buttonExit.PressDraw() : buttonExit.ReleaseDraw();

    if(le.MouseClickLeft(buttonStandart) || HotKeyCloseWindow) return HIGHSCORES;
    if(le.MouseClickLeft(buttonExit) || HotKeyCloseWindow) return MAINMENU;
    }

    return QUITGAME;
}


Поменял везде где было написано buttonCampain на buttonStandart и теперь у меня рейтинги переключаются!!! barb_metal.gif barb_metal.gif barb_metal.gif

t800
Никак не могу придумать как считать рейтинги для каманий.

В файле game_highscores.cpp в разделе int Game::HighScores


Код
int Game::HighScores(bool fill)
{
    Cursor & cursor = Cursor::Get();
    Display & display = Display::Get();
    const Settings & conf = Settings::Get();

    cursor.Hide();
    if(fill) display.Fill(ColorBlack);

#ifdef WITH_DEBUG
    if(IS_DEVEL() && world.CountDay())
    {
    std::string msg = std::string("Devepoper mode, not save! \n \n Your result: ") + GetString(GetGameOverScores());
    Dialog::Message("High Scores", msg, Font::BIG, Dialog::OK);
    return MAINMENU;
    }
#endif

    HGSData hgs;

    std::ostringstream stream;
    stream << System::ConcatePath(conf.GetSaveDir(), "fheroes2.hgs");

    cursor.SetThemes(cursor.POINTER);
    Mixer::Pause();
    AGG::PlayMusic(MUS::MAINMENU);
    hgs.Load(stream.str().c_str());

    const Sprite &back = AGG::GetICN(ICN::HSBKG, 0);

    cursor.Hide();
    const Point top((display.w() - back.w()) / 2, (display.h() - back.h()) / 2);

    hgs.RedrawList(top.x, top.y);

    LocalEvent & le = LocalEvent::Get();

    Button buttonCampain(top.x + (conf.QVGA() ? 0 : 9), top.y + (conf.QVGA() ? 100 : 315), ICN::HISCORE, 0, 1);
    Button buttonExit(top.x + back.w() - (conf.QVGA() ? 27 : 36), top.y + (conf.QVGA() ? 100 : 315), ICN::HISCORE, 4, 5);

    buttonCampain.Draw();
    buttonExit.Draw();

    cursor.Show();
    display.Flip();

    const u32 rating = GetGameOverScores();
    const u32 days = world.CountDay();
    GameOver::Result & gameResult = GameOver::Result::Get();

    std::cout  << days;
    std::cout  << " Дни \n";

    std::cout  << rating;
    std::cout  << " Рейтинг \n";

    
    if(rating && (gameResult.GetResult() & GameOver::WINS))
    {
    std::string player(_("Unknown Hero"));
    Dialog::InputString(_("Your Name"), player);
    cursor.Hide();
    if(player.empty()) player = _("Unknown Hero");
    hgs.ScoreRegistry(player, Settings::Get().CurrentFileInfo().name, days, rating);
    hgs.Save(stream.str().c_str());
    hgs.RedrawList(top.x, top.y);
    buttonCampain.Draw();
    buttonExit.Draw();
    cursor.Show();
    display.Flip();
    gameResult.Reset();
    }




Я нашел такие команды.

Цитата
const u32 rating = GetGameOverScores();
const u32 days = world.CountDay();



Я проверил что они делают оказываются он считаю рейтинг игры и число дней.

Код
    std::cout  << days;
    std::cout  << " Дни \n";

    std::cout  << rating;
std::cout  << " Рейтинг \n";


И подумал что можно наверно сделать так. Для каждой из кампаний сделать отдельный файлик куда игра будет записывать имя карты и число дней и рейтинг карты после выигрыша каржлдго из эпизодов. А потом если закончилась игра на последней карты. Их оттуда опять брать складывать все дни по всем картам и все рейтинг по всем картам и уже записывать с именем кампании в файл откуда она берет очки для все камапаний. Но я подумал а может можно это проще сделать? Без файликов?
t800
У меня каникулы до 12 ноября. Решил доделать рейтинги. Вчера узнал что в оригинальных героях количество дней сыгранных за предыдущий эпизод кампании сохраняется в сейвах в Campaign.Days Посмотеле в исходниках fheroes2 там конечно такого нет потому, что автор вообще кампанией не занимался. Все что он сделал касающегося кампании это сделал TYPE_CAMPAIGN вот он в game.h прописан котрый действительно сохраняется в сейвах

Код
void Init(void);

    const std::string & GetLastSavename(void);
    void        SetLastSavename(const std::string &);
    void        SetLoadVersion(int);
    int            GetLoadVersion(void);

    // type_t
    enum { TYPE_MENU = 0, TYPE_STANDARD = 0x01, TYPE_CAMPAIGN = 0x02, TYPE_HOTSEAT = 0x04, TYPE_NETWORK = 0x08, TYPE_BATTLEONLY = 0x10, TYPE_LOADFILE = 0x80, TYPE_MULTI = TYPE_HOTSEAT | TYPE_NETWORK };
    // distance_t
    enum { VIEW_TOWN  = 0, VIEW_CASTLE = 1, VIEW_HEROES = 2, VIEW_TELESCOPE = 3, VIEW_OBSERVATION_TOWER = 4, VIEW_MAGI_EYES = 5, VIEW_LIGHT_HOUSE = 6 };

    enum
    {
    EVENT_NONE,
    EVENT_BUTTON_NEWGAME,
    EVENT_BUTTON_LOADGAME,
    EVENT_BUTTON_HIGHSCORES,
    EVENT_BUTTON_CREDITS,
    EVENT_BUTTON_STANDARD,
    EVENT_BUTTON_CAMPAIN,
    EVENT_BUTTON_MULTI,
    EVENT_BUTTON_SETTINGS,
    EVENT_BUTTON_SELECT,
    EVENT_BUTTON_HOTSEAT,
    EVENT_BUTTON_NETWORK,
    EVENT_BUTTON_HOST,
    EVENT_BUTTON_GUEST,
    EVENT_BUTTON_BATTLEONLY,
    EVENT_DEFAULT_READY,
    EVENT_DEFAULT_EXIT,
    EVENT_DEFAULT_LEFT,
    EVENT_DEFAULT_RIGHT,
    EVENT_SYSTEM_FULLSCREEN,
    EVENT_SYSTEM_SCREENSHOT,
    EVENT_SYSTEM_DEBUG1,
    EVENT_SYSTEM_DEBUG2,
    EVENT_SLEEPHERO,
    EVENT_ENDTURN,
    EVENT_NEXTHERO,
    EVENT_NEXTTOWN,
    EVENT_CONTINUE,
    EVENT_SAVEGAME,
    EVENT_LOADGAME,
    EVENT_FILEOPTIONS,
    EVENT_PUZZLEMAPS,
    EVENT_INFOGAME,
    EVENT_DIGARTIFACT,
    EVENT_CASTSPELL,
    EVENT_DEFAULTACTION,
    EVENT_OPENFOCUS,
    EVENT_SYSTEMOPTIONS,
    EVENT_BATTLE_CASTSPELL,
    EVENT_BATTLE_RETREAT,
    EVENT_BATTLE_SURRENDER,
    EVENT_BATTLE_AUTOSWITCH,
    EVENT_BATTLE_OPTIONS,
    EVENT_BATTLE_HARDSKIP,
    EVENT_BATTLE_SOFTSKIP,
    EVENT_MOVELEFT,
    EVENT_MOVERIGHT,
    EVENT_MOVETOP,
    EVENT_MOVEBOTTOM,
    EVENT_MOVETOPLEFT,
    EVENT_MOVETOPRIGHT,
    EVENT_MOVEBOTTOMLEFT,
    EVENT_MOVEBOTTOMRIGHT,
    EVENT_SCROLLLEFT,
    EVENT_SCROLLRIGHT,
    EVENT_SCROLLUP,
    EVENT_SCROLLDOWN,
    EVENT_CTRLPANEL,
    EVENT_SHOWRADAR,
    EVENT_SHOWBUTTONS,
    EVENT_SHOWSTATUS,
    EVENT_SHOWICONS,
    EVENT_SWITCHGROUP,
    EVENT_EMULATETOGGLE,
    EVENT_LAST
    };


У меня вопрос а как мне создать Campaign.Days и чтобы они сохранялись в сейвах и складывались при смене эпизода?
t800
Решил делать рейтинги как в оригинальных героях чтобы игра сама сохраняла общие дни кампании в сейвах

Для этого открыл файл settings.cpp нашел там строчик с GameType
скоприровал их тут же ниже и везде где было GameType написал CampainDays
И сделал вот так:

Код
/* check game type */
bool Settings::(int f) const { return game_type & f; }
int Settings::GameType(void) const { return game_type; }

/* set game type */
void Settings::SetGameType(int type) { game_type = type; }

/*  T-800 */
bool Settings::(int f) const { return campain_days & f; }
int Settings::CampainDays(void) const { return campain_days; }

void Settings::SetCampainDays(int days) { campain_days = days; }
/* T-800 */


Запустил проект на сборку он заругался что CampainDays и SetCampainDays не отписаны в Settings тогда
я отрыл файл settings.h нашел где стоят строчки с GameType скопировал ниже и поменял на CampainDays

Код
    bool        GameType(int) const;
    int        GameType(void) const;
    void        SetGameType(int);
    /* T-800 */
    bool        CampainDays(int) const;
    int        CampainDays(void) const;
    void        SetCampainDays(int);
    /* T-800 */


После чего стал искать в каких еще файлах встречается GameType и нашел
в файле game_io.cpp

Код
bool Game::Load(const std::string & fn)
{
    DEBUG(DBG_GAME, DBG_INFO, fn);
    Settings & conf = Settings::Get();
    // loading info
    Game::ShowLoadMapsText();

    StreamFile fs;
    fs.setbigendian(true);

    if(! fs.open(fn, "rb"))
    {
    DEBUG(DBG_GAME, DBG_INFO, fn << ", error open");
    return false;
    }

    char major, minor;
    fs >> major >> minor;
    const u16 savid = (static_cast<u16>(major) << 8) | static_cast<u16>(minor);

    // check version sav file
    if(savid != SAV2ID2 && savid != SAV2ID3)
    {
    DEBUG(DBG_GAME, DBG_INFO, fn << ", incorrect SAV2ID");
    return false;
    }

    std::string strver;
    u16 binver = 0;
    HeaderSAV header;

#ifdef FORMAT_VERSION_3225
    if(savid == SAV2ID2)
    {
    // skip 4 byte
    u32 unused;
    fs >> unused;
    }
#endif

    // read raw info
    fs >> strver >> binver >> header;
    size_t offset = fs.tell();
    fs.close();

#ifndef WITH_ZLIB
    if(header.status & HeaderSAV::IS_COMPRESS)
    {
    DEBUG(DBG_GAME, DBG_INFO, fn << ", zlib: unsupported");
    return false;
    }
#endif

    ZStreamFile fz;
    fz.setbigendian(true);

    if(! fz.read(fn, offset))
    {
    DEBUG(DBG_GAME, DBG_INFO, ", uncompress: error");
    return false;
    }

    if((header.status & HeaderSAV::IS_LOYALTY) &&
    !conf.PriceLoyaltyVersion())
    Dialog::Message("Warning", _("This file is saved in the \"Price Loyalty\" version.\nSome items may be unavailable."), Font::BIG, Dialog::OK);

    //SaveMemToFile(std::vector<u8>(fz.data(), fz.data() + fz.size()), "gdata.bin");
    fz >> binver;

    // check version: false
    if(binver > CURRENT_FORMAT_VERSION || binver < LAST_FORMAT_VERSION)
    {
    std::ostringstream os;
    os << "usupported save format: " << binver << std::endl <<
         "game version: " << CURRENT_FORMAT_VERSION << std::endl <<
         "last version: " << LAST_FORMAT_VERSION;
    Dialog::Message("Error", os.str(), Font::BIG, Dialog::OK);
    return false;
    }

    DEBUG(DBG_GAME, DBG_TRACE, "load version: " << binver);
    SetLoadVersion(binver);
    u16 end_check = 0;

    fz >> World::Get() >> Settings::Get() >>
    GameOver::Result::Get() >> GameStatic::Data::Get() >> MonsterStaticData::Get() >> end_check;

    World::Get().PostFixLoad();

    if(fz.fail() || (end_check != SAV2ID2 && end_check != SAV2ID3))
    {
    DEBUG(DBG_GAME, DBG_WARN, "invalid load file: " << fn);
    return false;
    }

    SetLoadVersion(CURRENT_FORMAT_VERSION);

    Game::SetLastSavename(fn);
    conf.SetGameType(conf.GameType() | Game::TYPE_LOADFILE);
/* T-800*/

              conf.SetCampainDays(conf.CampainDay());
//           conf.SetCampainDays(200);
    std::cout  << conf.CampainDays();
    std::cout  << "Дни кампании при сохранении игры \n";
    std::cout  << Settings::Get().CampainDays();
    std::cout  << "Дни кампании при старте кампании \n";    
/* T-800*/
    
    return true;
}


Скопировал строчки с GameType ниже и поменял в них GameType на CampainDays и потом сделал вывод в терминал чтобы посмотреть что они выводят.

Код
/* T-800*/
        conf.SetCampainDays(conf.CampainDay());        
       // conf.SetCampainDays(200);
    std::cout  << conf.CampainDays();
    std::cout  << "Дни кампании при сохранении игры \n";
    std::cout  << Settings::Get().CampainDays();
    std::cout  << "Дни кампании при старте кампании \n";    
/* T-800*/


Сперва они выводили нули и было не понятно что это значит. Но тогда я решил попробовать
и в файл game_newgame.cpp

Код
int Game::NewCampain(void)
{
  // Settings::Get().SetGameType(Game::TYPE_CAMPAIGN);
  // Settings & conf = Settings::Get();
  // conf.SetGameType(Game::TYPE_CAMPAIGN);
  // VERBOSE("New Campain Game: under construction.");
  // return Game::NEWCAMPAIN;
  // Загрузка карты компании  
    Cursor & cursor = Cursor::Get();
    cursor.Hide();
    cursor.SetThemes(cursor.POINTER);

    Display & display = Display::Get();
    display.Fill(ColorBlack);

    // image background
    const Sprite &back = AGG::GetICN(ICN::HEROES, 0);
    const Point top((display.w() - back.w()) / 2, (display.h() - back.h()) / 2);
    back.Blit(top);

    cursor.Show();
    display.Flip();

    //std::string file = Dialog::SelectFileLoad();
    std::string file = Dialog::SelectFileCampainLoad();
    //std::string file = "files/campain/test.sav";
    Settings::Get().SetCampainDays(100);
    if(file.empty() || !Game::Load(file)) return MAINMENU;
    //Settings::Get().SetGameType(Game::TYPE_CAMPAIGN);
    //Settings::Get().SetCampainDays(500);
    std::cout  << Settings::Get().CampainDays();
    return STARTGAME;

}


Вставил строчку

Код
Settings::Get().SetCampainDays(100);


И тогда в терминале мнестали выдаваться 100 дней которые я прописал при старте кампании.Но одна проблема! Эти 100 дней почему то не сохраняются при сохранении игры, т.е. если я сохраню игру выйду и загружу из автосейва. То CampainDays будет 0 а не 100. Что делать?
t800
Фух! Наконец то закончил с Кампаниями для Free Heroes вроде все работает!



Если кто хочет можете протестировать и написать в этой теме (или в T-800 Мod ) что вы думаете о кампаниях и удачно ли это вышло.

Вот ссылка для скачивания на новый движок с настроеными кампаниями (T-800 и две оригинальные из Heroes2 за Роланда и Арчибальда) В архиве исходники и уже собранная игра под Ubuntu

http://wiki.kvkozyrev.org/fheroes/fheroes2_cam_v1.zip

(Примечание: Для запуска игры необходимы файлы heroes2.agg и heroes2x.agg из оригинальных Heroes2 - их надо положить в папку Data )

Насколько я понимаю также игру можно собрать под Windows и Андроид потому, что за основу я брал оригинальные исходники про которые было написано, что они собраются под Linux, Windows и Андроид
t800
Собрал fheroes2 c поддержкой кампаний под Windows у меня в Virtualbox на XP вроде работает.



Вот ссылка для скачивания http://wiki.kvkozyrev.org/fheroes/fheroes2cam-win32.zip

В архиве собранная игра под Windows с настроенными кампаниями (T-800 и две оригинальные из Heroes2 за Роланда и Арчибальда)

(Примечание: Для запуска игры необходимы файлы heroes2.agg и heroes2x.agg из оригинальных Heroes2 - их надо положить в папку Data)
t800
Собрал fheroes с поддержкой кампании для Андроид ( ставить можно на планшет или телефон)



Скачать инсталятор fheroes2 c поддержкой кампания под Андроид можно здесь

http://wiki.kvkozyrev.org/fheroes/fheroes2-campain-v1.apk

(Примечание: Инсталятор сам закачивает необходимые файлы heroes2.agg)
t800
Изменил меню в версии для Андроида для режима работы на телефонах. Теперь на телефоне пункт меню Кампаний присутствует. И компании работают и на телефоне.




Ссылка на инсталятор для игры на телефоне

http://wiki.kvkozyrev.org/fheroes/fheroes2-campain-v1.apk
hippocamus
Респект! Только - пожалуйста - "инсталятор".
Откуда неверное прочтение - непонятно, ведь даже на буржуйском - "installator".
t800
Цитата(hippocamus @ 04 Jul 2016, 01:33) *
Респект! Только - пожалуйста - "инсталятор".
Откуда неверное прочтение - непонятно, ведь даже на буржуйском - "installator".


Исправил.
tolich
Цитата(hippocamus @ 03 Jul 2016, 22:33) *
даже на буржуйском - "installator".
Во-первых, installer, во-вторых, a перед ll традиционно читается, как о.
t800
Хочу попробовтать добавить свою сборку fheroes2 T-800 mod под Андроид на Goole Play чтобы все могли
играть в кампании.

А то народ каждый качает старую сборку и ругается что там ничего не работает и нет кампаний.

https://play.google.com/store/people/detail...70255&hl=ru

А про новую ничего не знают. Кто-нибудь знает как добавить свою сборку в Google Play?

Просто я написал Gerhard Stein неделю и ссылку на свои исходники тоже выслал но он ничего не до сих пор не выложил.
Сейчас думаю наверно проще самому добавить чем ждать пока он выложит мою модификацию.
t800
Добавил версию для Андроид на Google Play

https://play.google.com/store/apps/details?...rg.fheroes2t800


fireman
t800, привет. Посмотрел, что ты сделал кампании. Молодец - это важная часть.

На счёт своих сборок freeheroes 2: я не нашёл в сборке под win исходных кодов или явной ссылки на них. Лицензия GPL2(по которой лицензируется freeheroes2) обязывает выкладывать их или предоставлять по запросу. Для большего удобства вас и других разработчиков - лучше взять за правило выкладывать вместе со сборками исходные коды к ней.

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

t800
Цитата(fireman @ 27 Aug 2016, 05:44) *
t800, привет. Посмотрел, что ты сделал кампании. Молодец - это важная часть.

На счёт своих сборок freeheroes 2: я не нашёл в сборке под win исходных кодов или явной ссылки на них. Лицензия GPL2(по которой лицензируется freeheroes2) обязывает выкладывать их или предоставлять по запросу. Для большего удобства вас и других разработчиков - лучше взять за правило выкладывать вместе со сборками исходные коды к ней.

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


Привет у сборок под Linux/Windows/Android одни и те же исходники (они кроссплатформенные) ссылка на исходники дана здесь в этой теме и на Google Play вот она эта ссылка http://wiki.kvkozyrev.org/forum/viewtopic....4&t=88#p473 Если тебе нужны исходники можешь по ссылке их скачать yes2.gif
fireman
Вот описание из гугл плэя
Код
Бесплатная реализация игры Герои Меча и Магии II с поддержкой Кампаний.

Free Heroes 2 (T-800 Mod) - это модифицированная версия движка с открытым кодом fheroes2. Основное в данной модификации - это долгожданная поддержка кампаний. В игре есть поддержка 2х оригинальных кампании (за Роланда и Арчибальда) а так же новая кампания T-800.

Установка игры: Поскольку Free Heroes2 (T-800 Mod) - это open source реализация игры Герои Меча и Магии II , то вам потребуются файлы c данными из оригинальной игры.

Которые вы можете загрузить вместе с DEMO версией Heroes2 из Меню Установки.

Если у вас есть Полная версия игры Heroes2 для PC (Dos или Windows версии) просто скопируйте файлы из оригинальной игры на SD карту в каталог app-data/wiki.kvkozyrev.org.fheroes2t800/

Инструкция по установке РУССКОЙ версии игры

https://www.youtube.com/watch?v=1EeDQO3UE_M

Если будут какие то вопросы по установке или настройке игры - обращайтесь! Всегда с удовольствием помогу.


Не вижу тут http://wiki.kvkozyrev.org/forum/viewtopic....4&t=88#p473
t800
Цитата(fireman @ 27 Aug 2016, 15:39) *
Вот описание из гугл плэя
Код
Бесплатная реализация игры Герои Меча и Магии II с поддержкой Кампаний.

Free Heroes 2 (T-800 Mod) - это модифицированная версия движка с открытым кодом fheroes2. Основное в данной модификации - это долгожданная поддержка кампаний. В игре есть поддержка 2х оригинальных кампании (за Роланда и Арчибальда) а так же новая кампания T-800.

Установка игры: Поскольку Free Heroes2 (T-800 Mod) - это open source реализация игры Герои Меча и Магии II , то вам потребуются файлы c данными из оригинальной игры.

Которые вы можете загрузить вместе с DEMO версией Heroes2 из Меню Установки.

Если у вас есть Полная версия игры Heroes2 для PC (Dos или Windows версии) просто скопируйте файлы из оригинальной игры на SD карту в каталог app-data/wiki.kvkozyrev.org.fheroes2t800/

Инструкция по установке РУССКОЙ версии игры

https://www.youtube.com/watch?v=1EeDQO3UE_M

Если будут какие то вопросы по установке или настройке игры - обращайтесь! Всегда с удовольствием помогу.


Не вижу тут http://wiki.kvkozyrev.org/forum/viewtopic....4&t=88#p473


Вы не там смотрите, смотри по ссылке на сайт разработчика (она не в описании а внизу страницы игры)

PS И еще там на странице в Google Play моя почта указана. Если кто не разберется как пройти по ссылке внизу страницы чтобы скачать исходники. Всегда может написать мне запрос и получить ее от меня на почту.

PPS Или написать запрос в комментариях к игре.

PPPS Так же в самой игре в разделе "Авторы" есть ссылка на мой сайт где можно скачать исходники, а так же указан мой е-mail чтобы можно было сделать запрос чтобы спросить как можно скачать исходники, если человек не разберется как качать по ссылке.

Исходники находятся в отрытом доступе. Любой кто захочет тот всегда может их скачать brags.gif
fireman
t800, это требует от людей совершить много усилий, это не прямая ссылка на сборке к исходникам. Всё же хороший тон - это явно указывать местоположение кода при выкладывание сборки.
t800
Цитата(fireman @ 28 Aug 2016, 06:11) *
t800, это требует от людей совершить много усилий, это не прямая ссылка на сборке к исходникам. Всё же хороший тон - это явно указывать местоположение кода при выкладывание сборки.



Указывать прямую ссылку на архив без указания ссылки на тему по разработке смысла не вижу и считаю что если кто хочет скачать мои исходники чтобы собрать из них игру то ему надо обязательно прочитать, что написано про разработку. Вот.
tolich
Забавно, в поставке Google Play есть 2 моих карты (а именно Hopeless Battle и Doom Forever), которые в принципе не работают, как задумано, под FreeHeroes2 (потому что начальные армии должны быть заданы и события не обрабатываюся). А вот более устойчивая Knights of 40 Isles не попала.
t800
Цитата(tolich @ 30 Aug 2016, 11:11) *
Забавно, в поставке Google Play есть 2 моих карты (а именно Hopeless Battle и Doom Forever), которые в принципе не работают, как задумано, под FreeHeroes2 (потому что начальные армии должны быть заданы и события не обрабатываюся). А вот более устойчивая Knights of 40 Isles не попала.


На самом деле в поставке Google Play карт нет. Карты скачиваются как дополнения и в три пака можно закачать
почти все карты что есть для HMM2. И эти паки чистить надо от карты которые несовместимы. Там проблема даже не в том что какие то карты играют не правильно а в том, что с DEMO данными на которых почти все играют карты которые требуют heroes2x.agg просто вылетают причем не сразу а когда идет обращеник к какому-будь спрайту которого в heroe2.agg нет и по хорошему в движке надо дописать условие что в случае отсутвия файла heroes2x.agg чтобы MX2 карты в списке доступных не отражались, но это только в следующем выпуске на Google Play будет когда Кампанию Король Осминогов доделаю.
tolich
Они и не отображаются, оказывается. Хотя входят. И Avalon, и Knights40. То есть в менеджере файлов они есть, а в Новой Игре не отображаются.
fireman
Интересно, на сколько реально к freeheroes подрубить нейронку чтобы обучить АИ.
t800
Цитата(fireman @ 16 May 2017, 09:29) *
Интересно, на сколько реально к freeheroes подрубить нейронку чтобы обучить АИ.



А что такое нейронка?
t800
ЗЫ Сейчас попгулил про нейронки. Как понял это как feanor тени как в двойке подбирал.

Ну не знаю ИМХО глупости AI во fheroes2 не в том что его обучить трудно, а потому что он специально был сделан таким глупым.
Там в коде IA даже компьтерные герои делатcя на три вида: скутер, хунтер, тормоз и тупица

И так они и называется в коде:

Код
hero.Modes(AI::HEROES_SCOUTER)
hero.Modes(AI::HEROES_HUNTER)
hero.Modes(AI::HEROES_WAITING)
hero.Modes(AI::HEROES_STUPID)


Чтобы сделать AI умней ИМХО его просто надо переделать потому что сейчас копьютер умеет только либо идти вперед по дороге и собирать ресурсы как скутер,
бить монстров или игрока когда его войска во много раз слабее как хунтер, стоять на месте как тормоз, или бессмысленно ходить туда сюда как тупица.

ЗЫ И кстати не смотря на это куча людей не могут у него выиграть ne.gif
feanor
Цитата
Интересно, на сколько реально к freeheroes подрубить нейронку чтобы обучить АИ.
Чуть сложнее, чем сообразить, что нейронки вообще-то не об этом wink.gif
fireman
feanor, то есть то, что нейронки уже в шахматы и го обыгрывают человека, а в старкрафт способны играть на уровне опытных игроков - не об этом?

t800, да какая разница как сейчас, можно же запилить иначе. Если интересно с помощью чего, то вроде эта штука заточена под АИ с помощью нейронок.
t800
Цитата(fireman @ 17 May 2017, 21:32) *
t800, да какая разница как сейчас, можно же запилить иначе. Если интересно с помощью чего, то вроде эта штука заточена под АИ с помощью нейронок.



Я посмотрел через Google Переводчик по вашей ссылке помоему это какой эмулятор спортзала который считает как надо толкать тележки и совершать прыжки


Цитата
OpenAI Gym - инструментарий для разработки и сравнения алгоритмов обучения подкрепления. Он не делает предположений о структуре вашего агента и совместим с любой вычислительной вычислительной библиотекой, такой как TensorFlow или Theano. Вы можете использовать его из кода Python и вскоре из других языков.

OpenAI Gym состоит из двух частей:

  1. Библиотека с открытым исходным кодом спортзала : набор тестовых задач - среды - которые вы можете использовать для разработки алгоритмов обучения подкрепления. Эти среды имеют общий интерфейс, позволяющий вам писать общие алгоритмы.
  2. Служба OpenAI Gym : сайт и API, позволяющие людям эффективно сравнивать эффективность своих обученных агентов.

Основная цель спортзала - предоставить большую коллекцию сред, которые предоставляют общий интерфейс, и имеют версии, позволяющие проводить сравнения. Например, EnvSpec(Hopper-v1) определяет среду, в которой целью является получение 2D-моделируемого робота для прыжка.


А про AI вот fheroes2, ИМХО чтобы кого-нибудь обучать, надо чтобы он мог обучаться, а AI во fheroes2 - это очень простой бот который только делает вид что он AI используя для этого 4 функции.

1) Идти по дороге и собирать ресурсы.
2) Нападать на монстров и героев в случае если его армия в несколько раз больше армии на которую нападает.
3) Стоять на месте
4) Бесмысленно бегать туда-сюда.

И вся работа AI сейчас состоит в переключениях между этими 4 функциями,
feanor
Цитата
feanor, то есть то, что нейронки уже в шахматы и го обыгрывают человека, а в старкрафт способны играть на уровне опытных игроков - не об этом?

Вася Пупкин сделал гигантскую статую слона из бутылок. Она заметно менее эстетична и функциональна, чем обычный памятник, но зато она сделана из бутылок, причем как раз модного в этом сезоне цвета!
Давайте без заголовков на уровне 10 журналистов из 10.

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

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

Короче, ИНС, естественно, хорошо работают там, где они хорошо работают: сопоставление с образцом, аппроксимация-экстраполяция, все такое. На гомогенных, естественно, данных.
А вот для искусственных интеллектов в игровом плане заметно лучше все-таки дрочить старые добрые алгоритмы из ведомства дискретной математики, поиск в графе стратегий etc. В конце концов, одно семейство нейросетей на аж многие миллиарды нейронов все еще пытается строить капитолий на первой неделе, что явно символизирует.
fireman
feanor
1) Но обучена всего за 72 часа. Зачем, может быть понятно в этой статье
Цитата
Having observed the playing style of DeepChess, we note that it plays very aggressively, often sacrificing pieces for long term positional gains (i.e., non-tactical gains).
This playing style resembles very much the playing style of human grandmasters.
While computer chess programs have long been criticized for being materialistic,
DeepChess demonstrates the very opposite by exhibiting an adventurous playing style with frequent positional sacrifices.

3) А разве не круто, что сама? Разве это не упрощает задачу по созданию АИ, если нейронка сама научится играть без какого либо обучения?
2) То есть проблема в том, что в паблике мало софта чтобы прямо сейчас сделать быстро и круто из-за закрытости технологий? Возможно эта проблема быстро решится и появится какое-то публичное АПИ к крутым нейросетям.

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

P.S. На сколько понимаю, ответ на мой вопрос, что на момент 2017 года малореально при ресурсах ,что есть у сообщества.
t800
Цитата(fireman @ 18 May 2017, 12:20) *
3) А разве не круто, что сама? Разве это не упрощает задачу по созданию АИ, если нейронка сама научится играть без какого либо обучения?


ИМХО сделать AI который нормально играл бы в fheroes2 проще - для этого достаточно посмотреть воостановленный код оригинальных героев и сделать что-то похожее, чем сделать AI на нейросети которая бы обучалась играть в fheroes2, потому что как это делать вообще не понятно и исходники которые про спортзал и про то как надо прыгать или толкать тележку ИМХО мало похожи на AI который мог бы играть в героев.
Nestor
Цитата
1) Но обучена всего за 72 часа. Зачем, может быть понятно в этой статье

Продолжительность обучения не фактор. Недопеченная ИНС будет, очевидно, принимать неоптимальные решения - но ровно также будет и сеть, которую перепекли. 100% успешных решений для выборки обучения при 50% для тестовой выборки - вполне реальная беда.
Цитата
2) То есть проблема в том, что в паблике мало софта чтобы прямо сейчас сделать быстро и круто из-за закрытости технологий? Возможно эта проблема быстро решится и появится какое-то публичное АПИ к крутым нейросетям.

Нет. Уже сейчас существует огромное количество энтузиастов, которые прикладывают ИНС к самым разным задачам. Ничего трансцендентного и недоступного в этой области нет. Вопрос лишь в том, нужно ли это (спойлер, в данной конкретной ситуации не нужно) и сколько нужно будет убить времени и сил для получения даже относительно среднего результата. Сфера применения у этого микроскопа лежит отнюдь не в забивании гвоздей.
Цитата
3) А разве не круто, что сама? Разве это не упрощает задачу по созданию АИ, если нейронка сама научится играть без какого либо обучения?

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

Наконец, замечу, что от ИИ в компьютерных играх при их обычном применении никогда не требуется обыграть человека: "правильный ИИ должен не выигрывать, а красиво отдаваться". См. сюда же сказку Петра Бормора о разумных неписях.
feanor
Цитата
1) Но обучена всего за 72 часа.

Это не является потребительской ценностью. (Обращу так ж внимание, что 72 часа - не полное время разработки, а лишь время обучения).

Цитата
Зачем, может быть понятно в этой статье
Мы ждали киберпанка, а нас обуяли киберхипстеры. Души у них в традиционных шахматных ботах нет, ишь ты.

Цитата
3) А разве не круто, что сама? Разве это не упрощает задачу по созданию АИ, если нейронка сама научится играть без какого либо обучения?
Сама или не сама - опять же не является потребительской ценностью. Важно, что играет она паршивенько, а допилить её напильником нельзя.


Цитата
2) То есть проблема в том, что в паблике мало софта чтобы прямо сейчас сделать быстро и круто из-за закрытости технологий? Возможно эта проблема быстро решится и появится какое-то публичное АПИ к крутым нейросетям.

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

Цитата
P.S. На сколько понимаю, ответ на мой вопрос, что на момент 2017 года малореально при ресурсах ,что есть у сообщества.

Нет, малореально, но по ряду других причин, среди которых первая: ИНС, блджад, не для этого.
Axolotl
Заранее извиняюсь если скажу глупость. А нельзя совмещать? Не в контексте Героев, а вообще нейросетей и ИИ. Возможно, в реалтайме.
Т.е. основа ИИ если будет алгоритмической, но некоторые его модули, в которых как раз нужен переколбас кучи не очевидных данных, будут или обучены с помощью нейросетей, или на ходу обрабатывать какие-то данные и на основе результата, опять же, уже будет действовать алгоритм. Ну и да, возможно и затем, чтобы подстраиваться к конкретным игрокам/тактикам и исходя из действий противника выбирать, скажем, какой-то из шаблонов поведения.
tolich
У нея внутре нейронка.©
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.