PDA

View Full Version : Spostare un oggetto in C++


Rootnight
13-01-2013, 14:19
Salve , ero intenzionato a scrivere un programma in C++ che facesse cadere degli oggetti a random (ad esempio dei " . * ' " ecc...) e un contenitore (ad esempio |____|) con cui prenderli , prima che tocchino il "suolo" , ed ottenere punti.Il contenitore dovrà essere spostato a destra e a sinistra , col semplice ausilio dei tasti "d" e "s". Il mio problema è che non riesco a far muovere l'oggetto. Ho provato in svariati modi , usando la funzione gotoxy. Ma non riesco a farlo muovere nè a sinistra nè a destra.:muro:

void gotoxy(int x, int y) {
for (int i = 0; i < y; i++) {
cout<<"\n";
}
for (int i = 0; i < x; i++) {
cout<<" ";
}
}


Ho pensato a un ciclo while , che ogni volta che il tasto , viene premuto elimina l'oggetto e lo riscriva , più avanti , ma non riesco. Quindi mi chiedevo , se qualcuno di voi , avesse la pazienza di aiutarmi :D .

wingman87
13-01-2013, 20:49
Qual è il risultato che ottieni?
Io vedo almeno due problemi da tenere in considerazione:
1- La schermata viene cancellata a ogni render?
2- Come fai se tra 0,0 e x,y vuoi disegnare qualcosa?

Per curiosità, è un esercizio scolastico?

Rootnight
16-01-2013, 14:11
Scusate il ritardo :D . Si , l'oggetto va in loop , scomparendo e riapparendo all'infinito. Oppure se scrivo "return 0" , l'oggetto si sposta , ma subito dopo la schermata viene chiusa. Quindi penso che dovrei fare in modo da ritornare alla scelta dello spostamento , ma non so come :(.
1- Si.
2- Non ho ben capito la domanda:confused:

Comunque si si :) .

Ecco le righe della scelta , dello spostamento a destra :
while(MOV != 1) {
switch(tasto[0] = getch()) {
case 'd':
while(tasto[0] == 'd'){
cout << "|__|";
system("CLS");
gotoxy(1,0);
cout << "|__|";
return 0;

}
break;

wingman87
17-01-2013, 13:37
Oppure se scrivo "return 0" , l'oggetto si sposta , ma subito dopo la schermata viene chiusa.

Probabilmente perché il programma termina, questo credo tu l'abbia capito

Quindi penso che dovrei fare in modo da ritornare alla scelta dello spostamento , ma non so come :(.

E' un normale loop, scegli tu di che tipo. Per semplificare il codice, suddividilo in sottofunzioni, ad esempio potresti individuare dove devi inserire il loop e poi mettere tutto il corpo in una funzione a parte. In generale cerca sempre di scomporre il problema per semplificarti la vita.
Fatto questo dovresti imbatterti in un altro problema, ma ne riparleremo più avanti.

2- Non ho ben capito la domanda:confused:

Poniamo che nella schermata ci sia alla posizione 10,20 un * e alla posizione 10,50 il contenitore. Come li disegni entrambi sfruttando gotoxy?

Comunque non è un esercizio semplice, almeno così come l'hai posto, non è che il tuo professore ti ha chiesto qualcosa di più semplice e tu hai aggiunto complessità all'esercizio?

Rootnight
18-01-2013, 13:56
Probabilmente perché il programma termina, questo credo tu l'abbia capito

Sisi , ed è proprio questo il mio problema.
Per semplificare il codice, suddividilo in sottofunzioni, ad esempio potresti individuare dove devi inserire il loop e poi mettere tutto il corpo in una funzione a parte. In generale cerca sempre di scomporre il problema per semplificarti la vita.

Ma dividendolo in sotto-funzioni , secondo me , mi complicherei la vita. Perchè dovrei creare un altra funzione a parte , altre istruzioni e variabili. Correggimi se sbaglio , ma non è più semplice scrivere tutto in main?
Poniamo che nella schermata ci sia alla posizione 10,20 un * e alla posizione 10,50 il contenitore. Come li disegni entrambi sfruttando gotoxy?
Il simbolo * dovrà stare sempre sempre sulla stessa colonna , scendendo di linea in linea fino ad arrivare a 10,20 , mentre il contenitore dovrà spostarsi sempre sulla stessa linea. Quindi non appena * arriverà a 10,20 dovrà essere eliminato , no?
Comunque non è un esercizio semplice, almeno così come l'hai posto, non è che il tuo professore ti ha chiesto qualcosa di più semplice e tu hai aggiunto complessità all'esercizio?
Nono , è proprio questo l'esercizio :(

Rootnight
28-01-2013, 17:41
Scusate il doppio post e il ritardo :D .
Mi sono reso conto che utilizzando la funzione gotoxy in quel modo, non facevo altro che spostare l'oggetto sempre a 1,0. Quindi ho seguito il tuo consiglio e ho suddiviso il codice in una sottofunzione. E ho riscritto il programma in un altro modo. Ma adesso quando lo eseguo non stampo niente , che ne pensi ? :(

#include <iostream>
#include <conio.h>
#define x 75
#define y 20

using namespace std;
int i,j;
void stamp(int floor [][y]);


int main() {
int floor[x][y];
int MOV = 0, r ,c;
char tasto[5];

r = 18;
c = 10;

floor[r][c] = 8;

r = 17;
c = 2;


while(MOV != 1) {
switch(tasto[0] = getch()) {
case 'd':
if(tasto[0] == 'd'){
floor[r][c] = 0;
floor[r+1][c] = 0;
c+=1;
floor[r][c] = 6;
floor[r +1][c] = 6;
}
break;
}
}
system("pause");
}

void stamp( int floor [][y]){

for(i = 0; i < x; i++){

for(j = 0; j < y; j++){

if(floor[i][j] == 6){
printf(" * ");
}
else{
printf(" ");
}
}
printf("\n");
}
printf("\n");

}

wingman87
28-01-2013, 18:00
Beh, la funzione che dovrebbe stampare qualcosa è stamp ma non la richiami mai...

Rootnight
29-01-2013, 17:09
Se la funzione la richiamo nello switch(dopo aver effetuato lo spostamento), mi stampa, sopra due oggetti che si spostano e mooolto più sotto un oggetto che sta sempre fermo e che viene stampato ogni volta che premo il tasto per lo spostamento. Mentre quelli sopra si, si spostano, ma non vengono visualizzati a meno che non si scorri verso l'alto :muro: Invece se lo metto fuori lo switch dà sempre lo stesso problema :(