Disposizione random
Salve ragazzi allooora..Sono in un vicolo cieco...
Sto programmando un giochetto con pascal.. un'opzione del gioco richiede di far disporre le pedine ('O') nella griglia di gioco(una matrice 7x7) in modo random. Io ho fatto così ma non mi stampa nulla..
program dispos;
type matrice = array [1..7, 1..7] of char;
var
cont, ped, i, j,y: integer;
mat: matrice;
writeln ('Inserisci il numero di pedine');
readln (ped);
cont:=1;
while (cont<=ped) do
begin
for i:=1 to 7 do
for j:=1 to 7 do
begin
y:=0;
randomize;
y:= random (2);
end;
if y=1 then
mat [i,j]:= 'O';
cont:=cont+1;
end;
La variabile cont mi serve per utilizzare solo il numero di pedine che ho deciso di utilizzare..HELP
Sto programmando un giochetto con pascal.. un'opzione del gioco richiede di far disporre le pedine ('O') nella griglia di gioco(una matrice 7x7) in modo random. Io ho fatto così ma non mi stampa nulla..
program dispos;
type matrice = array [1..7, 1..7] of char;
var
cont, ped, i, j,y: integer;
mat: matrice;
writeln ('Inserisci il numero di pedine');
readln (ped);
cont:=1;
while (cont<=ped) do
begin
for i:=1 to 7 do
for j:=1 to 7 do
begin
y:=0;
randomize;
y:= random (2);
end;
if y=1 then
mat [i,j]:= 'O';
cont:=cont+1;
end;
La variabile cont mi serve per utilizzare solo il numero di pedine che ho deciso di utilizzare..HELP
Risposte
"stellacometa2003":
Salve ragazzi allooora..Sono in un vicolo cieco...
Sto programmando un giochetto con pascal.. un'opzione del gioco richiede di far disporre le pedine ('O') nella griglia di gioco(una matrice 7x7) in modo random. Io ho fatto così ma non mi stampa nulla..
program dispos; type matrice = array [1..7, 1..7] of char; var cont, ped, i, j,y: integer; mat: matrice; writeln ('Inserisci il numero di pedine'); readln (ped); cont:=1; while (cont<=ped) do begin for i:=1 to 7 do for j:=1 to 7 do begin y:=0; randomize; y:= random (2); end; if y=1 then mat [i,j]:= 'O'; cont:=cont+1; end;
La variabile cont mi serve per utilizzare solo il numero di pedine che ho deciso di utilizzare..HELP

Comunque il problema è che hai messo i random in un ciclo e l'assegnazione nell'altro... questo dovrebbe funzionare...
program dispos; type matrice = array [1..7, 1..7] of char; var cont, ped, i, j,y: integer; mat: matrice; writeln ('Inserisci il numero di pedine'); readln (ped); cont:=1; while (cont<=ped) do begin for i:=1 to 7 do for j:=1 to 7 do begin y:=0; randomize; y:= random (2); if y=1 then mat [i,j]:= 'O'; cont:=cont+1; end; end;
Alcune cose... credo che randomize vada fuori dal ciclo: inizializza il random... non serve farlo tutte le volte che lo usi...
Ma come ho detto non so leggere il pascal... e con ada sono abituato ad avere scritto end if o end loop quindi potrei sbagliare a cosa gli end sono riferiti
Ho già risolto....in pratica mettevo troppi giri inutili...
"stellacometa2003":
Ho già risolto....in pratica mettevo troppi giri inutili...
Puoi anche invertire il problema volendo... cioè invece di selezionare tra le due alternative tutte le caselle puoi mettere a caso le pedine.
Il Pascal ... mi riporta indietro nel tempo ...
Anche se stellacometa2003 ha risolto,
posto una soluzione, con alcuni miglioramenti estetici,
che rimedia a qualche problema delle soluzioni proposte, in primis il numero non corretto di pedine inserite nella matrice.

Anche se stellacometa2003 ha risolto,

