Minkä nuorena oppii sen vanhana taitaa. Koska joskus 100 vuotta sitten 80-luvulla opiskelin HY:ssa tietojenkäsittelyoppia ja opetuskieli oli Pascal, niin varsin kivuttomasti syntyi peli. Ohjelmassa on sälää, mitä tulen käyttämään kun pelaaja valitsee rivin, minkä ohjelma yrittää sitten arvata - nyt siis vain ohjelma arpoo rivin ja pelaaja yrittää arvata. En kyllä tiedä osaanko sitä vaihtoehtoa ohjelmoida ainakaan kivuttomasti, missä ohjelma yrittää arvata pelaajan valitsemaa riviä, tuntuu hankalalta.
Löytyyköhän bugeja? (varmasti löytyy, koska koodi on MINUN aamuyöllä hätäisesti koodaama)
https://petke.info/mastermind.exe (Windows)
Jos 1.6. avattava ohjelmointikilpailu koskee Mastermind peliä, niin tämä koodi kannattanee ehkä poistaa näytiltä?
Täsä freepascal koodi:
program Mastermind; uses SysUtils; TYPE varit = 1..6; VAR merkki: CHAR; oikearivi, //syotetty tai ohjelman arpoma oikea rivi arvatturivi, //pelaajan arvaama rivi ohjelmanrivi: String; //Ohjelman paattelema rivi rivit: ARRAY [1..999] OF String; // arvatut tai paatellyt rivit. maxlkm 999 mahdollisetrivit: ARRAY [1..1296] OF String; // arvatut tai paatellyt rivit. maxlkm 1296 maxind: 1..999; inforivi: String; inforivit: ARRAY [1..999] OF String; FUNCTION oikeatmerkit(rivi: String): BOOLEAN; //tarkistaa ovatko syotetyt merkit 1,2,3,4,5 tai 6 VAR ovat: BOOLEAN; ind: 1..5; BEGIN ind:=1; ovat:=TRUE; REPEAT IF (copy(rivi,ind,1)<>'1') AND (copy(rivi,ind,1)<>'2') AND (copy(rivi,ind,1)<>'3') AND (copy(rivi,ind,1)<>'4') AND (copy(rivi,ind,1)<>'5') AND (copy(rivi,ind,1)<>'6') THEN BEGIN ovat:=FALSE; WRITELN('Vain merkit 1,2,3,4,5 tai 6 kelpaavat'); END; ind:=ind+1; UNTIL (ovat=FALSE) OR (ind=5); oikeatmerkit:=ovat; END; FUNCTION rivikelpaa(rivi: String): BOOLEAN; VAR kelpaa: BOOLEAN; BEGIN kelpaa:=FALSE; IF (Length(rivi)=4) AND (oikeatmerkit(rivi)=TRUE) THEN kelpaa:=TRUE; IF (Length(rivi)<>4) THEN WRITELN('Syota neljan merkin pituinen merkkijono'); rivikelpaa:=kelpaa; END; PROCEDURE tarkistarivi(rivi1,rivi2: String); //tulostaa 'p' tai 'v' merkkeja. 'p' merkkeja niin paljon kuin on oikeita vareja oikeilla paikoilla //ja 'v' merkkeja niin paljon kuin on oikeita vareja, mutta vaarilla paikoilla. VAR variind1, variind2, ind: 1..4; mrk1,mrk2: String; infoapurivi: ARRAY[1..4] OF Char; kasiteltyjo: ARRAY[1..4] OF BOOLEAN; BEGIN arvatturivi:=rivit[maxind]; inforivi:=''; FOR ind:=1 TO 4 DO BEGIN infoapurivi[ind]:=' '; kasiteltyjo[ind]:=FALSE; END; FOR variind1:=1 TO 4 DO //tarkistetaan oikean variset oikeassa paikkaa IF rivi1[variind1]=rivi2[variind1] THEN BEGIN infoapurivi[variind1]:='p'; kasiteltyjo[variind1]:=TRUE; END; FOR variind1:=1 TO 4 DO //tarkistetaan oikean variset vaarassa paikkaa rivi BEGIN FOR variind2:=1 TO 4 DO BEGIN mrk1:=rivi1[variind1]; mrk2:=rivi2[variind2]; IF (mrk1=mrk2) AND (kasiteltyjo[variind1]=FALSE) THEN BEGIN IF (variind1<>variind2) THEN BEGIN infoapurivi[variind1]:='v'; kasiteltyjo[variind1]:=TRUE; kasiteltyjo[variind2]:=TRUE; END; END; END; END; FOR ind:=1 TO 4 DO IF infoapurivi[ind]='p' THEN inforivi:=inforivi+'p'; FOR ind:=1 TO 4 DO IF infoapurivi[ind]='v' THEN inforivi:=inforivi+'v'; inforivit[maxind]:=inforivi; IF (infoapurivi=' ') THEN WRITELN('Ei mitaan oikein'); IF (infoapurivi<>' ') THEN WRITELN(inforivi); maxind:=maxind+1; END; PROCEDURE pelinvalmistelut; VAR lkm: 0..4; indeksi: 1..4; varit, merkkijono: String; BEGIN WRITELN('Mastermind Pelissa yritetaan arvata toisen pelaajan valitsemaa rivia,'); WRITELN('mika koostuu neljasta kuuden varisesta nappulasta.'); WRITELN('Valitun rivin varit voivat olla mita tahansa kuudesta'); WRITELN('(punainen=1, sininen=2, violetti=3, keltainen=4, vihrea=5 tai turkoosi=6'); WRITELN('Arvaaja laittaa nelja nappulaa pelilaudalle ja saa tiedon, '); WRITELN('monta niista on oikealla paikalla (=p) ja monta on oikeaa varia(=v),'); WRITELN('mutta vaaralla paikalla. Kukin nappula arvioidaan vain kerran.'); WRITELN('Haluatko olla arvaaja vaiko rivin valitsija (jolloin ohjelma yrittaa paatella valitsemaasi rivia)'); WRITELN('Vastaa "a" (=arvaaja) tai "v"=valitsija (TAMA VALINTA EI VIELA TOIMI! VOIT SIIS OLLA VAIN ARVAAJA.'); WRITELN('Syota siis "a")'); REPEAT READLN(merkki); IF (merkki <> 'a') AND (merkki <> 'v') THEN WRITELN('Syota "a" tai "v"'); UNTIL (merkki='a') OR (merkki='v'); IF merkki='a' THEN WRITELN('Syota rivisi eli neljan merkin pituinen merkkijono, missa merkit ovat "1", "2", "3", "4", "5" tai "6"'); rivit[1]:=merkkijono; maxind:=1; //osoittaa taulukon viimeksi laitettuun riviin IF merkki='a' THEN BEGIN Randomize; varit:='123456'; FOR indeksi:=1 TO 4 DO BEGIN oikearivi:=oikearivi+varit[Random(6)+1]; ohjelmanrivi[indeksi]:='?'; END; END; END; PROCEDURE luerivi; //syotat rivin BEGIN REPEAT READLN(arvatturivi); UNTIL rivikelpaa(arvatturivi); END; PROCEDURE arvaarivi; //ohjelma arvaa riviä VAR riviind: 1..999; ind: 1..4; BEGIN FOR riviind:=1 TO maxind DO mahdollisetrivit[riviind]:=' '; FOR ind:=1 TO maxind DO BEGIN WRITELN(inforivit[riviind][ind]); END; END; BEGIN IF merkki='v' THEN BEGIN REPEAT BEGIN tarkistarivi(oikearivi,arvatturivi); arvaarivi; END; UNTIL inforivi='pppp'; END ELSE BEGIN //olet pelaaja eli arvaaja ja syotit 'a':n REPEAT pelinvalmistelut; REPEAT luerivi; tarkistarivi(oikearivi,arvatturivi); UNTIL inforivi='pppp'; WRITELN('Onneksi olkoon! Arvasit rivin! :) Syota "k" jos haluat uuden rivin'); READLN(merkki); UNTIL merkki<>'k'; if merkki='k' THEN WRITELN('Syota rivisi eli neljan merkin pituinen merkkijono, missa merkit ovat "1", "2", "3", "4", "5" tai "6"'); END; END.
Aihe on jo aika vanha, joten et voi enää vastata siihen.