» TicTacToe in C

Mehrdimensionale FelderNeuen Thread eröffnenNeue Antwort erstellenHilfe bei Stringanalyse
AutorNachricht
Beobachter 
Anmeldedatum: 15.04.2021
Beiträge: 1
15.04.2021, 14:03
zitieren

Hallo,

ich habe gerade an der FH ein Tic Tac Toe Programmierprojekt. 2 Probleme hätte ich, bei denen ich nicht weiterkomme.

Ich muss einen Spielmodi Spieler vs. Computer programmieren, der Computer soll aber klug vorgehen und nicht per Zufall Felder aussuchen.

Mit dem Minimaxalgorithmus hat das leider nicht so geklappt, denn der Computer nimmt automatisch das Feld, welches ich selber schon gewählt habe und ersetzt sogar mein Feld. Das 2te Problem ist also, dass man einfach schon gewählte Felder überschreiben kann.

Kann mir da wer weiterhelfen? Danke!



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "header.h"

int spielfeldEinfuegen(int spielfeld[9]){

spielfeld[0] = '1';
spielfeld[1] = '2';
spielfeld[2] = '3';
spielfeld[3] = '4';
spielfeld[4] = '5';
spielfeld[5] = '6';
spielfeld[6] = '7';
spielfeld[7] = '8';
spielfeld[8] = '9';

    return 0;
}//spielfeldEinfuegen

//----------------------------------------------------------------------------------------------------------------------------------------------

int spielfeldAnzeigen(int spielfeld[9]){

    printf("\n%c | %c | %c\n", spielfeld[0], spielfeld[1], spielfeld[2]); //oben
    printf("----------\n");
    printf("%c | %c | %c\n", spielfeld[3], spielfeld[4], spielfeld[5]); //mitte
    printf("----------\n");
    printf("%c | %c | %c\n", spielfeld[6], spielfeld[7], spielfeld[8]); //unten

    return 0;
}//spielfeldAnzeigen

//---------------------------------------------------------------------------------------------------------------------------------------------

int spielzug(int *spielzug, int *zug) {

  if(*zug > 0 && *zug < 10){

    if(*spielzug == 1) { //Wenn Spieler 1 am Zug ist
        *spielzug = 2; //zu Spieler 2 wechseln
    }
    else if(*spielzug == 2) { //Wenn Spieler 2 am Zug ist
        *spielzug = 1; //zu Spieler 1 wechseln
    }

  }//if
  return 0;
}//spielzug

//-----------------------------------------------------------------------------------------------------------------------------------------------

int holeZug(int spielfeld[9], int spielzug, int *zug, char spieler1[], char spieler2[]) {

    if(spielzug == 1){ //Wenn Spieler 1 am Zug ist
    spielfeldAnzeigen(spielfeld); //Spielfeld anzeigen
        printf("\n%s, Bitte gebe ein, wo du dein Zeichen setzen willst: \n", spieler1);
        scanf(" %d", zug);//gewählte Stelle
    }
    else if(spielzug == 2){ //Wenn Spieler 2 am Zug ist
    spielfeldAnzeigen(spielfeld); //Spielfeld anzeigen
        printf("\n%s, Bitte gebe ein, wo du dein Zeichen setzen willst: \n", spieler2);
        scanf(" %d", zug); //gewählte Stelle
    }

    return *zug;
}//holeZug

//-----------------------------------------------------------------------------------------------------------------------------------------------

int holeZug2(int spielfeld[9], int spielzug, int *zug, char spieler1[]) {

    if(spielzug == 1){ //Wenn Spieler 1 am Zug ist
    spielfeldAnzeigen(spielfeld); //Spielfeld anzeigen
        printf("\n%s, Bitte gebe ein, wo du dein Zeichen setzen willst: \n", spieler1);
        scanf(" %d", zug);//gewählte Stelle
    }
    else if(spielzug == 2){ //Computer ist dran
    spielfeldAnzeigen(spielfeld); //Spielfeld anzeigen
        printf("\nDer Computer wählt die Spielfläche: \n");
        //scanf(" %d", zug); //gewählte Stelle
        computerMove(spielfeld);
    }

    return *zug;
}//holeZug2