che rimedia a qualche problema delle soluzioni proposte, in primis il numero non corretto di pedine inserite nella matrice.
program dispos; const r=7; c=7 ; car='O'; type matrice = array [1..r, 1..c] of char; var cont, ped, i, j : integer; mat : matrice; begin write('Inserisci il numero di pedine: '); repeat readln(ped); until ped <= r*c; for i:=1 to r do for j:=1 to c do mat[i,j]:='.'; randomize; cont := 0; while cont < ped do begin i:=random(r)+1; j:=random(c)+1; if mat[i,j]<>car then begin mat[i,j]:=car; cont:=cont+1 end end; for i:=1 to r do begin for j := 1 to c do write(mat[i,j]); writeln; end; write('premi INVIO...'); readln; end.
Mitico lorven sempre un grande...l'ho risolto in modo simile al tuo..Però poi dopo aver messo i controlli per smuovere le pedine e giocare mi sono ricordata che in un gioco vi possono essere anche situazione di stallo..tipo quando le pedine sono isolate oppure quando si trovano agli angoli della griglia o quando non sono adiacenti o quando vi sono 2 pedine in direzione obbliqua che non si possono mangiare visto che la mossa per "mangiare" la si fa solo in orizzontale e verticale...E cmq..ora sono entrata in crisi perchè non riesco a far rientrare tutti questi casi di stallo in poche righe di codice..Come continuo? devo fare un mega if con tutti casi possibili e immaginabili di stallo?? Aiuto!
"stellacometa2003":
Mitico lorven sempre un grande...l'ho risolto in modo simile al tuo..Però poi dopo aver messo i controlli per smuovere le pedine e giocare mi sono ricordata che in un gioco vi possono essere anche situazione di stallo..tipo quando le pedine sono isolate oppure quando si trovano agli angoli della griglia o quando non sono adiacenti o quando vi sono 2 pedine in direzione obbliqua che non si possono mangiare visto che la mossa per "mangiare" la si fa solo in orizzontale e verticale...E cmq..ora sono entrata in crisi perchè non riesco a far rientrare tutti questi casi di stallo in poche righe di codice..Come continuo? devo fare un mega if con tutti casi possibili e immaginabili di stallo?? Aiuto!
Di quale gioco si tratta? Come si gioca?
Allora...questo gioco somiglia alla dama...
Si parte da una disposizione iniziale delle pedine. Lo scopo del gioco è quello di eliminare via via le pedine mediante delle mosse che consistono nel far saltare una pedina oltre una di quelle adiacenti, per posizionarsi così su di una cella vuota. Si può muovera la pedina solo in orizzontale e verticale. La pedina "mangiata" viene ovviamente rimossa dalla griglia di gioco. Si vince quando tutte le pedine vengono mangiate e ne resta solo una.
Questo riguarda le regole in generale, poi gli voglio mettere il punteggio e varie opzioni che pian piano mi vengono le ispirazioni mi propongo di sviluppare anche qui..tipo punteggi migliori, pedine mangiate ecc. Intanto vorrei risolvere il problema appena postato della situazione di stallo... che mi suggerite?
Si parte da una disposizione iniziale delle pedine. Lo scopo del gioco è quello di eliminare via via le pedine mediante delle mosse che consistono nel far saltare una pedina oltre una di quelle adiacenti, per posizionarsi così su di una cella vuota. Si può muovera la pedina solo in orizzontale e verticale. La pedina "mangiata" viene ovviamente rimossa dalla griglia di gioco. Si vince quando tutte le pedine vengono mangiate e ne resta solo una.
Questo riguarda le regole in generale, poi gli voglio mettere il punteggio e varie opzioni che pian piano mi vengono le ispirazioni mi propongo di sviluppare anche qui..tipo punteggi migliori, pedine mangiate ecc. Intanto vorrei risolvere il problema appena postato della situazione di stallo... che mi suggerite?
"stellacometa2003":
Allora...questo gioco somiglia alla dama...
Si parte da una disposizione iniziale delle pedine. Lo scopo del gioco è quello di eliminare via via le pedine mediante delle mosse che consistono nel far saltare una pedina oltre una di quelle adiacenti, per posizionarsi così su di una cella vuota. Si può muovera la pedina solo in orizzontale e verticale. La pedina "mangiata" viene ovviamente rimossa dalla griglia di gioco. Si vince quando tutte le pedine vengono mangiate e ne resta solo una.
Questo riguarda le regole in generale, poi gli voglio mettere il punteggio e varie opzioni che pian piano mi vengono le ispirazioni mi propongo di sviluppare anche qui..tipo punteggi migliori, pedine mangiate ecc. Intanto vorrei risolvere il problema appena postato della situazione di stallo... che mi suggerite?
Non sono esperto di giochi

