Turbo Pascal Programm schreiben


  • fenchelT
  • 1986 Aufrufe 21 Antworten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Turbo Pascal Programm schreiben

    hallo, ich muss in der schule das spiel 4 Gewinnt in turbo pascal programmieren. kriegs aber nicht so gebacken.
    kann mir das vllt. einer machen? ich brauchs im grafik- und im textmodus.

    die einzigen bedingungen sind:
    - Feld von 13x13
    - 2 Spieler

    vielen vielen dank...
  • Gefunden bei google.de

    Einfach mal nen bisschen bei google.de suchen.

    Hab schon alles gefunden.

    Vier Gewinnt mit eigenem Schrifttyp und eigener Grafikengine.

    Vier Gewinnt ---> [URL=http://www.webplain.de/foren/file.php?1,file=513]Spiel[/URL]
    Vier Gewinnt ---> [URL=http://www.webplain.de/foren/file.php?1,file=514]Grafikroutine[/URL]
    Vier Gewinnt ---> [URL=http://www.webplain.de/foren/file.php?1,file=515]Schrifttyp[/URL]


    Ich hoffe, dass dich das etwas weiterbringt. :D

    Falls nicht, müsstest du mir Bescheid geben, dann suche ich noch weiter. :read: :read: :read:
  • lol nur weil ihr die vorgänge noch nicht hattet
    heisst das nicht, dass du die nicht kannst
    es gibt auch leute die noch nie info gehabt haben und coden können
    wenn man alles was man im leben kann in der schule gelernt haben müsste
    möchte ich nicht auf der welt sein



    MfG Artemis
  • Habt ihr im ersten Lernjahr denn schon im Grafikmodus gearbeitet.

    Also ich habe z.B. mit dem Roboterprogramm Niki angefangen. *ja das waren noch Zeiten*


    Was hast du denn schon alles kennengelernt ?

    Prozeduren und Funktionen ?
    Schleifen (abweisende und nicht abweisende) ?
    Rekursive Schleifen ?
    Parameterübergabe (Call by Value, Call by Reference, Call by Value and Result) ?
    Zählschleifen
    Logische Operatoren
    Welche Datentypen (Boolean, Char, String[], Integer, longint, real) ?
    Typdeklaration ?
    Konstantendeklaration ?


    Du siehst; wenn du nur die Dinge anwenden willst, die du im Unterricht schon hattest, dann musst du hier erst posten, welche Sachen das sind.

    Dann kann ich / können wir (FSB) dir helfen ! :D
  • Datentypen: Boolean, Char, String[], Integer, longint, real (eigentlich alle) JA
    Typdeklaration JA
    Konstantendeklaration JA
    Prozeduren JA und Funktionen NEIN
    Schleifen (abweisende und nicht abweisende) JA
    Rekursive Schleifen JA
    Parameterübergabe (Call by Value, Call by Reference, Call by Value and Result) ? NEIN
    Zählschleifen (wenn so etwas ist wie von i:=0 to 25 do) dann JA, ansonsten NEIN
    Logische Operatoren JA
  • Ohne Parameterübergabe lässt sich kein sicheres Programm entwickeln, da man in den Prozeduren nur auf globale Variablen zugreifen könnte.

    Dieses wiederum ist nicht empfehlenswert und kann öfters zum Absturz des Editors oder gar des Computers führen.

    Ich glaube ernsthaft nicht, dass sich ein Game, an dem zwei Spieler teilnehmen, ohne Parameterübergabe programmieren lässt.

    Das erscheint mir schier unmöglich !!!
  • So schwer ist das gar nicht. Es ist bei mir eine Weile her, also verzeihe mir bitte wenn die Begriff/Variablen etc nicht stimmen.

    Mach es so: Erselle einen 1-13,1-13 Array mit Integer (oder byte),dessen werte auf 0 gesetzt sind für das Spielfeld.

    Dann erstelle die Prozedur "zeichne Feld", in mittels 2 Counterschleifen (x und y =1-13) das Feld druchlaufen wird, ist der Wert x,y = 0 machst du nichts, bei 1 -> "O" bei 2 -> "X". CASE Block

    Drumherum leg dann bei Bedarf einen "kasten aus "-" und "|" bzw. diesen hübschen Doppeldrändern (findest du auf einer Askitabelle, glaub irgendwo um die 160-190)

    Dann erstelle die Prozedur "zug" dieser übergibst du beim Aufruf welcher Spieler gerade dran ist.
    Hier soll der Spieler eine Zahl auswählen (1-13) dann setzt das Array x auf diese Zahl und geht Y durch bis es eine "besetzte" (/=0) Stelle findet (per Counterschleife) und setzt dann den Wert dieser Stelle-1 (oder +1 je nachdem wie rum das Feld aufgebaut wird) auf die übergeben Spielerzahl (d.h. 1 oder 2). Vor setzten wird noch geguckt ob die Zahl 14 oder 0 ist, falls ja wird der Zug abgelehnt.

    Dann shreibst du die Funktion Spiefeldvoll (die false ist), sie geht die "oberen" reihe des Arrays durch, sind die alle ungleich 0, dann ist das Feld voll (alle Felder der oberen Reihe gehören einem Spieler) und das Spiel wird beendet (die Funktion auf true gesetzt).

    Dann noch die Prozedur Spielerauswahl in der der Spieler aufgeben oder ziehen soll, bei Aufgehen "Ende", bei ziehen "zug".

    Dann schreibst du so etwas wie

    Start (spieler name usw angeben)
    setze spielerderdranist=1
    REPEAT
    zeichne Feld
    Spielerauswahl (diese ruft zug auf)
    Siegcheck
    Spielfeldeldvoll
    IF feldvoll=false and siegcheck=false and aufgeben=false (wenn das spiel also weitergeht)
    THEN BEGIN
    IF spieler=1 then set spieler ->2
    IF spieler=2 then set spieler ->1
    END (damit der nächste spieler dran ist)
    UNTIL feldvoll=true OR siegcheck=true OR aufgeben = true (beendet in einem der 3 mögliche fälle)
    IF Feldvoll
    THEN
    write Das Feld ist voll, keiner konnte gewinnen
    IF Siegcheck=true
    write Spieler Nr (name von (spielerderdranist)) hat gewonnen
    IF aufgeben=true
    write Spieler Nr. (name von (spielerderdranist)) hat aufgegeben

    Was dann bleibt ist noch die checksieg

    Die wird aufwenig du könntest erst einfach "von oben nach unten" und von "links nach recht" vorgehen.
    ERstmal ist die Funtkion false, findet sie eine Reihe wird sie true und beendet
    - Also erst mal die Y reihen durchgehen d.h. einen y Counter in dem der x Counter läuft. Checken ob Feld 1 dem gerade setztendem Spieler (variable übergeben) gehört, falls ja erhöhe "countermerke" um 1 (der wird bie jeder neuen Reihe auf 0 gesetzt (immer wenn y sich ändert), wenn es ihm nicht ist (/= Spielerzahl) setze "countermerke" auf 0, dann wird Feld 2 geprüft (ist es im +1, ist es ihm nicht -> 0) hat er 4 in einer Reihe ist der "countermerke" 4, per Abbruchsbefehl aus den Schleife raus & Funktion auf True
    - Das drehst du dann noch für von "oben nach unten um"
    - das ganze dann noch mit x konst und eben y durchzählen (alle von oben nach unten abhacken)
    - So die diagonalen kannst du machen indem du das Feld (Array) zerlegst und jede mögliche Diagonale wie eine Reihe behandelst und dann auch durchgehst, das werden zwar dann viele reihen, aber damit kommst du wohin du willst.


    Hmm eine elegantere Lösung müsste ich mir länger ausdenken, TP 7 ist aber leider schon lange her^^, außerdem wolltest du es ja aus einfachen Befehlen

    "Darüber schreibst du dann noch einen Grafikmodus (Text X eine Funktion machen die aus den Arraywerten Koordinaeten ermittelt (etwas alla gotoxy wert+counterx*z, wert+countery*z) und dann ein x malt, ich kenne die Befehle nicht auswendig, ist aber doch etwas mit "Line", oder?), Wichtig ist: Du kannst das mit Linienbefehlen machen, sieht zwar nicht so doll aus, erfüllt aber den Zweck.
  • Also. Ich habe TP 7 nicht mehr, aber versuchen könnte ich es.... nur habe ich nicht so viel Zeit..

    /edit ich habe tp7 doch noch^^, kann ich das in einem fesnter starten, so das ich nebenbei tv gucken kann? bis wann brauchst du das?
  • - Die Grafikbefehle kann ich nicht mehr und da habe ich auch nicht wirklich Zeit zu um mir die durchzulesen, aber über die Textmaske eine Graphik zu legen schafst du doch, oder?

    - Außerdem müsstest du noch einige Testspiele machen, dazu habe ich auch kaum Zeit, ich mache zwar zu jeder Zeile auch immer ein paar Tests, aber ob nachher wirklich überall klappt musst du selbst rausfinden...

    - Ich habe bis jetzt nur mit Prozeduren, Counter, CASE, IF, REPEAT UNTIL String, byte, integer, boolean, Char und ARRAY geabreitet. Das sieht nicht immer gut aus und ist manchmal etwas umständlich, aber ich hoffe ich erfülle dir so den Wunsch es aus möglichst einfachen Befehlen zu bauen.

    Status

    /Edit:

    Also ich bin jetzt fast fertig, muss nur noch die Diagonalen abchecken ;).
  • Ich bin fertig, wie willst du es haben? Soll ich es hier einfach posten und du Kopierst es in eine txt rüber (die du dann .pas nennst?)

    /Edit

    Ich poste es einfach hier, is ja mein Werk und damit erlaubt, oder? ;) Ich muss nämlich off und puck8 wollte es ja möglichst bald

    Die Leerzeichen vor Begin/End geht dann leider kaputt, aber die übersicht kannst du dir ja wieder rein machen.

    PROGRAM viergewinnt;

    USES
    crt;

    VAR
    c1,c2,c3:integer;
    gewonnen,aufgegeben,feldvoll:boolean;
    name : ARRAY [1..2] OF string;
    feld : ARRAY [1..13,1..13] OF byte;
    aktiverspieler: byte;
    wahl:char;

    PROCEDURE Initalisierung;

    BEGIN
    clrscr;
    FOR c1:=1 TO 13 DO
    BEGIN
    FOR c2:=1 TO 13 DO
    BEGIN
    feld[c1,c2]:=0;
    END;
    END;
    writeln;
    FOR c1:=1 TO 2 DO
    BEGIN
    write('Wie lautet der Name von Spieler ',c1,'? : ');readln(name[c1]);
    END;
    aktiverspieler:=1;
    END;

    PROCEDURE zeigefeld;

    BEGIN
    FOR c1:=1 TO 13 DO
    BEGIN
    FOR c2:=1 TO 13 DO
    BEGIN
    gotoxy(2+c1*2,2+c2*2);
    CASE feld[c1,14-c2] OF
    1: BEGIN
    textcolor(red);write('X');
    END;
    2: BEGIN
    textcolor(blue);write('0');
    END;
    END;
    END;
    END;
    textcolor(white);
    FOR c1:=1 TO 13+1 DO
    BEGIN
    FOR c2:=1 TO 13+1 DO
    BEGIN
    gotoxy(1+c1*2,1+c2*2);
    write('+');
    END;
    END;
    END;

    PROCEDURE zug;

    VAR wahl : string;
    wahlzahl: byte;
    gesetzt,feldfrei: boolean;

    BEGIN
    REPEAT
    CASE aktiverspieler OF
    1:textcolor(red);
    2:textcolor(blue);
    END;
    gotoxy(10,32);write(Name[aktiverspieler]);
    textcolor(white);
    write(' ist am Zug..............................');
    gotoxy(10,34);write('Geben sie die Reihe an in die sie ablegen m”chten (1-13):............');
    gotoxy(10,36);write('Um aufzugeben, gegeben sie A ein.');
    gotoxy(68,34);
    readln(wahl);
    wahlzahl:=0;
    feldfrei:=false;
    IF wahl='1' THEN wahlzahl:=1;
    IF wahl='2' THEN wahlzahl:=2;
    IF wahl='3' THEN wahlzahl:=3;
    IF wahl='4' THEN wahlzahl:=4;
    IF wahl='5' THEN wahlzahl:=5;
    IF wahl='6' THEN wahlzahl:=6;
    IF wahl='7' THEN wahlzahl:=7;
    IF wahl='8' THEN wahlzahl:=8;
    IF wahl='9' THEN wahlzahl:=9;
    IF wahl='10' THEN wahlzahl:=10;
    IF wahl='11' THEN wahlzahl:=11;
    IF wahl='12' THEN wahlzahl:=12;
    IF wahl='13' THEN wahlzahl:=13;
    IF wahl='A' THEN aufgegeben:=true;
    IF ((wahlzahl<>0) AND (aufgegeben=false))
    THEN BEGIN
    IF Feld[wahlzahl,13]<>0
    THEN BEGIN
    gotoxy(10,40);write('Die Reihe ist voll');
    delay(750);
    gotoxy(10,40);write('................. ');
    END
    ELSE BEGIN
    feldfrei:=true;
    END;
    END;
    IF ((wahlzzahl=0) AND (aufgegeben=false))
    THEN BEGIN
    gotoxy(10,40);write('Ungültige Eingabe');
    delay(750);
    gotoxy(10,40);write('................. ');
    END;
    UNTIL (feldfrei=true) OR (aufgegeben=true);
    IF aufgegeben=false
    THEN BEGIN
    c1:=14;
    gesetzt:=false;
    REPEAT
    dec(c1);
    IF ((feld[wahlzahl,c1]<>0) OR (c1=0))
    THEN BEGIN
    feld[wahlzahl,c1+1]:=aktiverspieler;
    gesetzt:=true;
    END;
    UNTIL gesetzt=true;
    END;
    END;

    PROCEDURE siegcheck;

    VAR merke:byte;

    BEGIN
    gewonnen:=false;
    FOR c1:=1 TO 13 DO
    BEGIN
    merke:=0;
    FOR c2:=1 TO 13 DO
    BEGIN
    IF gewonnen=false
    THEN BEGIN
    IF Feld[c1,c2]=aktiverspieler
    THEN
    inc(merke)
    ELSE
    merke:=0;
    IF merke=4
    THEN BEGIN
    gewonnen:=true;
    END;
    END;
    END;
    END;
    FOR c2:=1 TO 13 DO
    BEGIN
    merke:=0;
    FOR c1:=1 TO 13 DO
    BEGIN
    IF gewonnen=false
    THEN BEGIN
    IF Feld[c1,c2]=aktiverspieler
    THEN
    inc(merke)
    ELSE
    merke:=0;
    IF merke=4
    THEN BEGIN
    gewonnen:=true;
    END;
    END;
    END;
    END;
    FOR c1:=1 TO 13 DO
    BEGIN
    merke:=0;
    c2:=c1;
    c3:=1;
    REPEAT
    IF gewonnen=false
    THEN BEGIN
    IF feld[c2,c3]=aktiverspieler
    THEN
    inc(merke)
    ELSE
    merke:=0;
    IF merke=4
    THEN BEGIN
    gewonnen:=true;
    END;
    END;
    inc(c2);
    inc(c3);
    UNTIL ((c2>13) OR (c3>13));
    END;
    FOR c1:=1 TO 13 DO
    BEGIN
    merke:=0;
    c2:=1;
    c3:=c1;
    REPEAT
    IF gewonnen=false
    THEN BEGIN
    IF feld[c2,c3]=aktiverspieler
    THEN
    inc(merke)
    ELSE
    merke:=0;
    IF merke=4
    THEN BEGIN
    gewonnen:=true;
    END;
    END;
    inc(c2);
    inc(c3);
    UNTIL ((c2>13) OR (c3>13));
    END;
    FOR c1:=1 TO 13 DO
    BEGIN
    merke:=0;
    c2:=c1;
    c3:=1;
    REPEAT
    IF gewonnen=false
    THEN BEGIN
    IF feld[c2,c3]=aktiverspieler
    THEN
    inc(merke)
    ELSE
    merke:=0;
    IF merke=4
    THEN BEGIN
    gewonnen:=true;
    END;
    END;
    dec(c2);
    inc(c3);
    UNTIL ((c2=0) OR (c3>13));
    END;
    FOR c1:=1 TO 13 DO
    BEGIN
    merke:=0;
    c2:=1;
    c3:=c1;
    REPEAT
    IF gewonnen=false
    THEN BEGIN
    IF feld[c2,c3]=aktiverspieler
    THEN
    inc(merke)
    ELSE
    merke:=0;
    IF merke=4
    THEN BEGIN
    gewonnen:=true;
    END;
    END;
    inc(c2);
    dec(c3);
    UNTIL ((c2>13) OR (c3=0));
    END;
    END;

    PROCEDURE feldvollcheck;

    VAR vollereihen:byte;

    BEGIN
    vollereihen:=0;
    FOR c1:=1 TO 13 DO
    BEGIN
    IF Feld[c1,13]<>0
    THEN inc(vollereihen)
    END;
    IF vollereihen=13
    THEN feldvoll:=true;
    END;

    BEGIN
    textcolor(white);
    clrscr;
    nosound;
    writeln;
    writeln('Willkommen zu 4 gewinnt!');
    writeln;
    write('Taste drcken zum starten...');
    readkey;
    initalisierung;
    clrscr;
    REPEAT
    zeigefeld;
    zug;
    IF aufgegeben=false
    THEN BEGIN
    siegcheck;
    IF (gewonnen=false)
    THEN BEGIN
    feldvollcheck;
    IF feldvoll=false
    THEN BEGIN
    IF aktiverspieler=1
    THEN
    aktiverspieler:=2
    ELSE
    aktiverspieler:=1;
    END;
    END;
    END;
    UNTIL (gewonnen=true) OR (aufgegeben=true) OR (feldvoll=true);
    zeigefeld;
    gotoxy(10,38);
    CASE aktiverspieler OF
    1:textcolor(red);
    2:textcolor(blue);
    END;
    IF gewonnen=true
    THEN BEGIN
    write(Name[aktiverspieler]);textcolor(white);write(' hat gewonnen!.....................................................');
    END;
    IF aufgegeben=true
    THEN BEGIN
    write(Name[aktiverspieler]);textcolor(white);write(' hat aufgegeben!...............................................');
    END;
    textcolor(white);
    IF feldvoll=true
    THEN BEGIN
    write('Keine m”gliche Zgen, das Spiel endet unentschieden....................................');
    END;
    gotoxy(10,40);write('Taste drcken zum Beenden..................................');
    readkey;
    END.


    (Die unnötigen Begin/End sind noch aus der Fehlerkorrektur, da war ich zu faul die zu löschen... naja so sauber ist der Code nicht, aber er sollte seinen Zweck erfüllen.)

    Du solltest hinter ausgaben wie "Keine möglichen Züge" noch ein paar leerzeichen machen, dann sieht das optisch besser aus, da die vorherigen Eingaben überschrieben werden, habe es hier mal mit ... markiert, die werden leider beim eingeben ins Board rausgeworfen (die Leerzeichen)., mach aus vielen ... einfach Leerzeichen.)

    Bitte meldet euch wenn da Fehler drin sind!

    Ich sehe auch gerade, dass die Umlaute nicht richtig sind...
  • oh man vielen dank, aber ich hab schon wieder n neues problem, ich kann es nicht testen, weil ich zu hause kein turbo pascal habe. eigentlich hatte ich es auf ner cd, aber naja jetzt frage ich mich wo diese cd wohl ist...
    kannst du mir vllt. die deutsche version 7 irgendwie zukommen lassen?
    wäre sehr nett, aber ich guck auch nochmal nach der cd...

    //edit: hab noch n paar schönheitsfehler ausgemerzt und das feld a bissel verändert, aber sonst bin ich glücklich vielen dank nochmal...

    eine frage noch, du hast doch beim eintippen if wahl:='1' then wahlzahl:=1; zum beispiel,
    wie sage ich ihm, dass wenn er eine zahl größer als 13 eingibt, dass das dann außerhalb des feldes ist. habs probiert mit if wahl:=>13 then write('Außerhalb des Feldes!'); aber das klappt net...

    wenn du dir ansehen willst, was ich verändert habe kann ich dir die datei schicken per e-mail...
  • Du musst an der Wahlfunktion nichts mehr ändern, nur wenn A oder eine Zahl von 1-13 angegeben werden, macht das Programm weiter, ansonsten musst du was neues eintippen, am besten du lässt das Program erstmal durchlaufen, dann siehst du dass ich alle möglichen eingabe Fälle abgedeckt habe ;)

    /Edit

    Achsooo meintest du das, okay ich habe es rein editiert.

    @ Turbopascal: hast Post.. (in ca. 5 Minuten^^)