//-----------------------------------------------------------------------------------------------------------------------------------------------------

int holeZug3(int spielfeld[9], int spielzug, int *zug) {

    if(spielzug == 1){ //Wenn Spieler 1 am Zug ist
    spielfeldAnzeigen(spielfeld); //Spielfeld anzeigen
        printf("\nComputer 1 wählt die Spielfläche: \n");
        scanf(" %d", zug);//gewählte Stelle
    }
    else if(spielzug == 2){ //Computer ist dran
    spielfeldAnzeigen(spielfeld); //Spielfeld anzeigen
        printf("\nComputer 2 wählt die Spielfläche: \n");
        scanf(" %d", zug);//gewählte Stelle
    }

    return *zug;
}//holeZug3

int minimax(int spielfeld[9], int computer) {

    //int winner = win(board);
    //if(winner != 0) return winner*player;
    int zug = -1;
    int score = -2;//Losing moves are preferred to no move
    int i;
    for(i = 0; i <= 9; ++i) {//For all moves,
        if(spielfeld[i] == 0) {//If legal
            spielfeld[i] = computer;//Try the move
            int thisScore = -minimax(spielfeld, computer*-1);
            if(thisScore > score) {
                score = thisScore;
                zug = i;
            }//Pick the one that's worst for the opponent
            spielfeld[i] = 0;//Reset board after try
        }
    }
    if(zug == -1) return 0;
    return score;
}

void computerMove(int spielfeld[9]) {
    int zug = -1;
    int score = -2;
    int i;
    for(i = 0; i < 9; ++i) {
        if(spielfeld[i] == 0) {
            spielfeld[i] = 1;
            int tempScore = -minimax(spielfeld, -1);
            spielfeld[i] = 0;
            if(tempScore > score) {
                score = tempScore;
                zug = i;
            }
        }
    }
    //returns a score based on minimax tree at a given node.
    spielfeld[zug] = 1;
}

//-------------------------------------------------------------------------------------------------------------------------------------------------------

int bestaetigeZug(int zug,int spielfeld[9]){

  int i;
  for(i=0;i<10;i++) {
    if (zug < 1 || zug > 9) {
    printf("Bitte geben Sie eine Zahl zwischen 1 und 9 ein.\n");
        return 0;
    }
    else if(spielfeld[zug] !=0) {
    printf("Diese Stelle ist schon besetzt, wähle bitte eine andere aus. \n");
    return 0;
    }
    else
    return 1;
  }
  return 1;
}//bestaetigeZug

//------------------------------------------------------------------------------------------------------------------------------------------------------