Ci sono due giocatori, con pedine di diverso colore (B,N), che devono muoversi alternativamente in una qualsiasi delle quattro direzioni N,S,E,O, di una sola casella, che può essere libera, occupata da B, occupata da N? Se la cella risulta occupata dall'avversario, è obbligatorio o no "mangiare"? Dopo aver "mangiato", si resta nella cella della pedina "mangiata"? Si possono "mangiare" con una sola mossa più pedine, come per la Dama? ecc. ecc. ...
Puoi fare tutte le domande che vuoi lorven...no problem!
Allora..il giocatore è uno solo (almeno nella mia prima versione del gioco
Finita questa versione ne voglio fare un'altra con multiplayer) Il piano di gioco è costituito da una griglia 7x7 celle , le celle inizialmente sono vuote (visualizzate da un trattino "-"). Le pedine vengono visualizzate mediante una "o". Le direzioni consentite per mangiare sono tutte, N S E O, quelle non consentite sono gli spostamenti obliqui (quindi devo pure creare un controllo che non mi faccia muovere in modo obliquo) si "mangia" facendo saltare la pedina oltre una di quelle adiacenti per posizionarla su una cella vuota. Si mangia una pedina alla volta, poi viene richiesto dinuovo all'utente di immettere le coordinate per far muovere la pedina e se si può si mangia un'ulteriore volta..
Mi sembra di non aver dimenticato nulla..In caso chiedi pure...
Allora..il giocatore è uno solo (almeno nella mia prima versione del gioco

Mi sembra di non aver dimenticato nulla..In caso chiedi pure...
"stellacometa2003":
Allora..il giocatore è uno solo ... , le celle inizialmente sono vuote (visualizzate da un trattino "-"). Le pedine vengono visualizzate mediante una "o". ...
Confesso, sono tonto




Apro il programma e mi trovo davanti un menu di scelta che mi dice come voglio disporre le pedine nella griglia, inizialmente vuota, o in modo manuale (inserisco le coordinate e metto le pedine in griglia) o in modo random (codice gia postato sopra) una volta che ho le pedine nella griglia mi devo automangiare per così dire e fare in modo da farmi restare una sola pedina in griglia per vincere il gioco. Se non riesco a farmi restare una sola pedina e vado in stallo (possibili ipotesi di stallo le ho gia postate) perdo; se invece riesco a farmi restare una sola pedina e meglio ancora quest'unica pedina e al centro della griglia avrò punteggio doppio e vinco il gioco..

Dai dimmi che lo hai capito ti prego..

Dai, pensavo si capisse... scherzavo!
Era già chiaro quanto esponevi; si tratta di un gioco classico, del quale attualmente mi sfugge il nome, in cui, al posto delle pedine, ho visto bottiglie, chiodi ed altro ancora in varie salse, con griglie iniziali di forma non solo quadrata.
Mi sono permesso di scherzare -bonariamente- ricordando altre circostanze in cui ti ho dato, insieme ad altri, un "aiutino", ad esempio per il famigerato programma in VB sulla tombola!
Tornando a noi, le situazioni di stallo a cui alludi -che implicano che il gioco non può proseguire e quindi si è perso- si possono gestire non con un "mega-IF", come paventavi, ma con una scansione ciclica della matrice. Effettuando al solito due cicli nidificati, uno sulle righe e l'altro sulle colonne, basta controllare se la cella in posizione (I,J) ha almeno una cella "vicina" che valga "O".
Quanto ai casi particolari -prima e ultima riga, prima e ultima colonna- si possono gestire come tali, ma si possono anche ricondurre al caso generale, gestito con i due cicli, costruendo opportunamente la matrice iniziale.

Mi sono permesso di scherzare -bonariamente- ricordando altre circostanze in cui ti ho dato, insieme ad altri, un "aiutino", ad esempio per il famigerato programma in VB sulla tombola!

Tornando a noi, le situazioni di stallo a cui alludi -che implicano che il gioco non può proseguire e quindi si è perso- si possono gestire non con un "mega-IF", come paventavi, ma con una scansione ciclica della matrice. Effettuando al solito due cicli nidificati, uno sulle righe e l'altro sulle colonne, basta controllare se la cella in posizione (I,J) ha almeno una cella "vicina" che valga "O".
Quanto ai casi particolari -prima e ultima riga, prima e ultima colonna- si possono gestire come tali, ma si possono anche ricondurre al caso generale, gestito con i due cicli, costruendo opportunamente la matrice iniziale.

"lorven":
Dai, pensavo si capisse... scherzavo!Era già chiaro quanto esponevi; si tratta di un gioco classico, del quale attualmente mi sfugge il nome, in cui, al posto delle pedine, ho visto bottiglie, chiodi ed altro ancora in varie salse, con griglie iniziali di forma non solo quadrata.
Mi sono permesso di scherzare -bonariamente- ricordando altre circostanze in cui ti ho dato, insieme ad altri, un "aiutino", ad esempio per il famigerato programma in VB sulla tombola!![]()
Tornando a noi, le situazioni di stallo a cui alludi -che implicano che il gioco non può proseguire e quindi si è perso- si possono gestire non con un "mega-IF", come paventavi, ma con una scansione ciclica della matrice. Effettuando al solito due cicli nidificati, uno sulle righe e l'altro sulle colonne, basta controllare se la cella in posizione (I,J) ha almeno una cella "vicina" che valga "O".
Quanto ai casi particolari -prima e ultima riga, prima e ultima colonna- si possono gestire come tali, ma si possono anche ricondurre al caso generale, gestito con i due cicli, costruendo opportunamente la matrice iniziale.
La mia tombolicchia in Vb è verooo..

Cmq, te l'ho mai detto che sei un genio??

GRAZIEEE

allooooora...mi sento un'emerita ignorante quando le cose cosi banali non mi riescono però..non getterò mai la spugna..Cmq, ho cercato di fare così:
E poi per richiamarla:
Almeno questo per vedere se vi sono pedine vicine..
Ma con la mia solita fortuna...NON MI VIENE GIUSTO!!!
function MosseValide(const m: matrice): integer; var mosse, i, j:integer; begin mosse := 0; for i := 1 to 7 do for j := 1 to 7 do begin if (m[i,j] = 'O') then begin if (m[i+1, j] = 'O') then inc(mosse); if (m[i, j + 1] = 'O') then inc(mosse); if (m[i - 1, j] = 'O') then inc(mosse); if (m[i, j - 1] = 'O') then inc(mosse); end; end; mossevalide := mosse; end;
E poi per richiamarla:
writeln ('Selezione la pedina'); read (i); read (j); x:= mossevalide (mat); if x>0 then ..... else writeln ('partita persa');
Almeno questo per vedere se vi sono pedine vicine..
Ma con la mia solita fortuna...NON MI VIENE GIUSTO!!!

"stellacometa2003":
...
1.
function MosseValide(const m: matrice): integer;
2.
if (m[i+1, j] = 'O') then inc(mosse);
if (m[i, j + 1] = 'O') then inc(mosse);
if (m[i - 1, j] = 'O') then inc(mosse);
if (m[i, j - 1] = 'O') then inc(mosse);
...
1. Perchè la matrice è passata come costante?
2. Non sempre queste posizioni sono valide!

MIIIIIIIIIIIIIIIIIII......Ci riuscirò!!!!

stavolta ho fatto così:
function CiSonoMosseValide(var m: Matrice): boolean;
var mosse, i, j:integer;
begin
mosse := 0;
for i := 1 to 7 do
for j := 1 to 7 do
begin
if (m[i,j] = 'O') then
begin
// Devi assicurarti che gli indici i e j siano nell'intervallo corretto
if (m[i+1, j] = 'O') then inc(mosse);
if (m[i, j + 1] = 'O') then inc(mosse);
if (m[i - 1, j] = 'O') then inc(mosse);
if (m[i, j - 1] = 'O') then inc(mosse);
end;
end;
CiSonoMosseValide := (mosse > 0);
end;
e poi:
if not CiSonoMosseValide (mat) then
begin
writeln ('non ci sono mosse possibili');
readln;
Exit;
end
else
.....
Ma anche se vengono pedine adiacenti esce lo stesso!!!
function CiSonoMosseValide(var m: Matrice): boolean;
var mosse, i, j:integer;
begin
mosse := 0;
for i := 1 to 7 do
for j := 1 to 7 do
begin
if (m[i,j] = 'O') then
begin
// Devi assicurarti che gli indici i e j siano nell'intervallo corretto
if (m[i+1, j] = 'O') then inc(mosse);
if (m[i, j + 1] = 'O') then inc(mosse);
if (m[i - 1, j] = 'O') then inc(mosse);
if (m[i, j - 1] = 'O') then inc(mosse);
end;
end;
CiSonoMosseValide := (mosse > 0);
end;
e poi:
if not CiSonoMosseValide (mat) then
begin
writeln ('non ci sono mosse possibili');
readln;
Exit;
end
else
.....
Ma anche se vengono pedine adiacenti esce lo stesso!!!



1. function CiSonoMosseValide(var m: Matrice): boolean;
Non è necessario passare la matrice per indirizzo, perchè non deve essere modificata; togli "var" al parametro m, anche se non è un errore;
2. // Devi assicurarti che gli indici i e j siano nell'intervallo corretto
Al di là dei buoni propositi, non vedo realizzato il controllo!
3. ...
Non è necessario passare la matrice per indirizzo, perchè non deve essere modificata; togli "var" al parametro m, anche se non è un errore;
2. // Devi assicurarti che gli indici i e j siano nell'intervallo corretto
Al di là dei buoni propositi, non vedo realizzato il controllo!
3. ...

Non ricevendo notizie da stellacometa2003, do un "aiutino" (piuttosto consistente
)
Per controllare che si possa "mangiare" in direzione S, si può fare così:
Non rimane che controllare nelle direzioni N,E,O
Buonanotte

Per controllare che si possa "mangiare" in direzione S, si può fare così:
if (i < r-1) then if ((m[i+1, j] = car) and (m[i+2, j] <> car)) then ...
Non rimane che controllare nelle direzioni N,E,O

Buonanotte
