Oppure

Loading
07/10/11 12:39
luca95
Ciao a tutti ho fatto un programma per giocare a morra cinese e va anche discretamente bene volevo sapere se secondo voi poteva essere applicata qualche miglioria... ovviamente oltre ai disegni delle mani fatti da me fanno un po' schifo ma è il meglio che sono riuscito a fare :) ecco il codice devo dire che è abbastanza lungo se vi servono spiegazioni sulle varie parti ditemelo :)
noterete che il punteggio e la scelta del giocatore e pc è ripetuta nella grafica e a parole è solo per controllo quella a parole andrà eliminata :)

program morra_cinese;
uses crt, graph;
var sc: array [1..3] of char;
var su,risp: char;


procedure inizio;
var Gd,Gm:integer;
Begin
  clrscr;
  randomize;
  DetectGraph(Gd,Gm);
  InitGraph(Gd, Gm, 'C:\PROGRA~1\TP\BGI');
  writeln('programma per giocare a morra cinese contro il pc');
  readkey;
  sc[1]:='S';
  sc[2]:='C';
  sc[3]:='F';
End;

procedure pulisci;
Begin
  (*carta*)
  SetColor(black);
  Line(200,240,240,240);
  Arc(240,235,0,90,5);
  Arc(240,235,360,270,5);
  Line(220,230,255,230);
  Arc(255,225,0,90,5);
  Arc(255,225,360,270,5);
  Line(220,220,270,220);
  Arc(270,215,0,90,5);
  Arc(270,215,360,270,5);
  Line(220,210,270,210);
  Arc(255,205,0,90,5);
  Arc(255,205,360,270,5);
  Line(220,200,255,200);
  Arc(230,195,0,90,5);
  Arc(230,195,360,270,5);
  Line(200,190,230,190);

  (*forbici*)
  Line(200,240,240,240);
  Arc(240,235,0,90,5);
  Arc(240,235,360,270,5);
  Line(220,230,240,230);
  Arc(240,225,360,270,5);
  Line(220,220,260,225);
  Arc(260,220,0,81,5);
  Arc(260,220,360,261,5);
  Line(220,210,260,215);
  Arc(255,205,0,90,5);
  Arc(255,205,360,270,5);
  Line(220,200,255,200);
  Line(220,210,255,210);
  Arc(230,195,0,90,5);
  Line(235,195,235,200);
  Line(200,190,230,190);

  (*sasso*)
  Line(200,240,240,240);
  Arc(240,235,0,90,5);
  Arc(240,235,360,270,5);
  Line(220,230,240,230);
  Arc(240,225,0,90,5);
  Arc(240,225,360,270,5);
  Line(220,220,240,220);
  Arc(240,215,0,90,5);
  Arc(240,215,360,270,5);
  Line(220,210,240,210);
  Arc(240,205,0,90,5);
  Arc(240,205,360,270,5);
  Line(220,200,240,200);
  Arc(230,195,0,90,5);
  Line(235,195,235,200);
  Line(200,190,230,190);

  (*forbici pc*)
  (*pollice*)
  Arc(330,195,180,90,5);
  Line(325,195,325,200);
  Line(330,190,360,190);
  (*indice*)
  Line(305,200,335,200);
  Arc(305,205,90,270,5);
  Line(305,210,335,210);
  (*medio*)
  Line(335,210,295,215);
  Arc(295,220,99,279,5);
  Line(295,225,335,220);
  (*annulare*)
  Line(315,230,335,230);
  Arc(315,225,270,180,5);
  (*mignolo*)
  Line(315,240,360,240);
  Arc(315,235,90,270,5);

  (*carta pc*)
  (*pollice*)
  Arc(340,195,270,90,5);
  Line(340,190,370,190);
  (*indice*)
  Line(315,200,350,200);
  Arc(315,205,90,270,5);
  (*medio*)
  Line(300,210,350,210);
  Arc(300,215,90,270,5);
  Line(300,220,350,220);
  (*annulare*)
  Arc(315,225,90,270,5);
  Line(315,230,350,230);
  (*mignolo*)
  Arc(340,235,90,270,5);
  Line(340,240,370,240);

  (*sasso pc*)
  (*pollice*)
  Line(330,190,360,190);
  Line(325,195,325,200);
  Arc(330,195,90,180,5);
  (*indice*)
  Line(320,200,340,200);
  Arc(320,205,90,270,5);
  (*medio*)
  Line(320,210,340,210);
  Arc(320,215,90,270,5);
  (*annulare*)
  Line(320,220,340,220);
  Arc(320,225,90,270,5);
  (*mignolo*)
  Line(320,230,340,230);
  Arc(320,235,90,270,5);
  Line(320,240,360,240);
End;