int updateSpielfeld(int spielfeld[9], int *zug, int wechsel){
if(((wechsel ==1) || (wechsel ==2)) !=0) {
    if(*zug == 1 && wechsel == 1) //links oben von Spieler 1 gewählt
        spielfeld[0] = 'X'; //setze x auf diese Stelle

    else if(*zug == 1 && wechsel == 2) //links oben von Spieler 2 gewählt
    spielfeld[0] = 'O'; //setze o auf diese Stelle
//---------------------------------------------------------------------------
    else if(*zug == 2 && wechsel == 1) //mitte oben von Spieler 1 gewählt
    spielfeld[1] = 'X'; //setze x auf diese Stelle

    else if(*zug == 2 && wechsel == 2) //mitte oben von Spieler 2 gewählt
    spielfeld[1] = 'O'; ////setze o auf diese Stelle
//-----------------------------------------------------------------------------
    else if(*zug == 3 && wechsel == 1) //rechts oben von Spieler 1 gewählt
    spielfeld[2] = 'X'; //setze x auf diese Stelle

    else if(*zug == 3 && wechsel == 2) //rechts oben von Spieler 2 gewählt
    spielfeld[2] = 'O'; ////setze o auf diese Stelle
//-----------------------------------------------------------------------------
    else if(*zug == 4 && wechsel == 1) //links mitte von Spieler 1 gewählt
    spielfeld[3] = 'X'; //setze x auf diese Stelle

    else if(*zug == 4 && wechsel == 2) //links mitte von Spieler 2 gewählt
    spielfeld[3] = 'O'; ////setze o auf diese Stelle
//----------------------------------------------------------------------------
    else if(*zug == 5 && wechsel == 1) //mitte von Spieler 1 gewählt
    spielfeld[4] = 'X'; //setze x auf diese Stelle

    else if(*zug == 5 && wechsel == 2) //mitte von Spieler 2 gewählt
    spielfeld[4] = 'O'; ////setze o auf diese Stelle
//----------------------------------------------------------------------------
    else if(*zug == 6 && wechsel == 1) //rechts mitte von Spieler 1 gewählt
    spielfeld[5] = 'X'; //setze x auf diese Stelle

    else if(*zug == 6 && wechsel == 2) //rechts mitte von Spieler 2 gewählt
    spielfeld[5] = 'O'; ////setze o auf diese Stelle
//-------------------------------------------------------------------------------
    else if(*zug == 7 && wechsel == 1) //unten links von Spieler 1 gewählt
    spielfeld[6] = 'X'; //setze x auf diese Stelle

    else if(*zug == 7 && wechsel == 2) //unten links von Spieler 2 gewählt
    spielfeld[6] = 'O'; ////setze o auf diese Stelle
//------------------------------------------------------------------------------
    else if(*zug == 8 && wechsel == 1) //unten mitte von Spieler 1 gewählt
    spielfeld[7] = 'X'; //setze x auf diese Stelle

    else if(*zug == 8 && wechsel == 2) //unten mitte von Spieler 2 gewählt
    spielfeld[7] = 'O';////setze o auf diese Stelle
//---------------------------------------------------------------------------------
    else if(*zug == 9 && wechsel == 1) //unten rechts von Spieler 1 gewählt
    spielfeld[8] = 'X'; //setze x auf diese Stelle

    else if(*zug == 9 && wechsel == 2) //unten rechts von Spieler 2 gewählt
    spielfeld[8] = 'O'; ////setze o auf diese Stelle
}
    return 0;
}//updateSpielfeld

//------------------------------------------------------------------------------------------------------------------------------------------------------------------

