Disposizione random

stellacometa
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

Risposte
vict85
"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


:shock: C'è ancora qualcuno che usa pascal!? Se non stessi studiando ada non sarei neanche stato capace a leggerlo.

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...

vict85
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

stellacometa
Ho già risolto....in pratica mettevo troppi giri inutili...

vict85
"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.

lorven
Il Pascal ... mi riporta indietro nel tempo ... :-)

Anche se stellacometa2003 ha risolto, :D 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.
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.

stellacometa
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!

lorven
"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?

stellacometa
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?

lorven
"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 :oops: e non mi risulta chiaro come il tuo debba funzionare. Scusami se ti pongo altre domande, forse superflue.
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. ...

stellacometa
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...

lorven
"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 :shock: , continuo a non capire. Un solo giocatore, che fa, si mangia da solo? Oppure fugge da se stesso? E le celle, inizialmente vuote, come vengono riempite? Ohibò! :? Forse è meglio che prima tu ipotizzi una soluzione e, se sarò in grado, darò volentieri una mano. :-)

stellacometa
:-D Allora a questo punto do la visuale completa..

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..

:oops: Dai lo so, è un gioco un pò demente, ma inizio dal basso per capire certi meccanismi...

Dai dimmi che lo hai capito ti prego.. :cry:

lorven
Dai, pensavo si capisse... scherzavo! :lol: 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! 8-)
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. :-)

stellacometa
"lorven":
Dai, pensavo si capisse... scherzavo! :lol: 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! 8-)
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.. :smt089 Quanti bei ricordi..Ci stiamo invecchiando... La dovrei avere conservata in quale cd con le atre applicazioni di Vb... Che memoria lorven!!
Cmq, te l'ho mai detto che sei un genio?? :smt024 Ora provo all'istante a fare questo ciclo che mi controlla se ho le pedine adiacenti e posto subito l'esito...

GRAZIEEE :prayer:

stellacometa
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ì:

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!!! :evil:

lorven
"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);

... :evil:

1. Perchè la matrice è passata come costante?
2. Non sempre queste posizioni sono valide!

;-)

stellacometa
MIIIIIIIIIIIIIIIIIII......Ci riuscirò!!!! :axe:

stellacometa
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!!! :evil: :evil: :evil:

lorven
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. ...

:-)

lorven
Non ricevendo notizie da stellacometa2003, do un "aiutino" (piuttosto consistente :-D)
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 :-)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.