procedure gioco;
var a,b,pupc,puut: byte;
var stut,stpc: shortstring;
Begin
  clrscr;
  writeln('il primo che tra te e pc raggiunge le 3 vittorie vince');
  writeln('quando ti sarà richisesto dovrai inserire S per sasso C per carta F per forbici e la scelta del computer sarà estratta casualmente');
  readkey;
  puut:=0;
  pupc:=0;
  SetColor(white);
  Line(0,20,80,20);
  Line(40,0,40,100);
  OutTextXY(20,10,'TU');
  OutTextXY(60,10,'PC');
  str(pupc,stpc);
  str(puut,stut);
  OutTextXY(20,30,stut);
  OutTextXY(60,30,stpc);
  repeat
    clrscr;
    repeat
      writeln('inserisci S o C o F');
      readln(su);
    until (upcase(su)='S') or (upcase(su)='C') or (upcase(su)='F');
    if upcase(su)='S' then
      Begin
        b:=1;
        SetColor(white);
        Line(200,240,240,240);
        Arc(240,235,0,90,5);
        Arc(240,235,360,270,5);
        Line(220,230,240,230);
        Arc(240,225,0,90,5);
        Arc(240,225,360,270,5);
        Line(220,220,240,220);
        Arc(240,215,0,90,5);
        Arc(240,215,360,270,5);
        Line(220,210,240,210);
        Arc(240,205,0,90,5);
        Arc(240,205,360,270,5);
        Line(220,200,240,200);
        Arc(230,195,0,90,5);
        Line(235,195,235,200);
        Line(200,190,230,190);
        readkey;
      End;
    if upcase(su)='C' then
      Begin
        b:=2;
        SetColor(white);
        Line(200,240,240,240);
        Arc(240,235,0,90,5);
        Arc(240,235,360,270,5);
        Line(220,230,255,230);
        Arc(255,225,0,90,5);
        Arc(255,225,360,270,5);
        Line(220,220,270,220);
        Arc(270,215,0,90,5);
        Arc(270,215,360,270,5);
        Line(220,210,270,210);
        Arc(255,205,0,90,5);
        Arc(255,205,260,270,5);
        Line(220,200,255,200);
        Arc(230,195,0,90,5);
        Arc(230,195,360,270,5);
        Line(200,190,230,190);
        readkey;
      End;
    if upcase(su)='F' then
      Begin
        b:=3;
        SetColor(white);
        Line(200,240,240,240);
        Arc(240,235,0,90,5);
        Arc(240,235,360,270,5);
        Line(220,230,240,230);
        Arc(240,225,360,270,5);
        Line(220,220,260,225);
        Arc(260,220,0,81,5);
        Arc(260,220,360,261,5);
        Line(220,210,260,215);
        Arc(255,205,0,90,5);
        Arc(255,205,360,270,5);
        Line(220,200,255,200);
        Line(220,210,255,210);
        Arc(230,195,0,90,5);
        Line(235,195,235,200);
        Line(200,190,230,190);
        readkey;
      End;
    a:=random(3)+1;
      if a=1 then
        Begin
          SetColor(white);
          (*sasso pc*)
          (*pollice*)
          Line(330,190,360,190);
          Line(325,195,325,200);
          Arc(330,195,90,180,5);
          (*indice*)
          Line(320,200,340,200);
          Arc(320,205,90,270,5);
          (*medio*)
          Line(320,210,340,210);
          Arc(320,215,90,270,5);
          (*annulare*)
          Line(320,220,340,220);
          Arc(320,225,90,270,5);
          (*mignolo*)
          Line(320,230,340,230);
          Arc(320,235,90,270,5);
          Line(320,240,360,240);
          readkey;
          readkey;
        End
             else
      if a=2 then
        Begin
          SetColor(white);
          (*carta pc*)
          (*pollice*)
          Arc(340,195,270,90,5);
          Line(340,190,370,190);
          (*indice*)
          Line(315,200,350,200);
          Arc(315,205,90,270,5);
          (*medio*)
          Line(300,210,350,210);
          Arc(300,215,90,270,5);
          Line(300,220,350,220);
          (*annulare*)
          Arc(315,225,90,270,5);
          Line(315,230,350,230);
          (*mignolo*)
          Arc(340,235,90,270,5);
          Line(340,240,370,240);
          readkey;
          readkey;
        End
             else
      if a=3 then
        Begin
          SetColor(white);
          (*pollice*)
          Arc(330,195,180,90,5);
          Line(325,195,325,200);
          Line(330,190,360,190);
          (*indice*)
          Line(305,200,335,200);
          Arc(305,205,90,270,5);
          Line(305,210,335,210);
          (*medio*)
          Line(335,210,295,215);
          Arc(295,220,99,279,5);
          Line(295,225,335,220);
          (*annulare*)
          Line(315,230,335,230);
          Arc(315,225,270,180,5);
          (*mignolo*)
          Line(315,240,360,240);
          Arc(315,235,90,270,5);
          readkey;
          readkey;
        End;
    clrscr;
    writeln('tu hai giocato [',su,'] e il pc [',sc[a],']');
    if a=b then
      Begin
        writeln('Pareggio');
        pulisci;
      End
           else
    if (a=1) and (b=2) then
      Begin
        writeln('Hai vinto');
        SetColor(black);
        OutTextXY(20,30,stut);
        puut:=puut+1;
        str(puut,stut);
        SetColor(white);
        OutTextXY(20,30,stut);
        pulisci;
      End
                       else
    if (a=1) and (b=3) then
      Begin
        writeln('Hai perso');
        SetColor(black);
        OutTextXY(60,30,stpc);
        pupc:=pupc+1;
        str(pupc,stpc);
        SetColor(white);
        OutTextXY(60,30,stpc);
        pulisci;
      End
                       else
    if (a=2) and (b=3) then
      Begin
        writeln('Hai vinto');
        SetColor(black);
        OutTextXY(20,30,stut);
        puut:=puut+1;
        str(puut,stut);
        SetColor(white);
        OutTextXY(20,30,stut);
        pulisci;
      End
                       else
    if (a=2) and (b=1) then
      Begin
        writeln('Hai perso');
        SetColor(black);
        OutTextXY(60,30,stpc);
        pupc:=pupc+1;
        str(pupc,stpc);
        SetColor(white);
        OutTextXY(60,30,stpc);
        pulisci;
      End
                       else
    if (a=3) and (b=1) then
      Begin
        writeln('Hai vinto');
        SetColor(black);
        OutTextXY(20,30,stut);
        puut:=puut+1;
        str(puut,stut);
        SetColor(white);
        OutTextXY(20,30,stut);
        pulisci;
      End
                       else
    if (a=3) and (b=2) then
      Begin
        writeln('Hai perso');
        SetColor(black);
        OutTextXY(60,30,stpc);
        pupc:=pupc+1;
        str(pupc,stpc);
        SetColor(white);
        OutTextXY(60,30,stpc);
        pulisci;
      End;
    writeln('il punteggio attuale è di: ');
    writeln('PC     TU');
    writeln(' ',pupc,'     ',puut);
    readkey;
    readkey;
  until (puut=3) or (pupc=3);
  if puut=3 then
    Begin
    writeln('hai vinto');
    SetColor(black);
    str(puut,stut);
    str(pupc,stpc);
    OutTextXY(20,30,stut);
    OutTextXY(60,30,stpc);
    End
            else
    writeln('hai perso');
    SetColor(black);
    str(puut,stut);
    str(pupc,stpc);
    OutTextXY(20,30,stut);
    OutTextXY(60,30,stpc);