int gewonnen(int spielfeld[9], int eingaben){

    if(spielfeld[0] == 'X' && spielfeld[1] == 'X' && spielfeld[2] == 'X') { //oben horizontal
        printf("X hat das Spiel gewonnen!\n");
        return 1;
    }
    else if(spielfeld[0] == 'O' && spielfeld[1] == 'O' && spielfeld[2] == 'O') { //oben horizontal
        printf("O hat das Spiel gewonnen!\n");
        return 1;
    }
//---------------------------------------------------------------------------------------------------------------
    else if(spielfeld[3] == 'X' && spielfeld[4] == 'X' && spielfeld[5] == 'X') { //mitte horizontal
        printf("X hat das Spiel gewonnen!\n");
        return 1;
    }
    else if(spielfeld[3] == 'O' && spielfeld[4] == 'O' && spielfeld[5] == 'O') { //mitte horizontal
        printf("O hat das Spiel gewonnen!\n");
        return 1;
    }
//---------------------------------------------------------------------------------------------------------------
    else if(spielfeld[6] == 'X' && spielfeld[7] == 'X' && spielfeld[8] == 'X') { //unten horizontal
        printf("X hat das Spiel gewonnen!\n");
        return 1;
    }
    else if(spielfeld[6] == 'O' && spielfeld[7] == 'O' && spielfeld[8] == 'O') { //unten horizontal
        printf("O hat das Spiel gewonnen!\n");
        return 1;
    }
//---------------------------------------------------------------------------------------------------------------
    else if(spielfeld[0] == 'X' && spielfeld[3] == 'X' && spielfeld[6] == 'X') { //links vertikal
        printf("X hat das Spiel gewonnen!\n");
        return 1;
    }
    else if(spielfeld[0] == 'O' && spielfeld[3] == 'O' && spielfeld[6] == 'O') { //links vertikal
        printf("O hat das Spiel gewonnen!\n");
        return 1;
    }
//---------------------------------------------------------------------------------------------------------------
    else if(spielfeld[1] == 'X' && spielfeld[4] == 'X' && spielfeld[7] == 'X') { //mitte vertikal
        printf("X hat das Spiel gewonnen!\n");
        return 1;
    }
    else if(spielfeld[1] == 'O' && spielfeld[4] == 'O' && spielfeld[7] == 'O') { //mitte vertikal
        printf("O hat das Spiel gewonnen!\n");
        return 1;
    }
//---------------------------------------------------------------------------------------------------------------
    else if(spielfeld[2] == 'X' && spielfeld[5] == 'X' && spielfeld[8] == 'X') { //rechts vertikal
        printf("X hat das Spiel gewonnen!\n");
        return 1;
    }
    else if(spielfeld[2] == 'O' && spielfeld[5] == 'O' && spielfeld[8] == 'O') { //rechts vertikal
        printf("O hat das Spiel gewonnen!\n");
        return 1;
    }
//---------------------------------------------------------------------------------------------------------------------
    else if(spielfeld[0] == 'X' && spielfeld[4] == 'X' && spielfeld[8] == 'X') { //oben links - unten rechts diagonal
        printf("X hat das Spiel gewonnen!\n");
        return 1;
    }
    else if(spielfeld[0] == 'O' && spielfeld[4] == 'O' && spielfeld[8] == 'O') { //oben links - unten rechts diagonal
        printf("O hat das Spiel gewonnen!\n");
        return 1;
    }
//--------------------------------------------------------------------------------------------------------------------------
    else if(spielfeld[2] == 'X' && spielfeld[4] == 'X' && spielfeld[6] == 'X') { //oben rechts - links unten diagonal
        printf("X hat das Spiel gewonnen!\n");
        return 1;
    }
    else if(spielfeld[2] == 'X' && spielfeld[4] == 'X' && spielfeld[6] == 'X') { //oben rechts - links unten diagonal
        printf("X hat das Spiel gewonnen!\n");
        return 1;
    }
//--------------------------------------------------------------------------------------------------------------------------
    else if(eingaben >= 10) //Unentschieden
        printf("\nDas Spiel endet unentschieden, es gibt keinen Gewinner.\n");
    else
        return 0;
    return 0;
}//gewonnen

//--------------------------------------------------------------------------------------------------------------------------------------------------------------

int menu(){
    int wahl = 0; //Status
    printf("Herzlich Willkommen zum Spiel TicTacToe.\n");

    printf("\nBitte gebe für die gewählte Stelle auf dem Spielfeld,\n");
    printf("die entsprechende Zahl ein.\n");

    printf("\nEin Spieler hat gewonnen,wenn er es geschafft hat seine Steine so zu setzen,\n");
    printf("dass er entweder 3 wagerecht, senkrecht oder diagonal in einer Reihe hat.\n");

    printf("\nWie möchtest du spielen?\n");
    printf("\n1. Spieler vs. Spieler\n");
    printf("2. Spieler vs. Computer\n");
    printf("3. Computer vs. Computer\n");

    printf("\nWähle einen Spielmodi: \n");
    scanf(" %d", &wahl);

    switch(wahl){
        case 1: //Spieler vs. Spieler
            return 1;
        case 2: //Spieler vs. Computer
            return 2;
        case 3: //Computer vs. Computer
            return 3;

        default: //bei falscher Eingabe
            printf("Ein Fehler ist aufgetreten, bitte versuchen Sie es nochmal.");
    }//switch

    return 0;
}//menu


pn
Gast 
15.04.2021, 14:03
zitieren

Mach mit!

Wenn Dir die Beiträge zum Thread "TicTacToe in C" gefallen haben oder Du noch Fragen hast oder Ergänzungen machen möchtest, solltest Du Dich gleich bei uns anmelden:



Registrierte Mitglieder genießen die folgenden Vorteile:
✔ kostenlose Mitgliedschaft
keine Werbung
✔ direkter Austausch mit Gleichgesinnten
✔ neue Fragen stellen oder Diskussionen starten
✔ schnelle Hilfe bei Problemen
✔ Bilder und Videos hochladen
✔ und vieles mehr...


Neue Antwort erstellen
© 2004 - 2025 www.programmierer-forum.de | Communities | Impressum |