ich habe ein kleines Übungsprogramm geschrieben. Funktioniert alles wunderbar und genau so wie ich es mir vorgestellt habe. Allerdings habe ich das Programm unter Windows mit Code::Blocks geschrieben.
Nun wollte ich es auf meinem Mac mit xCode ebenfalls erstellen. Allerdings gab es dabei Probleme und 'Build failed'.
Ich wusste, dass ich Dinge in meinem Code verwendet habe, die nicht 1:1 auf OS X übertragbar sind. Ich hatte da allerdings mit anderen Meldungen gerechnet, mit denen ich selbst mehr anfangen kann..
Vielleicht könnt ihr mir helfen, dass mein kleines Programm auch unter OS X läuft (bzw. mit kleinen Änderungen läuft)
Programmcode:
Code: Alles auswählen
#include <stdio.h>
#include <stdlib.h>
#include <curses.h>
//> Unter Windows "cls", unter Unix "clear"
#define CLEAR "clear"
#define POS_MARKER '.'
#define P1_MARKER 'X'
#define P2_MARKER 'O'
//>globale Variablen
char feld[4][4];
int posX=1, posY=1, akt_spieler=1, gewinner=0;
//> setzt alle Variablen auf den Startwert zur¸ck und lˆscht die Konsole
void reset()
{
posX=1;
posY=1;
akt_spieler=1;
gewinner=0;
int x,y;
for(x=0; x<=4;x++){
for(y=0; y<=4; y++){
feld[x][y]=' ';
}
}
system(CLEAR);
}
//>Schreibt das Spielfeld neu
void print_feld()
{
int x,y;
for(x=0; x<=4;x++){
for(y=0; y<=4; y++){
printf("%c\t", feld[x][y]);
}
printf("\n\n");
}
}
//>Erzeugt das Spielfeld beim Start
void spielfeld_erzeugen()
{
int x,y;
for(x=0; x<=4;x++){
for(y=0; y<=4; y++){
if(x==0||x==4){
feld[x][y]='_';
}
if((x==1||x==2||x==3)&&(y==1||y==2||y==3)){
feld[x][y]=' ';
}
if(y==0||y==4){
feld[x][y]='|';
}
}
}
}
//>Schreibt an eine Position ein Leerzeichen, wenn die Stelle kein X oder O enthaelt
void clear_spot()
{
if(feld[posX][posY]!=P1_MARKER && feld[posX][posY]!=P2_MARKER){
feld[posX][posY]=' ';
}
}
//> Schreibt an die Position ein -, wenn die Stelle kein X oder O enthaelt
void print_pos()
{
if(feld[posX][posY]!=P1_MARKER && feld[posX][posY]!=P2_MARKER){
feld[posX][posY]=POS_MARKER;
}
}
//>Wartet auf Eingabe - bei w nach oben - bei s nach unten - bei a nach links - bei d nach rechts - bei enter Zeichen des spielers schreiben
void eingabe()
{
int eing;
eing=getch();
switch(eing){
case 'w':
if(posX==1){
eingabe();
}else{
clear_spot();
posX--;
print_pos();
}
break;
case 's':
if(posX==3){
eingabe();
}else{
clear_spot();
posX++;
print_pos();
}
break;
case 'a':
if(posY==1){
eingabe();
}else{
clear_spot();
posY--;
print_pos();
}
break;
case 'd':
if(posY==3){
eingabe();
}else{
clear_spot();
posY++;
print_pos();
}
break;
case 13:
if(feld[posX][posY]==P1_MARKER||feld[posX][posY]==P2_MARKER){
eingabe();
}else{
if(akt_spieler==1){
feld[posX][posY]=P1_MARKER;
print_feld();
akt_spieler++;
}else{
feld[posX][posY]=P2_MARKER;
print_feld();
akt_spieler--;
}
}
break;
default:
eingabe();
}
}
//>Pr¸ft die Zeilen auf einen Gewinner, wurde ein Gewinn festgestellt return 1, sonst 0. aendert den gewinner entsprechend
int zeile()
{
if((feld[1][1]==P1_MARKER && feld[1][2]==P1_MARKER && feld[1][3]==P1_MARKER) ||
(feld[2][1]==P1_MARKER && feld[2][2]==P1_MARKER && feld[2][3]==P1_MARKER) ||
(feld[3][1]==P1_MARKER && feld[3][2]==P1_MARKER && feld[3][3]==P1_MARKER))
{
return 1;
gewinner = 1;
}
if((feld[1][1]==P2_MARKER && feld[1][2]==P2_MARKER && feld[1][3]==P2_MARKER) ||
(feld[2][1]==P2_MARKER && feld[2][2]==P2_MARKER && feld[2][3]==P2_MARKER) ||
(feld[3][1]==P2_MARKER && feld[3][2]==P2_MARKER && feld[3][3]==P2_MARKER))
{
gewinner = 2;
return 1;
}
return 0;
}
//>Pr¸ft die Spalten auf einen Gewinner, wurde ein Gewinn festgestellt return 1, sonst 0. aendert den gewinner entsprechend
int spalte()
{
if((feld[1][1]==P1_MARKER && feld[2][1]==P1_MARKER && feld[3][1]==P1_MARKER) ||
(feld[1][2]==P1_MARKER && feld[2][2]==P1_MARKER && feld[3][2]==P1_MARKER) ||
(feld[1][3]==P1_MARKER && feld[2][3]==P1_MARKER && feld[3][3]==P1_MARKER))
{
gewinner = 1;
return 1;
}
if((feld[1][1]==P2_MARKER && feld[2][1]==P2_MARKER && feld[3][1]==P2_MARKER) ||
(feld[1][2]==P2_MARKER && feld[2][2]==P2_MARKER && feld[3][2]==P2_MARKER) ||
(feld[1][3]==P2_MARKER && feld[2][3]==P2_MARKER && feld[3][3]==P2_MARKER))
{
gewinner = 2;
return 1;
}
return 0;
}
//>Pr¸ft die Vertiklen auf einen Gewinner, wurde ein Gewinn festgestellt return 1, sonst 0. aendert den gewinner entsprechend
int vert()
{
if((feld[1][1]==P1_MARKER && feld[2][2]==P1_MARKER && feld[3][3]==P1_MARKER) ||
(feld[1][3]==P1_MARKER && feld[2][2]==P1_MARKER && feld[3][1]==P1_MARKER))
{
gewinner = 1;
return 1;
}
if((feld[1][1]==P2_MARKER && feld[2][2]==P2_MARKER && feld[3][3]==P2_MARKER) ||
(feld[1][3]==P2_MARKER && feld[2][2]==P2_MARKER && feld[3][1]==P2_MARKER))
{
gewinner = 2;
return 1;
}
return 0;
}
//>pr¸ft, ob das Spielfeld voll ist. wenn ja return 0, sonst 1
int feld_voll()
{
if((feld[1][1]==P1_MARKER || feld[1][1]==P2_MARKER) &&
(feld[1][2]==P1_MARKER || feld[1][2]==P2_MARKER) &&
(feld[1][3]==P1_MARKER || feld[1][3]==P2_MARKER) &&
(feld[2][1]==P1_MARKER || feld[2][1]==P2_MARKER) &&
(feld[2][2]==P1_MARKER || feld[2][2]==P2_MARKER) &&
(feld[2][3]==P1_MARKER || feld[2][3]==P2_MARKER) &&
(feld[3][1]==P1_MARKER || feld[3][1]==P2_MARKER) &&
(feld[3][2]==P1_MARKER || feld[3][2]==P2_MARKER) &&
(feld[3][3]==P1_MARKER || feld[3][3]==P2_MARKER))
{
return 0;
}
return 1;
}
//pr¸ft, ob ein gewinner ermittelt wurde. wenn ja return 0, sonst 1
int gewinn()
{
if(zeile()||spalte()||vert()){
return 0;
}
return 1;
}
int main()
{
spielfeld_erzeugen();
print_pos();
while(gewinn() && feld_voll()){
printf("\n\tT I C \t T A C \t T O E\n\n");
printf("\tw\tPosition nach oben\n"
"\ta\tPosition nach links\n"
"\ts\tPosition nach unten\n"
"\td\tPosition nach rechts\n"
"\tEnter\tMarker setzen\n\n");
print_feld();
printf("\nSpieler %i ist am Zug!\n", akt_spieler);
eingabe();
system(CLEAR);
}
printf("\n\t T I C \t T A C \t T O E\n\n");
print_feld();
if(gewinner==0){
printf("\n\tEs gibt keinen Sieger!!\n");
}else{
printf("\n\tSPIELER %i HAT GEWONNEN!!\n", gewinner);
}
printf("\n\n\tNoch mal spielen\?(j/n)\n");
abfrage:
switch (getch()){
case 'j':
reset();
main();
break;
case 'n':
printf("\n\n\tOk, Tschau!!\n");
break;
default:
goto abfrage;
}
return 0;
}
Fehlermeldung von xCode: