|
Polski Portal COLOBOTa COLOBOT Polish Portal |
 |
Programy - BotCreator
Simbax - 30-07-2010, 19:52 Temat postu: BotCreator Co robi program?
Zastępuje gracza w procesie tworzenia robota. Potrafi przetopić rudę, dać robotowi baterię i cierpliwie czekać na stworzenie robota Nie jest on przystosowany do transporterów latających, ale ten typ w ogóle się moim zdaniem do tej roboty nie nadaje
+ Sam wytwarza tytan jeśli go nie znalazł
+ Sam wytwarza baterie jeśli jej nie znalazł
+ W kulturalny sposób informuje o niepowodzeniu
+ Możesz w tym czasie robić coś innego np. dajmy na to, pozwiedzać okolicę
- Może mieć problem z dojściem do fabryki (wyświetli błąd, że miejsce docelowe niedostępne), nie wiem od czego to zależy (to pewnie wina instrukcji goto albo radar)
- Nie zrobi za nas wszystkiego... poprosi nas o rozpoczęcie produkcji robota, ale to kwestia dwóch kliknięć...
- Nowym robotem musimy sami wyjechać
EDIT: Robot już potrafi wytwarzać baterie, ale testowałem tylko na ogniwach atomowych. Znalazłem też parę błędów, więc poprawiłem nieco program.
Kod źródłowy:
Kod: | // funckje ----------------------------------------------------------------
int object::Przetop()
{
object item, item2;
// sprawdzanie czy mozliwe jest wykonanie funkcji
// -----------------------------------------------
item = radar(TitaniumOre); // znajdz rude
item2 = radar(Converter); // znajdz hute
if (item == null || item2 == null) // jesli nie ma rudy LUB huty wyswietl blad i przerwij program
{
message("Nie mozna wytworzyc kostki tytanu.", DisplayError);
return 1;
}
// ------------------------------------------------
// jesli warunki zostaly spelnione wykonaj
message("Wytwarzam kostkę tytanu.", DisplayInfo);
item = radar(TitaniumOre);
goto(item.position);
grab(); // znajdz i podnies rude tytanu
item = radar(Converter);
goto(item.position);
drop();
move(-2.5);
wait(15);
move(2.5);
grab(); // wytworz :P
}
int object::Power()
{
object item, item2;
item = radar(NuclearCell);
if (item == null) // Czy istnieje atomowe ogniwo?
{
// Sprawdzanie czy mozliwe jest stworzenie ogniwa atomowego
item = radar(UraniumOre);
item2 = radar(NuclearPlant);
if (item == null || item2 == null)
{
message("Nie mozna wytworzyc ogniwa atomowego.", DisplayError);
}
// ----------------------------------
else // jesli tak
{
item = radar(UraniumOre);
goto(item.position);
grab();
item = radar(NuclearPlant);
goto(item.position);
drop();
move(-3);
wait(32);
move(3);
grab(); //wytworz
return 0;
}
}
else // jesli istnieje ogniwo
{
goto(item.position);
grab();
return 0;
}
item = radar(PowerCell);
if (item == null) // czy istnieje zwykle ogniwo?
{
// sprawdzanie czy mozliwe jest stworzenie zwyklego ogniwa
item = radar(PowerPlant);
item2 = radar(Titanium);
if (item == null)
{
message("Nie mozna wytworzyc ogniwa elektrycznego.", DisplayError);
return 1;
}
if (item2 == null)
{
if (Przetop() == 1)
{
message("Nie mozna wytworzyc ogniwa elektrycznego.", DisplayError);
return 1;
}
}
// ---------------------------------------
else
{
goto(item2.position);
grab();
}
goto(item.position);
drop();
move(-3);
wait(14);
move(3);
grab();
}
else
{
goto(item.position);
grab();
}
}
// ----------------------------------------------------
extern void object::BotCreator()
{
object item; // zmienna pomocnicza
int robot[21]; // <-- robot ktory ma zostac stworzony
robot[0] = WheeledGrabber; //Transporter na kołach
robot[1] = TrackedGrabber; //Transporter na gąsienicach
robot[2] = WingedGrabber; //Transporter latający
robot[3] = LeggedGrabber; //Transporter na nogach
robot[4] = WheeledSniffer; //Szperacz na kołach
robot[5] = TrackedSniffer; //Szperacz na gąsienicach
robot[6] = WingedSniffer; //Szperacz latający
robot[7] = LeggedSniffer; //Szperacz na nogach
robot[8] = WheeledShooter; //Działo na kołach
robot[9] = TrackedShooter; //Działo na gąsienicach
robot[10] = WingedShooter; //Działo latające
robot[11] = LeggedShooter; //Działo na nogach
robot[12] = WheeledOrgaShooter; //Działo organiczne na kołach
robot[13] = TrackedOrgaShooter; //Działo organiczne na gąsienicach
robot[14] = WingedOrgaShooter; //Latające działo organiczne
robot[15] = LeggedOrgaShooter; //Działo organiczne na nogach
robot[16] = Subber; //Robot nurek
robot[17] = Recycler; //Robot recykler
robot[18] = Shielder; //Robot osłaniacz
robot[19] = Thumper; //Robot uderzacz
robot[20] = PhazerShooter; //Działo fazowe
item = radar(Titanium); // znajdz tytan
if (item == null) // jesli nie znaleziono, zrob go
{
message("Nie znaleziono tytanu", DisplayWarning);
if (Przetop() == 1) return;
}
// znaleziono
else
{
item = radar(Titanium);
goto(item.position);
grab();
// podnies tytan
}
item = radar(BotFactory);
goto(item.position);
drop();
move(-3); // znajdz fabryke i zostaw tytan, nastepnie cofnij sie
message("Prosze rozpoczac produkcje robota", DisplayWarning); // prosba o rozpoczecie produkcji
if (Power() == 1) return; // tym czasem robot "idzie" po zrodlo energii
goto(item.position);
move(-3);
message("Przynioslem ogniwo.", DisplayWarning); // informacja
while (true)
{
item = radar(robot,0,90,0,8); // szukaj robota (kategoria w zmiennej robot)
if (item == null) // jesli nie ma, powiadom, ze czekasz ;) i czekaj chwile, jesli nadal nie ma, to znowu powiadom itd.
{
message("Czekam na robota.", DisplayWarning);
wait(5);
}
else // jesli jest wloz mu baterie i pozwol wyjechac
{
move(3);
drop();
move(-10);
break;
}
}
message("Robot zostal stworzony!", DisplayInfo); // powiadomienie o powodzeniu :)
} |
A, i proszę się nie czepiać, jestem kompletnym nowicjuszem ;P Ciekawe, komu się to przyda...
Berserker - 31-07-2010, 03:45
Idz i podnies zrodlo ftw.
Po cholere robot ma szukac wolne miejsce i tam polozyc tytan, skoro zaraz go podniesie? Strata czasu.
Simbax - 31-07-2010, 11:25
Chodzi o źródło energii... baterię, jak wolisz
Fakt, już poprawiam...
Emxx52 - 05-08-2010, 20:06
Fajny program.
Możesz dodać jeszcze komendę Kod: | produce(space(), orientation, TitaniumOre, ""); | jeżeli nie będzie żadnej rudy tytanu.
(trochę możesz oszukać)
Korniszon - 09-10-2010, 11:54
Emxx52 napisał/a: | produce(space(),orientation,TitaniumOre,""); |
Emxx52, ten program polega na nie oszukiwaniu, a nie przeciwnie.
Emxx52 - 09-10-2010, 14:28
Korniszon napisał/a: | Emxx52, ten program polega nie oszukiwaniu, a nie przeciwnie. |
Dobra, ale ułóż to zdanie bardziej po naszemu
Korniszon - 10-10-2010, 08:43
@up: Poprawiłem
Simbax napisał/a: | int object::Power()
{
object item, item2;
item = radar(NuclearCell);
if (item == null) // Czy istnieje atomowe ogniwo?
{
// Sprawdzanie czy mozliwe jest stworzenie ogniwa atomowego
item = radar(UraniumOre);
item2 = radar(NuclearPlant);
if (item == null || item2 == null)
{
message("Nie mozna wytworzyc ogniwa atomowego.", DisplayError);
return 1;
}
// ----------------------------------
else // jesli tak
{
item = radar(UraniumOre);
goto(item.position);
grab();
item = radar(NuclearPlant);
goto(item.position);
drop();
move(-3);
wait(32);
move(3);
grab(); //wytworz
return 0;
}
}
else // jesli istnieje ogniwo
{
goto(item.position);
grab();
return 0;
}
item = radar(PowerCell);
if (item == null) // czy istnieje zwykle ogniwo?
{
// sprawdzanie czy mozliwe jest stworzenie zwyklego ogniwa
item = radar(PowerPlant);
item2 = radar(Titanium);
if (item == null)
{
message("Nie mozna wytworzyc ogniwa elektrycznego.", DisplayError);
return 1;
}
if (item2 == null)
{
if (Przetop() == 1)
{
message("Nie mozna wytworzyc ogniwa elektrycznego.", DisplayError);
return 1;
}
}
// ---------------------------------------
else
{
goto(item2.position);
grab();
}
goto(item.position);
drop();
move(-3);
wait(14);
move(3);
grab();
}
else
{
goto(item.position);
grab();
}
}
|
Simbaxie, ta funkcja wytworzy tylko atomowe ogniwo, jeśli będzie można je wytworzyć, a jeśli je znajdzie to tylko je weźmie i zakończy funkcję. Popraw ją.
Simbax - 11-10-2010, 17:01
Analizując mój program nie widzę żadnego błędu, wystarczy spojrzeć do głównej funkcji, po if (Power() == 1) return; (czyli po wykonaniu całej tej funkcji bez błędu) są linijki, które każą robotowi iść do fabryki, więc funkcja zdaje się jest napisana dobrze. Na razie nie testuje, bo nie zainstalowałem jeszcze Colobot-a, później sprawdzę dokładnie ten program.
Może mi ktoś powiedzieć czy działa ta część, w której wytwarza zwykłą baterię? Jeśli dobrze pamiętam, to tego akurat na pewno nie sprawdzałem.
Korniszon - 14-10-2010, 11:19
Poprawa:
Kod: | // funckje ----------------------------------------------------------------
int object::Przetop()
{
object item, item2;
// sprawdzanie czy mozliwe jest wykonanie funkcji
// -----------------------------------------------
item = radar(TitaniumOre); // znajdz rude
item2 = radar(Converter); // znajdz hute
if (item == null || item2 == null) // jesli nie ma rudy LUB huty wyswietl blad i przerwij program
{
message("Nie mozna wytworzyc kostki tytanu.", DisplayError);
return 1;
}
// ------------------------------------------------
// jesli warunki zostaly spelnione wykonaj
message("Wytwarzam kostkę tytanu.", DisplayInfo);
item = radar(TitaniumOre);
goto(item.position);
grab(); // znajdz i podnies rude tytanu
item = radar(Converter);
goto(item.position);
drop();
move(-2.5);
wait(15);
move(2.5);
grab(); // wytworz :P
}
int object::Power()
{
object item, item2;
item = radar(NuclearCell);
if (item == null) // Czy istnieje atomowe ogniwo?
{
// Sprawdzanie czy mozliwe jest stworzenie ogniwa atomowego
item = radar(UraniumOre);
item2 = radar(NuclearPlant);
if (item == null || item2 == null)
{
message("Nie mozna wytworzyc ogniwa atomowego.", DisplayError);
return 1;
}
// ----------------------------------
else // jesli tak
{
item = radar(UraniumOre);
goto(item.position);
grab();
item = radar(NuclearPlant);
goto(item.position);
drop();
move(-3);
wait(32);
move(3);
grab(); //wytworz
return 0;
}
}
else // jesli istnieje ogniwo
{
goto(item.position);
grab();
return 0;
}
}
int object::Power2()
{
object item, item2;
item = radar(PowerCell);
if (item == null) // czy istnieje zwykle ogniwo?
{
// sprawdzanie czy mozliwe jest stworzenie zwyklego ogniwa
item = radar(PowerPlant);
item2 = radar(Titanium);
if (item == null)
{
message("Nie mozna wytworzyc ogniwa elektrycznego.", DisplayError);
return 1;
}
if (item2 == null)
{
if (Przetop() == 1)
{
message("Nie mozna wytworzyc ogniwa elektrycznego.", DisplayError);
return 1;
}
}
// ---------------------------------------
else
{
goto(item2.position);
grab();
}
goto(item.position);
drop();
move(-3);
wait(14);
move(3);
grab();
}
else
{
goto(item.position);
grab();
}
}
// ----------------------------------------------------
extern void object::BotCreator()
{
object item; // zmienna pomocnicza
int robot[21]; // <-- robot ktory ma zostac stworzony
robot[0] = WheeledGrabber; //Transporter na kołach
robot[1] = TrackedGrabber; //Transporter na gąsienicach
robot[2] = WingedGrabber; //Transporter latający
robot[3] = LeggedGrabber; //Transporter na nogach
robot[4] = WheeledSniffer; //Szperacz na kołach
robot[5] = TrackedSniffer; //Szperacz na gąsienicach
robot[6] = WingedSniffer; //Szperacz latający
robot[7] = LeggedSniffer; //Szperacz na nogach
robot[8] = WheeledShooter; //Działo na kołach
robot[9] = TrackedShooter; //Działo na gąsienicach
robot[10] = WingedShooter; //Działo latające
robot[11] = LeggedShooter; //Działo na nogach
robot[12] = WheeledOrgaShooter; //Działo organiczne na kołach
robot[13] = TrackedOrgaShooter; //Działo organiczne na gąsienicach
robot[14] = WingedOrgaShooter; //Latające działo organiczne
robot[15] = LeggedOrgaShooter; //Działo organiczne na nogach
robot[16] = Subber; //Robot nurek
robot[17] = Recycler; //Robot recykler
robot[18] = Shielder; //Robot osłaniacz
robot[19] = Thumper; //Robot uderzacz
robot[20] = PhazerShooter; //Działo fazowe
item = radar(Titanium); // znajdz tytan
if (item == null) // jesli nie znaleziono, zrob go
{
message("Nie znaleziono tytanu", DisplayWarning);
if (Przetop() == 1) return;
}
// znaleziono
else
{
item = radar(Titanium);
goto(item.position);
grab();
// podnies tytan
}
item = radar(BotFactory);
goto(item.position);
drop();
move(-3); // znajdz fabryke i zostaw tytan, nastepnie cofnij sie
message("Prosze rozpoczac produkcje robota", DisplayWarning); // prosba o rozpoczecie produkcji
if (Power() == 1) if(Power2()==1) return; // tym czasem robot "idzie" po zrodlo energii
goto(item.position);
move(-3);
message("Przynioslem ogniwo.", DisplayWarning); // informacja
while (true)
{
item = radar(robot,0,90,0,8); // szukaj robota (kategoria w zmiennej robot)
if (item == null) // jesli nie ma, powiadom, ze czekasz ;) i czekaj chwile, jesli nadal nie ma, to znowu powiadom itd.
{
message("Czekam na robota.", DisplayWarning);
wait(5);
}
else // jesli jest wloz mu baterie i pozwol wyjechac
{
move(3);
drop();
move(-10);
break;
}
}
message("Robot zostal stworzony!", DisplayInfo); // powiadomienie o powodzeniu :)
}
|
Simbax - 04-11-2010, 15:25
Aha... Już wiem o co ci chodzi, źle cię poprzednio zrozumiałem xD Twoja poprawa jest dobra, ale po co tworzyć kolejną funkcję, wystarczyło jedynie usunąć linijkę:
Kod: | int object::Power()
{
object item, item2;
item = radar(NuclearCell);
if (item == null) // Czy istnieje atomowe ogniwo?
{
// Sprawdzanie czy mozliwe jest stworzenie ogniwa atomowego
item = radar(UraniumOre);
item2 = radar(NuclearPlant);
if (item == null || item2 == null)
{
message("Nie mozna wytworzyc ogniwa atomowego.", DisplayError); |
return 1;
Kod: |
}
// ----------------------------------
else // jesli tak
{
item = radar(UraniumOre);
goto(item.position);
grab();
item = radar(NuclearPlant);
goto(item.position);
drop();
move(-3);
wait(32);
move(3);
grab(); //wytworz
return 0;
}
}
else // jesli istnieje ogniwo
{
goto(item.position);
grab();
return 0;
}
item = radar(PowerCell);
if (item == null) // czy istnieje zwykle ogniwo?
{
// sprawdzanie czy mozliwe jest stworzenie zwyklego ogniwa
item = radar(PowerPlant);
item2 = radar(Titanium);
if (item == null)
{
message("Nie mozna wytworzyc ogniwa elektrycznego.", DisplayError);
return 1;
}
if (item2 == null)
{
if (Przetop() == 1)
{
message("Nie mozna wytworzyc ogniwa elektrycznego.", DisplayError);
return 1;
}
}
// ---------------------------------------
else
{
goto(item2.position);
grab();
}
goto(item.position);
drop();
move(-3);
wait(14);
move(3);
grab();
}
else
{
goto(item.position);
grab();
}
} |
Wtedy program automatycznie przejdzie do fragmentu z PowerCell, dlatego że cały program do tworzenia baterii jest w instrukcji if i else Pozdrawiam!
|
|