Pagina 12 din 18

Scris: 27 Iul 2012, 15:53
de Alexandru
Salut!
De curand, m-am gandit sa fac un simulator. Mai exact, este vorba despre viteza de reactie. Utilizatorul trebuie sa apese in 60 de secunde tasta spatiu de un numar nelimitat de ori, iar apoi sa afle scorul final, adica de cate ori s-a reusit sa se apese tasta spatiu in cele 60 de secunde trecute care tocmai au expirat. Doar ca m-am lovit de o problema: Atunci cand eu apas tasta spatiu, variabilei numite i caruia i-am atribuit numarul 1, la apasarea tastei spatiu, variabila i este urcata la doi si se opreste acolo.
Mai jos pun codul.

Cod: Selectaţi tot

tts_voice voice;
void main()
{
show_game_window("Training game");
voice.speak("Welcome to Training Game. Press enter to begin.");
while(true)
{
if(key_down(KEY_LMENU) && key_pressed(KEY_F4))
{
exit();
}
else
{
if(key_pressed(KEY_RETURN))
{
break;
}
}
wait(5);
}
voice.stop();
start_game();
}
void start_game()
{
int i=1;
int time;
sound background;
sound expired_time;
background.stream("background.dat");
expired_time.stream("expired_time.dat");
voice.speak_wait("Ok, let start. Good luck!");
background.play_looped();
for(time=0; time<60; time++)
{
wait(1000);
}
while(true)
{
if(key_pressed(KEY_SPACE))
{
i++;
}
if(time==60)
{
break;
}
wait(5);
}
background.stop();
expired_time.play_wait();
voice.speak_wait("Times up! Your final score is"+i);
exit();
}

Scris: 27 Iul 2012, 18:04
de Manu
In codul tau, dupa ce se apasa enter pentru a ajunge in functia cu apasarea spatiului se intampla ceva ciudat:
Se intampla intai un for de un minut in care poti apasa cat vrei spatiul ca nu are nici un efect.
Dupa acest for de un minut se ajunge intr-un while care sta foarte putin, o fractiune de secunda pentru ca este indeplinita din start conditia pentru break, adica time==60. Acest time a ajuns la 60 inainte de a aparea while-ul in care scriptul ar simti apasarea spatiului.

Reformulez functia start_game:, o poti utiliza chemand-o oricand pentru o noua incercare:

Cod: Selectaţi tot

void start_game()
{
int i=0; // variabila care va fi incrementata.
timer time; // creezi un obiect cronometru.
time.restart(); // aduci cronometrul la 0.

// While-ul care asteapta apasarea spatiului:
while(true)
{
if(key_pressed(KEY_SPACE))
{
i++;
}

// verificam daca s-a trecut de o secunda:
if(time.elapsed>=60000)
{
break; // intrerupem while-ul.
}
wait(5);
}

// Afisam rezultatul dupa ce se incheie while-ul:
alert("Result...", "You pressed the space bar "+i+" times.");
}

Scris: 27 Iul 2012, 20:56
de Alexandru
A, deci ar fi trebuit sa folosesc un timer, nu for-ul. Eu am folosit for-ul pentru ca mi s-a parut ca ar loa mai putin tim din punct de vedere al utilizarii, dar uite ca tot la timer am ajuns. Defapt, m-am gandit ca decat sa pun timer-ul, mai bine pun for-ul.
Multumesc de ajutor, merge excelent!:D

Scris: 28 Iul 2012, 00:06
de Manu
Probabil ca ai folosit astfel pentru ca ai retinut ca la curs am facut noi un fel de cronometru cu for-ul.
Acela era doar pentru a intelege utilitatea unui for fara sa cunoastem array-urile si alte detalii de programare.
Pana la urma, chiar daca ai face un cronometru, tot timer-ul ar fi ales, for-ul s-a dovedit util pentru multe alte lucruri, dar in nici un caz pentru masurarea timpului.
Daca totul merge, ai putea sa ne dai spre download o arhiva cu toate fisierele, inclusiv sunetele, ai putea inlocui arhiva dinainte, sa nu fie atat de multe link-uri nefunctionale catre fisiere din Dropbox.

Scris: 28 Iul 2012, 11:33
de Alexandru
Sigur ca da! acum lucrez la recorduri si dupa aceea mai vad in ce masura voi mai imbunatati jocul.
Pe curand!

Scris: 18 Noi 2012, 21:31
de Stefan_Ilioaica
Salut.
Mai dau si eu pe aici, din cand in cand.
M-am lovit de o problema destul de banala, dar careia nu ii gasesc rezolvare.
Am facut un meniu, iar pe fundal sa se auda o melodioara. Problema e ca meniul imi este afisat cu toate optiunile din el, dar melodia nu porneste de nici o culoare.
Pun mai jos codul.

void menu()
{
sound fundal;
fundal.stream("Jingle_bells.ogg");
fundal.play_looped();
fundal.volume=0;
dynamic_menu mainmenu;
int menu_result;
mainmenu.allow_escape=true;
mainmenu.wrap=true;
mainmenu.add_item_tts("Play a game");
mainmenu.add_item_tts("Test speakers");
mainmenu.add_item_tts("Exit");
menu_result=mainmenu.run("Please choose an option.", true);
if(menu_result==0)
{
voice.speak_wait("Thanks for playing!");
exit();
}
if(menu_result==1)
{
voice.speak_wait("Unavailable");
menu();
}
if(menu_result==3)
{
voice.speak_wait("Thanks for playing!");
exit();
}
}

Scris: 18 Noi 2012, 21:48
de Manu
Nu pare sa fie vreo problema de cod, s-ar putea ca fisierul .OGG sa nu fie gasit, sa fie o litera din nume scrisa gresit, sa nu fie in acelasi folder cu scriptul etc.
Esti sigur ca e un fisier .OGG in regula si ca este unde trebuie cu denumirea corecta?