End;

Begin
  inizio;
  repeat
    gioco;
    readkey;
    writeln('vuoi rigiocare?');
    readln(risp);
  until upcase(risp)='N';
  closegraph;
End.
Ultima modifica effettuata da luca95 07/10/11 12:46
aaa
07/10/11 13:25
Loryea
Lo potresti allegare in formato -.zip al prossimo post?
aaa
07/10/11 13:26
Goblin
Prima miglioria da applicare:
Cancella tutte le linee di codice doppio !!
Non è possibile che nel caso tu debba modificare il mignolo di una tua immagine devi andarlo a cercare in 2-3 posti diversi del sorgente, oppure nel check del risultato hai codice duplicato e inutile

Seconda miglioria da applicare:
Usa delle costanti e tipi il sorgente resta più leggibile:
es:
tpPunto = (tpCarta, tpForbici, tpSasso);
CS_CARTA='S';
....

Usa delle variabili "parlanti" a,b ?? cosa sono ???

Il tutto ovviamente è un parere personale...
G.

Ibis redibis non morieris in bello
07/10/11 18:33
luca95
ok grazie goblin ci provo e loryea cosa te ne fai di un file zip il codice è li mi servono dei consigli...
aaa
07/10/11 19:13
Loryea
Bado all'aspetto estetico del programma, quindi lo volevo scaricare con un IDE e vederlo. Ma comunque sono riuscito a copiare il tuo codice e a incollarlo sul mio IDE ed ecco i miei due suggerimenti:

Iniziare con il titolo del gioco, non con "questo é un..."

Hai scritto "...quando ti sarò..." ansiché "...quando ti sarai..." nella parte introduttiva.

Ti consiglio di aprire la grafica solo dopo la parte introduttiva e, se ci metti un po' di impegno per fare una cosa un po' più figia, di aprire e chiudere la grafica automaticamente con
Gd:=detect; Initgraph(GD,GM,'C: bla,bla,bla');
e
Closegraph
.

Riguardo ai disegni, non per fare il precisino, senza offesa, già così vanno benissimo, giusto per migliorarli un po':

Accorciare di qualche pixel il medio quando il giocatore o il pc usa Carta.

Accorciare l'anulare e il mignolo di qualche pixel in Forbici (il medio é fantastico però, complimenti!)

Accorcire tutte le dita nel sasso.

In generale, sempre se hai tempo, ti consiglio di fare unghie e prosecuzione del polso.



Spero di esserti stato utile.

aaa