Vezi ca sunetul il poti seta inainte de a-i da play_looped(), dar in cazul de fata nu conteaza, oricum implicit volumul ar fi la 0.

Scris: 18 Noi 2012, 21:49
de Stefan_Ilioaica
Da, sunetul este in acelasi folder, in format .ogg.

Scris: 18 Noi 2012, 23:06
de Manu
Eventual trimite-mi prin mail un ZIP cu sunetul si codul.

Scris: 20 Noi 2012, 17:45
de Stefan_Ilioaica
Salut.
Problema rezolvata, doar o mica neintelegere intre numele fisierului si ceea ce scrisesem eu in cod. Si cand te gandesti ca lipsea doar un semn.
Dar ma rog, asta e, chiar n-am sesizat chestia asta de la bun inceput.

Scris: 13 Ian 2013, 22:17
de Alexandru
Salut!
Cu mult timp in urma, am invatat un joc simplu, dar interesant, care m-am gandit sa il programez in BGT. Asa cum am spus mai-nainte, jocul este simplu astfel in cat nu am folosit decat niste alert-uri si un random. Obiectivul este urmatorul:
Trebuie sa te gandesti la un numar, cineva iti da inca atat (asta inseamna ca aduni inca odata numarul respectiv), cel caruia iai pus sau ti-a pus provocarea iti da un numar pe care il aduni sumei de pana acum, cineva necunoscut de tine vine si iti ia jumate din suma (asta inseamna ca trebuie sa inparti numarul la 2), apoi trebuie sa ii dai ceea ce ti-a dat acel cineva si apoi trebuie sa iti ghiceasca suma finala. Imi pare rau ca sursa este vizibila astfel in cat se afla smecheria de ghicire a numarului, dar asta e...
Acum, am sa dau codul, cu toate ca mesajele sunt scrise in limba engleza, dar cred ca acestea sunt inteligibile pentru un necunoscator al acestei limbi.
Cat despre gandirea la un numar de catre cel care trebuie sa il ghiceasca (in acest caz calculatorul), am fixat un random intre 1 si 20. In mod normal, nu e nici o regula referitor la acest lucru, dar pentru ca nu am avut de ales a trebuit sa pun un numar minim si un numar maxim, cu toate ca as fi putut sa creez o caseta de intrare (input box), care sa necesite numarul maxim la care sa se gandeasca calculatorul, dar am spus ca jocul sa se desfasoare normal.
Asadar, mai jos este codul.

Cod:
void main()
{
int generate=random(1, 20);
int x=generate/2;
alert("Let's guess your number, the first step", "Please think to a number.");
alert("Let's guess your number, the second step", "Some one gives you still so.");
alert("Let's guess your number, the third step", "I still give you "+generate+".");
alert("Let's gues your number, the fourth step", "Some one unknown by you come's and take's from you a half of your sum.");
alert("Let's gues your number, the fifth step", "Give to that some one how much has gave you earlyer.");
alert("Let's gues your number, the last step", "Your total sum is "+x+".");
exit();
}

Nu trebuie decat sa fie inserat acest cod in Notepad si sa fie salvat documentul cu un nume, urmat de extensia .bgt.

Astept orice fel de comentarii la adresa acestui joc.
De asemenea, daca cineva are ceva corectari gramaticale referitoare la limba engleza, sunt bine-venite, astfel imi pot imbunatati cunostintele.

Scris: 14 Ian 2013, 12:57
de Manu
Vezi ca ai pus la sfarsit variabila y in ultimul alert(), variabila nedeclarata, acolo cred ca trebuia sa fie x.

Eu as sugera sa faci joculetul in urmatorul fel:
1. Calculatorul se gandeste la un numar intre 1 si 20, asadar un random(1, 20), dar nu ti-l arata.
2. Apar alert-urile cu etapele joculetului, iar calculatorul face intre timp calculele necesare conform secventelor scrise de tine.
3. Dupa ce se fac calculele, spune cu cat a mai ramas, tot intr-un alert.
4. Apare un input_box in care utilizatorul este intrebat numarul la care "s-a gandit" calculatorul.
5. Se verifica daca numarul introdus in input_box este egal cu cel la care "s-a gandit" calculatorul, cel determinat random in prima linie de cod.

Scris: 14 Ian 2013, 18:44
de Alexandru
Da, dar aici e ideea ca trebuie calculatorul sa iti ghiceasca numarul, nu sa ii fie ghicit.
Tin minte ca am modificat codul dimineata asta, parca in jurul orelor 10 sau 11 atunci cand eram la scoala, vrand sa testez script-uletul si pe Note Book.

Scris: 14 Ian 2013, 20:00
de Manu
Pai atunci ar trebui sa intrebe numarul printr-un input_box si sa avem incredere ca nu se uita la ce am scris si ca va compara doar la final doua valori, cea initiala si cea calculata.

Pentru valoare integer din input_box pe un singur rand, scrie:

Cod: Selectaţi tot

my_number=string_to_number(input_box("Number", "Write a number between 1 and 20:"));

Scris: 14 Ian 2013, 22:30
de Alexandru
A! O stiu si pe asta cu convertirea input_box-ului din string in numar. Dar cand am spus ca se vede smecheria de ghicire, m-am referit la faptul ca este variabila care detine random-ul si este si variabila x care imparte la 2 ceea ce a fost ales aleatoriu atunci cand este apelata de ultimul alert.
Practic ceea ce trebuie facut ca sa fie ghicit numarul la care sa gandit persoana respectiva, este ca numarul dat de tine sa il imparti la 2. Astfel poti fi sigur ca suma la care ajunge e posibil sa o ghicesti.