C ile Tic Tac Toe oyunu yapımı

Katılım
13 Eylül 2021
Mesajlar
55
C programlama dili ile Tic Tac Toe oyunu yaptım, hata varsa bildirirseniz sevinirim.

[CODE lang="c" title="TTT.c"]/*
Name: TicTacToe
Copyright: -
Author: AHT
Date: 06.11.2021 12:08
Description: Tic Tac Toe game.
*/


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define NEWLINE "\n\r"
#define print_help_message() printf("%s",\
"Play TicTacToe!"NEWLINE\
)

/*#define AHTDEBUG*/

#if defined __WINDOWS__ || defined __WIN32__ || defined __WIN64__
# include <conio.h>
# define clrscr() system("cls")
#elif __MSDOS__
# include <conio.h>
#else
# define clrscr() system("clear")
#endif

const unsigned char play_ground_bak[] = {
'\n', '\r', '0', '\t', '1', ' ', ' ', '2', ' ', ' ', '3', ' ',
'\n', '\r', ' ', '\t', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
'\n', '\r', '1', '\t', ' ', ' ', 179, ' ', ' ', 179, ' ', ' ',
'\n', '\r', ' ', '\t', 196, 196, 197, 196, 196, 197, 196, 196,
'\n', '\r', '2', '\t', ' ', ' ', 179, ' ', ' ', 179, ' ', ' ',
'\n', '\r', ' ', '\t', 196, 196, 197, 196, 196, 197, 196, 196,
'\n', '\r', '3', '\t', ' ', ' ', 179, ' ', ' ', 179, ' ', ' ', '\0'
};

unsigned char chars[3][3] = {0};
unsigned char play_ground[128];

const char game_characters[2] = {'X', 'O'};

int is_game_over(void) /* 0=devam, 1=berabere, 2=X kazandi, 3=O kazandi. */
{
int i, flag = 1;
for(i = 0; i < 2; i++)
{
if( chars[0][0] == chars[0][1] && chars[0][2] == chars[0][1] && game_characters == chars[0][0] ||
chars[0][0] == chars[1][0] && chars[2][0] == chars[1][0] && game_characters == chars[0][0] ||
chars[0][0] == chars[1][1] && chars[2][2] == chars[1][1] && game_characters == chars[0][0] ||
chars[0][1] == chars[1][1] && chars[2][1] == chars[1][1] && game_characters == chars[0][1] ||
chars[0][2] == chars[1][2] && chars[2][2] == chars[1][2] && game_characters == chars[0][2] ||
chars[1][0] == chars[1][1] && chars[1][0] == chars[1][2] && game_characters == chars[1][0] ||
chars[2][0] == chars[2][1] && chars[2][0] == chars[2][2] && game_characters == chars[2][0] ||
chars[2][0] == chars[1][1] && chars[2][0] == chars[0][2] && game_characters == chars[2][0]
)
{
#ifdef AHTDEBUG
printf("Oyun bitti.");
scanf("%d");
#endif
return i+2;
}
}
for(i = 0; i < 9; i++)
{
flag = chars[i/3][i%3] == 0 ? 0 : flag;
}
return flag; /* Kontrollerden gectikten sonra */
}

int X_or_O(void)
{
char ch;
err:
printf("\rX mi, O mu? ");
scanf("%c", &ch);
switch(ch)
{
case 'X':
case 'x':
return 'X';
case 'O':
case 'o':
return 'O';
default: goto err;
}
}

int status(void)
{
clrscr();
printf("%s"NEWLINE NEWLINE, play_ground);
switch(is_game_over())
{
case 1:
printf(NEWLINE NEWLINE"--BERABERE--");
return 1;
case 2:
printf(NEWLINE NEWLINE"--X KAZANDI--");
return 2;
case 3:
printf(NEWLINE NEWLINE"--O KAZANDI--");
return 3;
}
return 0;
}

void play_multiplayer(void)
{
int x = 0, y = 0, index;
for(index = 0; ; index++)
{
if(status()) return ;
err_loc:
printf("%c konumu(x-y): ", game_characters[index % 2]);
scanf("%d-%d", &x, &y);
#ifdef AHTDEBUG
printf("\n x: %d, y: %d", x, y);
#endif
if(x > 3 || x < 1 || y > 3 || y < 1) /* Menzil disi. */
{
printf("Konum yanlŸ yere girildi!"NEWLINE);
goto err_loc;
}
if(chars[x-1][y-1]) /* Zaten dolu */
{
printf("Dolu!"NEWLINE);
goto err_loc;
}
chars[x-1][y-1] = game_characters[index % 2];
play_ground[x == 1 ? y*3+25 : x == 2 ? y*3+49 : y*3+73] = chars[x-1][y-1];
}
}

void play_computer(const int difficulty) /* 0=kolay, 1=orta, 2=zor, 3=uzman */
{
int karakter = X_or_O(), bot_karakter = 'O', x, y, X = 0, Y = 0, flag = 0, i = 0;
if(karakter == 'O')
{
bot_karakter = 'X';
switch(difficulty)
{
case 0: goto kolay_basla;
case 1: goto orta_basla;
case 2: goto zor_basla;
case 3: goto uzman_basla;
default: return ;
}
}
for(i = 0; ; i++)
{
if(status()) return ;
err_loc:
printf("%c konumu(x-y): ", karakter);
scanf("%d-%d", &x, &y);
#ifdef AHTDEBUG
printf("\n x: %d, y: %d", x, y);
#endif
if(x > 3 || x < 1 || y > 3 || y < 1) /* Menzil disi. */
{
printf("Konum yanlŸ yere girildi!"NEWLINE);
goto err_loc;
}
if(chars[x-1][y-1]) /* Zaten dolu */
{
printf("Dolu!"NEWLINE);
goto err_loc;
}
chars[x-1][y-1] = karakter;
play_ground[x == 1 ? y*3+25 : x == 2 ? y*3+49 : y*3+73] = chars[x-1][y-1];
if(status()) return ;
x = 0, y = 0, flag = 0;
switch(difficulty)
{
case 0: goto kolay_basla;
case 1: goto orta_basla;
case 2: goto zor_basla;
case 3: goto uzman_basla;
default: return ;
}
uzman_basla: /* Daha zekice hareket eder. */
if(i == 0 && chars[1][1] != karakter && bot_karakter == 'O') { flag = chars[1][1] = bot_karakter; X = 1, Y = 1;} /* Ilk hamlemiz koselere olursa ortaya O koyar. */
else if(i == 0 && chars[1][1] == karakter && bot_karakter == 'O'){ flag = chars[0][0] = bot_karakter; X = 0, Y = 0;} /* Ilk hamle ortadaysa koseye O koyar. */
else if(i == 1 && (chars[0][0] == chars[2][2] && chars[0][0] == karakter ||
chars[0][2] == chars[2][0] && chars[0][2] == karakter) && chars[1][1] == bot_karakter && bot_karakter == 'O'){ flag = chars[1][0] = bot_karakter; X = 1, Y = 0;} /* Solust-sagalt Caprazlama hilesini bozmak icin */
/* Usttekiler savunma icin, alttakiler saldiri icin */
else if(i == 0 && bot_karakter == 'X'){ flag = chars[0][0] = bot_karakter; X = 0, Y = 0;} /* X ise sol ustten baslar */
else if(i == 1 && chars[1][1] == karakter && bot_karakter == 'X'){ flag = chars[2][2] = bot_karakter; X = 2, Y = 2;} /* X ise sol ustten baslar */
if(flag) goto end_of_bot_turn;
zor_basla: /* Kendisinin kazanmasi icin olan algoritmayi da yaz. */
for(x = 0; x < 3; x++)
{
if(chars[x][0] == chars[x][1] && chars[x][0] == bot_karakter && chars[x][2] != karakter){ flag = chars[x][2] = bot_karakter; X = x, Y = 2;}
else if(chars[x][0] == chars[x][2] && chars[x][0] == bot_karakter && chars[x][1] != karakter){ flag = chars[x][1] = bot_karakter; X = x, Y = 1;}
else if(chars[x][1] == chars[x][2] && chars[x][1] == bot_karakter && chars[x][0] != karakter){ flag = chars[x][0] = bot_karakter; X = x, Y = 0;}
}
if(flag) goto end_of_bot_turn;
for(y = 0; y < 3; y++)
{
if(chars[0][y] == chars[1][y] && chars[0][y] == bot_karakter && chars[2][y] != karakter){ flag = chars[2][y] = bot_karakter; X = 2, Y = y;}
else if(chars[1][y] == chars[2][y] && chars[1][y] == bot_karakter && chars[0][y] != karakter){ flag = chars[0][y] = bot_karakter; X = 0, Y = y;}
else if(chars[0][y] == chars[2][y] && chars[0][y] == bot_karakter && chars[1][y] != karakter){ flag = chars[1][y] = bot_karakter; X = 1, Y = y;}
}
if(flag) goto end_of_bot_turn;
else if(chars[0][0] == chars[1][1] && chars[0][0] == bot_karakter && chars[2][2] != karakter){ flag = chars[2][2] = bot_karakter; X = 2, Y = 2;}
else if(chars[1][1] == chars[2][2] && chars[1][1] == bot_karakter && chars[0][0] != karakter){ flag = chars[0][0] = bot_karakter; X = 0, Y = 0;}
else if(chars[0][0] == chars[1][1] && chars[0][0] == bot_karakter && chars[2][2] != karakter){ flag = chars[2][2] = bot_karakter; X = 2, Y = 2;}
else if(chars[0][0] == chars[2][2] && chars[0][0] == bot_karakter && chars[1][1] != karakter){ flag = chars[1][1] = bot_karakter; X = 1, Y = 1;}
else if(chars[2][0] == chars[1][1] && chars[2][0] == bot_karakter && chars[0][2] != karakter){ flag = chars[0][2] = bot_karakter; X = 0, Y = 2;}
else if(chars[1][1] == chars[0][2] && chars[1][1] == bot_karakter && chars[2][0] != karakter){ flag = chars[2][0] = bot_karakter; X = 2, Y = 0;}
else if(chars[2][0] == chars[0][2] && chars[2][0] == bot_karakter && chars[1][1] != karakter){ flag = chars[1][1] = bot_karakter; X = 1, Y = 1;}
if(flag) goto end_of_bot_turn;
orta_basla: /* Senin kazanmani onleme algoritmasi */
for(x = 0; x < 3; x++)
{
if(chars[x][0] == chars[x][1] && chars[x][0] == karakter && chars[x][2] != bot_karakter){ flag = chars[x][2] = bot_karakter; X = x, Y = 2;}
else if(chars[x][0] == chars[x][2] && chars[x][0] == karakter && chars[x][1] != bot_karakter){ flag = chars[x][1] = bot_karakter; X = x, Y = 1;}
else if(chars[x][1] == chars[x][2] && chars[x][1] == karakter && chars[x][0] != bot_karakter){ flag = chars[x][0] = bot_karakter; X = x, Y = 0;}
}
if(flag) goto end_of_bot_turn;
for(y = 0; y < 3; y++)
{
if(chars[0][y] == chars[1][y] && chars[0][y] == karakter && chars[2][y] != bot_karakter){ flag = chars[2][y] = bot_karakter; X = 2, Y = y;}
else if(chars[1][y] == chars[2][y] && chars[1][y] == karakter && chars[0][y] != bot_karakter){ flag = chars[0][y] = bot_karakter; X = 0, Y = y;}
else if(chars[0][y] == chars[2][y] && chars[0][y] == karakter && chars[1][y] != bot_karakter){ flag = chars[1][y] = bot_karakter; X = 1, Y = y;}
}
if(flag) goto end_of_bot_turn; /* Alttakiler caprazlama olanlar. */
else if(chars[0][0] == chars[1][1] && chars[0][0] == karakter && chars[2][2] != bot_karakter){ flag = chars[2][2] = bot_karakter; X = 2, Y = 2;}
else if(chars[1][1] == chars[2][2] && chars[1][1] == karakter && chars[0][0] != bot_karakter){ flag = chars[0][0] = bot_karakter; X = 0, Y = 0;}
else if(chars[0][0] == chars[1][1] && chars[0][0] == karakter && chars[2][2] != bot_karakter){ flag = chars[2][2] = bot_karakter; X = 2, Y = 2;}
else if(chars[0][0] == chars[2][2] && chars[0][0] == karakter && chars[1][1] != bot_karakter){ flag = chars[1][1] = bot_karakter; X = 1, Y = 1;}
else if(chars[2][0] == chars[1][1] && chars[2][0] == karakter && chars[0][2] != bot_karakter){ flag = chars[0][2] = bot_karakter; X = 0, Y = 2;}
else if(chars[1][1] == chars[0][2] && chars[1][1] == karakter && chars[2][0] != bot_karakter){ flag = chars[2][0] = bot_karakter; X = 2, Y = 0;}
else if(chars[2][0] == chars[0][2] && chars[2][0] == karakter && chars[1][1] != bot_karakter){ flag = chars[1][1] = bot_karakter; X = 1, Y = 1;}
if(flag) goto end_of_bot_turn;
if(!flag)
{
kolay_basla:
printf("\rBekleyin . . .");
srand(time(NULL));
x = rand() % 3;
y = rand() % 3;
if(chars[x][y]) goto kolay_basla;
chars[x][y] = bot_karakter;
X = x, Y = y;
}
end_of_bot_turn:
play_ground[X == 0 ? Y*3+28 : X == 1 ? Y*3+52 : Y*3+76] = chars[X][Y];
}
}

void main_menu(void)
{
int game_number;
err:
printf(NEWLINE
"1- ˜ki kiŸi oyna"NEWLINE
"2- Bilgisayara karŸ kolay"NEWLINE
"3- Bilgisayara karŸ orta"NEWLINE
"4- Bilgisayara karŸ zor"NEWLINE
"5- Bilgisayara karŸ uzman"NEWLINE
"6- €kŸ"NEWLINE
"˜Ÿlem se‡iniz: "NEWLINE
);
scanf("%d", &game_number);
if(game_number == 1) play_multiplayer();
else if(game_number >= 2 && game_number <= 5) play_computer(game_number-2);
else if(game_number == 6) exit(EXIT_SUCCESS);
else goto err;
}

int main(int argc, char **argv)
{
int i;
if(argc == 2 && (!strcmpi(argv[1], "/?") || !strcmpi(argv[1], "-?")))
{
print_help_message();
return 0;
}
else if(argc != 1)
{
fprintf(stderr, "Wrong number parametres.");
return 1;
}
play:
strcpy(play_ground, play_ground_bak);
main_menu();
invalid_key:
printf(NEWLINE"1- Yeniden Oyna"NEWLINE"2- €kŸ"NEWLINE"˜Ÿlem se‡iniz: ");
scanf("%d", &i);
switch(i)
{
case 1: goto replay;
case 2: return 0;
default: goto invalid_key;
}
replay:
for(i = 0; i < 9; i++)
chars[i/3][i%3] = '\0';
clrscr();
goto play;
}
[/CODE]
 
C programlama dili ile Tic Tac Toe oyunu yaptım, hata varsa bildirirseniz sevinirim.

[CODE lang="c" title="TTT.c"]/*
Name: TicTacToe
Copyright: -
Author: AHT
Date: 06.11.2021 12:08
Description: Tic Tac Toe game.
*/


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define NEWLINE "\n\r"
#define print_help_message() printf("%s",\
"Play TicTacToe!"NEWLINE\
)

/*#define AHTDEBUG*/

#if defined __WINDOWS__ || defined __WIN32__ || defined __WIN64__
# include <conio.h>
# define clrscr() system("cls")
#elif __MSDOS__
# include <conio.h>
#else
# define clrscr() system("clear")
#endif

const unsigned char play_ground_bak[] = {
'\n', '\r', '0', '\t', '1', ' ', ' ', '2', ' ', ' ', '3', ' ',
'\n', '\r', ' ', '\t', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
'\n', '\r', '1', '\t', ' ', ' ', 179, ' ', ' ', 179, ' ', ' ',
'\n', '\r', ' ', '\t', 196, 196, 197, 196, 196, 197, 196, 196,
'\n', '\r', '2', '\t', ' ', ' ', 179, ' ', ' ', 179, ' ', ' ',
'\n', '\r', ' ', '\t', 196, 196, 197, 196, 196, 197, 196, 196,
'\n', '\r', '3', '\t', ' ', ' ', 179, ' ', ' ', 179, ' ', ' ', '\0'
};

unsigned char chars[3][3] = {0};
unsigned char play_ground[128];

const char game_characters[2] = {'X', 'O'};

int is_game_over(void) /* 0=devam, 1=berabere, 2=X kazandi, 3=O kazandi. */
{
int i, flag = 1;
for(i = 0; i < 2; i++)
{
if( chars[0][0] == chars[0][1] && chars[0][2] == chars[0][1] && game_characters == chars[0][0] ||
chars[0][0] == chars[1][0] && chars[2][0] == chars[1][0] && game_characters == chars[0][0] ||
chars[0][0] == chars[1][1] && chars[2][2] == chars[1][1] && game_characters == chars[0][0] ||
chars[0][1] == chars[1][1] && chars[2][1] == chars[1][1] && game_characters == chars[0][1] ||
chars[0][2] == chars[1][2] && chars[2][2] == chars[1][2] && game_characters == chars[0][2] ||
chars[1][0] == chars[1][1] && chars[1][0] == chars[1][2] && game_characters == chars[1][0] ||
chars[2][0] == chars[2][1] && chars[2][0] == chars[2][2] && game_characters == chars[2][0] ||
chars[2][0] == chars[1][1] && chars[2][0] == chars[0][2] && game_characters == chars[2][0]
)
{
#ifdef AHTDEBUG
printf("Oyun bitti.");
scanf("%d");
#endif
return i+2;
}
}
for(i = 0; i < 9; i++)
{
flag = chars[i/3][i%3] == 0 ? 0 : flag;
}
return flag; /* Kontrollerden gectikten sonra */
}

int X_or_O(void)
{
char ch;
err:
printf("\rX mi, O mu? ");
scanf("%c", &ch);
switch(ch)
{
case 'X':
case 'x':
return 'X';
case 'O':
case 'o':
return 'O';
default: goto err;
}
}

int status(void)
{
clrscr();
printf("%s"NEWLINE NEWLINE, play_ground);
switch(is_game_over())
{
case 1:
printf(NEWLINE NEWLINE"--BERABERE--");
return 1;
case 2:
printf(NEWLINE NEWLINE"--X KAZANDI--");
return 2;
case 3:
printf(NEWLINE NEWLINE"--O KAZANDI--");
return 3;
}
return 0;
}

void play_multiplayer(void)
{
int x = 0, y = 0, index;
for(index = 0; ; index++)
{
if(status()) return ;
err_loc:
printf("%c konumu(x-y): ", game_characters[index % 2]);
scanf("%d-%d", &x, &y);
#ifdef AHTDEBUG
printf("\n x: %d, y: %d", x, y);
#endif
if(x > 3 || x < 1 || y > 3 || y < 1) /* Menzil disi. */
{
printf("Konum yanlŸ yere girildi!"NEWLINE);
goto err_loc;
}
if(chars[x-1][y-1]) /* Zaten dolu */
{
printf("Dolu!"NEWLINE);
goto err_loc;
}
chars[x-1][y-1] = game_characters[index % 2];
play_ground[x == 1 ? y*3+25 : x == 2 ? y*3+49 : y*3+73] = chars[x-1][y-1];
}
}

void play_computer(const int difficulty) /* 0=kolay, 1=orta, 2=zor, 3=uzman */
{
int karakter = X_or_O(), bot_karakter = 'O', x, y, X = 0, Y = 0, flag = 0, i = 0;
if(karakter == 'O')
{
bot_karakter = 'X';
switch(difficulty)
{
case 0: goto kolay_basla;
case 1: goto orta_basla;
case 2: goto zor_basla;
case 3: goto uzman_basla;
default: return ;
}
}
for(i = 0; ; i++)
{
if(status()) return ;
err_loc:
printf("%c konumu(x-y): ", karakter);
scanf("%d-%d", &x, &y);
#ifdef AHTDEBUG
printf("\n x: %d, y: %d", x, y);
#endif
if(x > 3 || x < 1 || y > 3 || y < 1) /* Menzil disi. */
{
printf("Konum yanlŸ yere girildi!"NEWLINE);
goto err_loc;
}
if(chars[x-1][y-1]) /* Zaten dolu */
{
printf("Dolu!"NEWLINE);
goto err_loc;
}
chars[x-1][y-1] = karakter;
play_ground[x == 1 ? y*3+25 : x == 2 ? y*3+49 : y*3+73] = chars[x-1][y-1];
if(status()) return ;
x = 0, y = 0, flag = 0;
switch(difficulty)
{
case 0: goto kolay_basla;
case 1: goto orta_basla;
case 2: goto zor_basla;
case 3: goto uzman_basla;
default: return ;
}
uzman_basla: /* Daha zekice hareket eder. */
if(i == 0 && chars[1][1] != karakter && bot_karakter == 'O') { flag = chars[1][1] = bot_karakter; X = 1, Y = 1;} /* Ilk hamlemiz koselere olursa ortaya O koyar. */
else if(i == 0 && chars[1][1] == karakter && bot_karakter == 'O'){ flag = chars[0][0] = bot_karakter; X = 0, Y = 0;} /* Ilk hamle ortadaysa koseye O koyar. */
else if(i == 1 && (chars[0][0] == chars[2][2] && chars[0][0] == karakter ||
chars[0][2] == chars[2][0] && chars[0][2] == karakter) && chars[1][1] == bot_karakter && bot_karakter == 'O'){ flag = chars[1][0] = bot_karakter; X = 1, Y = 0;} /* Solust-sagalt Caprazlama hilesini bozmak icin */
/* Usttekiler savunma icin, alttakiler saldiri icin */
else if(i == 0 && bot_karakter == 'X'){ flag = chars[0][0] = bot_karakter; X = 0, Y = 0;} /* X ise sol ustten baslar */
else if(i == 1 && chars[1][1] == karakter && bot_karakter == 'X'){ flag = chars[2][2] = bot_karakter; X = 2, Y = 2;} /* X ise sol ustten baslar */
if(flag) goto end_of_bot_turn;
zor_basla: /* Kendisinin kazanmasi icin olan algoritmayi da yaz. */
for(x = 0; x < 3; x++)
{
if(chars[x][0] == chars[x][1] && chars[x][0] == bot_karakter && chars[x][2] != karakter){ flag = chars[x][2] = bot_karakter; X = x, Y = 2;}
else if(chars[x][0] == chars[x][2] && chars[x][0] == bot_karakter && chars[x][1] != karakter){ flag = chars[x][1] = bot_karakter; X = x, Y = 1;}
else if(chars[x][1] == chars[x][2] && chars[x][1] == bot_karakter && chars[x][0] != karakter){ flag = chars[x][0] = bot_karakter; X = x, Y = 0;}
}
if(flag) goto end_of_bot_turn;
for(y = 0; y < 3; y++)
{
if(chars[0][y] == chars[1][y] && chars[0][y] == bot_karakter && chars[2][y] != karakter){ flag = chars[2][y] = bot_karakter; X = 2, Y = y;}
else if(chars[1][y] == chars[2][y] && chars[1][y] == bot_karakter && chars[0][y] != karakter){ flag = chars[0][y] = bot_karakter; X = 0, Y = y;}
else if(chars[0][y] == chars[2][y] && chars[0][y] == bot_karakter && chars[1][y] != karakter){ flag = chars[1][y] = bot_karakter; X = 1, Y = y;}
}
if(flag) goto end_of_bot_turn;
else if(chars[0][0] == chars[1][1] && chars[0][0] == bot_karakter && chars[2][2] != karakter){ flag = chars[2][2] = bot_karakter; X = 2, Y = 2;}
else if(chars[1][1] == chars[2][2] && chars[1][1] == bot_karakter && chars[0][0] != karakter){ flag = chars[0][0] = bot_karakter; X = 0, Y = 0;}
else if(chars[0][0] == chars[1][1] && chars[0][0] == bot_karakter && chars[2][2] != karakter){ flag = chars[2][2] = bot_karakter; X = 2, Y = 2;}
else if(chars[0][0] == chars[2][2] && chars[0][0] == bot_karakter && chars[1][1] != karakter){ flag = chars[1][1] = bot_karakter; X = 1, Y = 1;}
else if(chars[2][0] == chars[1][1] && chars[2][0] == bot_karakter && chars[0][2] != karakter){ flag = chars[0][2] = bot_karakter; X = 0, Y = 2;}
else if(chars[1][1] == chars[0][2] && chars[1][1] == bot_karakter && chars[2][0] != karakter){ flag = chars[2][0] = bot_karakter; X = 2, Y = 0;}
else if(chars[2][0] == chars[0][2] && chars[2][0] == bot_karakter && chars[1][1] != karakter){ flag = chars[1][1] = bot_karakter; X = 1, Y = 1;}
if(flag) goto end_of_bot_turn;
orta_basla: /* Senin kazanmani onleme algoritmasi */
for(x = 0; x < 3; x++)
{
if(chars[x][0] == chars[x][1] && chars[x][0] == karakter && chars[x][2] != bot_karakter){ flag = chars[x][2] = bot_karakter; X = x, Y = 2;}
else if(chars[x][0] == chars[x][2] && chars[x][0] == karakter && chars[x][1] != bot_karakter){ flag = chars[x][1] = bot_karakter; X = x, Y = 1;}
else if(chars[x][1] == chars[x][2] && chars[x][1] == karakter && chars[x][0] != bot_karakter){ flag = chars[x][0] = bot_karakter; X = x, Y = 0;}
}
if(flag) goto end_of_bot_turn;
for(y = 0; y < 3; y++)
{
if(chars[0][y] == chars[1][y] && chars[0][y] == karakter && chars[2][y] != bot_karakter){ flag = chars[2][y] = bot_karakter; X = 2, Y = y;}
else if(chars[1][y] == chars[2][y] && chars[1][y] == karakter && chars[0][y] != bot_karakter){ flag = chars[0][y] = bot_karakter; X = 0, Y = y;}
else if(chars[0][y] == chars[2][y] && chars[0][y] == karakter && chars[1][y] != bot_karakter){ flag = chars[1][y] = bot_karakter; X = 1, Y = y;}
}
if(flag) goto end_of_bot_turn; /* Alttakiler caprazlama olanlar. */
else if(chars[0][0] == chars[1][1] && chars[0][0] == karakter && chars[2][2] != bot_karakter){ flag = chars[2][2] = bot_karakter; X = 2, Y = 2;}
else if(chars[1][1] == chars[2][2] && chars[1][1] == karakter && chars[0][0] != bot_karakter){ flag = chars[0][0] = bot_karakter; X = 0, Y = 0;}
else if(chars[0][0] == chars[1][1] && chars[0][0] == karakter && chars[2][2] != bot_karakter){ flag = chars[2][2] = bot_karakter; X = 2, Y = 2;}
else if(chars[0][0] == chars[2][2] && chars[0][0] == karakter && chars[1][1] != bot_karakter){ flag = chars[1][1] = bot_karakter; X = 1, Y = 1;}
else if(chars[2][0] == chars[1][1] && chars[2][0] == karakter && chars[0][2] != bot_karakter){ flag = chars[0][2] = bot_karakter; X = 0, Y = 2;}
else if(chars[1][1] == chars[0][2] && chars[1][1] == karakter && chars[2][0] != bot_karakter){ flag = chars[2][0] = bot_karakter; X = 2, Y = 0;}
else if(chars[2][0] == chars[0][2] && chars[2][0] == karakter && chars[1][1] != bot_karakter){ flag = chars[1][1] = bot_karakter; X = 1, Y = 1;}
if(flag) goto end_of_bot_turn;
if(!flag)
{
kolay_basla:
printf("\rBekleyin . . .");
srand(time(NULL));
x = rand() % 3;
y = rand() % 3;
if(chars[x][y]) goto kolay_basla;
chars[x][y] = bot_karakter;
X = x, Y = y;
}
end_of_bot_turn:
play_ground[X == 0 ? Y*3+28 : X == 1 ? Y*3+52 : Y*3+76] = chars[X][Y];
}
}

void main_menu(void)
{
int game_number;
err:
printf(NEWLINE
"1- ˜ki kiŸi oyna"NEWLINE
"2- Bilgisayara karŸ kolay"NEWLINE
"3- Bilgisayara karŸ orta"NEWLINE
"4- Bilgisayara karŸ zor"NEWLINE
"5- Bilgisayara karŸ uzman"NEWLINE
"6- €kŸ"NEWLINE
"˜Ÿlem se‡iniz: "NEWLINE
);
scanf("%d", &game_number);
if(game_number == 1) play_multiplayer();
else if(game_number >= 2 && game_number <= 5) play_computer(game_number-2);
else if(game_number == 6) exit(EXIT_SUCCESS);
else goto err;
}

int main(int argc, char **argv)
{
int i;
if(argc == 2 && (!strcmpi(argv[1], "/?") || !strcmpi(argv[1], "-?")))
{
print_help_message();
return 0;
}
else if(argc != 1)
{
fprintf(stderr, "Wrong number parametres.");
return 1;
}
play:
strcpy(play_ground, play_ground_bak);
main_menu();
invalid_key:
printf(NEWLINE"1- Yeniden Oyna"NEWLINE"2- €kŸ"NEWLINE"˜Ÿlem se‡iniz: ");
scanf("%d", &i);
switch(i)
{
case 1: goto replay;
case 2: return 0;
default: goto invalid_key;
}
replay:
for(i = 0; i < 9; i++)
chars[i/3][i%3] = '\0';
clrscr();
goto play;
}
[/CODE]

.bat olarak mı oluşturacağız?
 
Basitce incelemek için fazla uzun bir kod. Çalışıyorsa çalışıyordur. Sonuçta gerçek hayatta işinize yaramayacak.

Hata varsa bildirirseniz sevinirim.
50 adet goto dışında mı?
252. satırı anlamak için 5 dakikadan fazla gerekebileceğinin farkındasınızdır umarım. O sayılar vahiy yoluyla geliyor herhalde.
 
Tebrik ediyorum seni. Kodun çalışıyor olabilir ama yazarken hiç mi düşünmedin ya ben napıyorum diye :D
Kod aşırı spagetti. Oyunu tekrardan goto kullanmadan ve if lerdeki mantığı daha basit düşünerek yaz.
Katılıyorum, okunabilir kod yazma konusunda sıkıntım var.
Hocam düzenledim, gotoları kaldırdım şimdi olmuş mu?
Kod:
[CODE lang="c" title="TTT.c"]/*
Name: TicTacToe
Copyright: -
Author: AHT
Date: 06.11.2021 12:08
Description: Tic Tac Toe game.
*/


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <ctype.h>

#define NEWLINE "\n\r"
#define print_help_message() printf("%s",\
"Play TicTacToe!"NEWLINE\
)

/*#define AHTDEBUG*/

#if defined __WINDOWS__ || defined __WIN32__ || defined __WIN64__
# include <conio.h>
# define clrscr() system("cls")
#elif __MSDOS__
# include <conio.h>
#else
# define clrscr() system("clear")
#endif

#define MAX_ROW_SIZE 3
#define MAX_COL_SIZE 3
#define LINE1 25
#define LINE2 49
#define LINE3 73

typedef struct _Point
{
int x, y;
}Point;

const unsigned char play_ground_bak[] = {
'\n', '\r', '0', '\t', '1', ' ', ' ', '2', ' ', ' ', '3', ' ',
'\n', '\r', ' ', '\t', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
'\n', '\r', '1', '\t', ' ', ' ', 179, ' ', ' ', 179, ' ', ' ',
'\n', '\r', ' ', '\t', 196, 196, 197, 196, 196, 197, 196, 196,
'\n', '\r', '2', '\t', ' ', ' ', 179, ' ', ' ', 179, ' ', ' ',
'\n', '\r', ' ', '\t', 196, 196, 197, 196, 196, 197, 196, 196,
'\n', '\r', '3', '\t', ' ', ' ', 179, ' ', ' ', 179, ' ', ' ', '\0'
};

unsigned char chars[3][3] = {0};
unsigned char play_ground[128];

const char game_characters[2] = {'X', 'O'};

int is_game_over(void) /* 0=devam, 1=berabere, 2=X kazandi, 3=O kazandi. */
{
int i, flag = 1;
Point p;
for(i = 0; i < 2; i++)
{
for(p.x = 0; p.x < 3; p.x++)
{
if(chars[p.x][0] == chars[p.x][1] && chars[p.x][2] == chars[p.x][0] && game_characters == chars[p.x][0]) return i+2; /* Sutun bazli kontrol */
}
for(p.y = 0; p.y < 3; p.y++)
{
if(chars[0][p.y] == chars[1][p.y] && chars[2][p.y] == chars[1][p.y] && game_characters == chars[0][p.y]) return i+2; /* Satir bazli kontrol */
}
if( chars[0][0] == chars[1][1] && chars[2][2] == chars[1][1] && game_characters == chars[0][0] ||
chars[0][2] == chars[1][1] && chars[2][0] == chars[1][1] && game_characters == chars[0][2] /* Caprazlama kontrol */
)
{
return i+2;
}
}
for(i = 0; i < 9; i++)
{
flag = chars[i/3][i%3] == 0 ? 0 : flag;
}
return flag; /* Kontrollerden gectikten sonra */
}

char X_or_O(void)
{
char ch;
while(ch != 'X' && ch != 'O')
{
printf("\rX mi, O mu? ");
scanf("%c", &ch);
ch = toupper(ch);
}
return ch;
}

int status(void)
{
int stat = is_game_over(); /* 0 ise devam, 1 ise berabere, 2 ise x, 3 ise O kazanmasi. */
static const char *msg[4] = {"\0", "--BERABERE--", "--X KAZANDI--", "--O KAZANDI--"};
clrscr();
printf("%s"NEWLINE NEWLINE, play_ground);
printf("%s", msg[stat]);
return stat;
}

int karakter, bot_karakter, i;

void play_multiplayer(void)
{
int index, flag, karakter;
Point p;
for(index = 0; ; index++)
{
karakter = game_characters[index % 2];
flag = 0, p.x=0,p.y=0;
if(status()) return ;
while(!flag)
{
printf("%c konumu(x-y): ", karakter);
scanf("%d-%d", &p.x, &p.y);
if(p.x > 3 || p.x < 1 || p.y > 3 || p.y < 1) /* Menzil disi. */
{
printf("Konum yanl�� yere girildi!"NEWLINE);
continue;
}
else if(chars[--p.x][--p.y]) /* Zaten dolu */
{
printf("Dolu!"NEWLINE);
continue;
}
flag = play_ground[p.x == 0 ? (p.y+1)*3+LINE1 : p.x == 1 ? (p.y+1)*3+LINE2 : (p.y+1)*3+LINE3] = chars[p.x][p.y] = karakter;
}
}
}

Point p;

void kolay_alg(void) /* Rastgele */
{
do
{
printf("\rBekleyin . . .");
srand(time(NULL));
p.x = rand() % 3;
p.y = rand() % 3;
}
while(chars[p.x][p.y]);
chars[p.x][p.y] = bot_karakter;
return ;
}

void orta_alg(void) /* Senin kazanmani onleme algoritmasi */
{
int x, y, flag = 0;
for(x = 0; x < 3; x++)
{
if(chars[x][0] == chars[x][1] && chars[x][0] == karakter && chars[x][2] != bot_karakter){ flag = chars[x][2] = bot_karakter; p.x = x, p.y = 2;}
else if(chars[x][0] == chars[x][2] && chars[x][0] == karakter && chars[x][1] != bot_karakter){ flag = chars[x][1] = bot_karakter; p.x = x, p.y = 1;}
else if(chars[x][1] == chars[x][2] && chars[x][1] == karakter && chars[x][0] != bot_karakter){ flag = chars[x][0] = bot_karakter; p.x = x, p.y = 0;}
}
if(flag) return ;
for(y = 0; y < 3; y++)
{
if(chars[0][y] == chars[1][y] && chars[0][y] == karakter && chars[2][y] != bot_karakter){ flag = chars[2][y] = bot_karakter; p.x = 2, p.y = y;}
else if(chars[1][y] == chars[2][y] && chars[1][y] == karakter && chars[0][y] != bot_karakter){ flag = chars[0][y] = bot_karakter; p.x = 0, p.y = y;}
else if(chars[0][y] == chars[2][y] && chars[0][y] == karakter && chars[1][y] != bot_karakter){ flag = chars[1][y] = bot_karakter; p.x = 1, p.y = y;}
}
if(flag) return ; /* Alttakiler caprazlama olanlar. */
else if(chars[0][0] == chars[1][1] && chars[0][0] == karakter && chars[2][2] != bot_karakter){ flag = chars[2][2] = bot_karakter; p.x = 2, p.y = 2;}
else if(chars[1][1] == chars[2][2] && chars[1][1] == karakter && chars[0][0] != bot_karakter){ flag = chars[0][0] = bot_karakter; p.x = 0, p.y = 0;}
else if(chars[0][0] == chars[1][1] && chars[0][0] == karakter && chars[2][2] != bot_karakter){ flag = chars[2][2] = bot_karakter; p.x = 2, p.y = 2;}
else if(chars[0][0] == chars[2][2] && chars[0][0] == karakter && chars[1][1] != bot_karakter){ flag = chars[1][1] = bot_karakter; p.x = 1, p.y = 1;}
else if(chars[2][0] == chars[1][1] && chars[2][0] == karakter && chars[0][2] != bot_karakter){ flag = chars[0][2] = bot_karakter; p.x = 0, p.y = 2;}
else if(chars[1][1] == chars[0][2] && chars[1][1] == karakter && chars[2][0] != bot_karakter){ flag = chars[2][0] = bot_karakter; p.x = 2, p.y = 0;}
else if(chars[2][0] == chars[0][2] && chars[2][0] == karakter && chars[1][1] != bot_karakter){ flag = chars[1][1] = bot_karakter; p.x = 1, p.y = 1;}
if(flag) return ;
kolay_alg();
}

void zor_alg(void) /* Kendisinin kazanmasi icin olan algoritma. */
{
int x, y, flag = 0;
for(x = 0; x < 3; x++)
{
if(chars[x][0] == chars[x][1] && chars[x][0] == bot_karakter && chars[x][2] != karakter){ flag = chars[x][2] = bot_karakter; p.x = x, p.y = 2;}
else if(chars[x][0] == chars[x][2] && chars[x][0] == bot_karakter && chars[x][1] != karakter){ flag = chars[x][1] = bot_karakter; p.x = x, p.y = 1;}
else if(chars[x][1] == chars[x][2] && chars[x][1] == bot_karakter && chars[x][0] != karakter){ flag = chars[x][0] = bot_karakter; p.x = x, p.y = 0;}
}
if(flag) return ;
for(y = 0; y < 3; y++)
{
if(chars[0][y] == chars[1][y] && chars[0][y] == bot_karakter && chars[2][y] != karakter){ flag = chars[2][y] = bot_karakter; p.x = 2, p.y = y;}
else if(chars[1][y] == chars[2][y] && chars[1][y] == bot_karakter && chars[0][y] != karakter){ flag = chars[0][y] = bot_karakter; p.x = 0, p.y = y;}
else if(chars[0][y] == chars[2][y] && chars[0][y] == bot_karakter && chars[1][y] != karakter){ flag = chars[1][y] = bot_karakter; p.x = 1, p.y = y;}
}
if(flag) return ;
else if(chars[0][0] == chars[1][1] && chars[0][0] == bot_karakter && chars[2][2] != karakter){ flag = chars[2][2] = bot_karakter; p.x = 2, p.y = 2;}
else if(chars[1][1] == chars[2][2] && chars[1][1] == bot_karakter && chars[0][0] != karakter){ flag = chars[0][0] = bot_karakter; p.x = 0, p.y = 0;}
else if(chars[0][0] == chars[1][1] && chars[0][0] == bot_karakter && chars[2][2] != karakter){ flag = chars[2][2] = bot_karakter; p.x = 2, p.y = 2;}
else if(chars[0][0] == chars[2][2] && chars[0][0] == bot_karakter && chars[1][1] != karakter){ flag = chars[1][1] = bot_karakter; p.x = 1, p.y = 1;}
else if(chars[2][0] == chars[1][1] && chars[2][0] == bot_karakter && chars[0][2] != karakter){ flag = chars[0][2] = bot_karakter; p.x = 0, p.y = 2;}
else if(chars[1][1] == chars[0][2] && chars[1][1] == bot_karakter && chars[2][0] != karakter){ flag = chars[2][0] = bot_karakter; p.x = 2, p.y = 0;}
else if(chars[2][0] == chars[0][2] && chars[2][0] == bot_karakter && chars[1][1] != karakter){ flag = chars[1][1] = bot_karakter; p.x = 1, p.y = 1;}
if(flag) return ;
orta_alg();
}

void uzman_alg(void) /* Daha zekice hareket eder. */
{
int x, y, flag = 0;
if(i == 0 && chars[1][1] != karakter && bot_karakter == 'O') { flag = chars[1][1] = bot_karakter; p.x = 1, p.y = 1;} /* Ilk hamlemiz koselere olursa ortaya O koyar. */
else if(i == 0 && chars[1][1] == karakter && bot_karakter == 'O'){ flag = chars[0][0] = bot_karakter; p.x = 0, p.y = 0;} /* Ilk hamle ortadaysa koseye O koyar. */
else if(i == 1 && (chars[0][0] == chars[2][2] && chars[0][0] == karakter ||
chars[0][2] == chars[2][0] && chars[0][2] == karakter) && chars[1][1] == bot_karakter && bot_karakter == 'O')
{ flag = chars[1][0] = bot_karakter; p.x = 1, p.y = 0;} /* Solust-sagalt Caprazlama hilesini bozmak icin */
/* Usttekiler savunma icin, alttakiler saldiri icin */
else if(i == 0 && bot_karakter == 'X'){ flag = chars[0][0] = bot_karakter; p.x = 0, p.y = 0;} /* X ise sol ustten baslar */
else if(i == 1 && chars[1][1] == karakter && bot_karakter == 'X'){ flag = chars[2][2] = bot_karakter; p.x = 2, p.y = 2;} /* X ise sol ustten baslar */
if(flag) return ;
zor_alg();
}

void (*bot_algoritmasi[4]) (void) = {kolay_alg, orta_alg, zor_alg, uzman_alg};

void play_computer(const int difficulty) /* 0=kolay, 1=orta, 2=zor, 3=uzman */
{
int flag = 0;
karakter = X_or_O(), bot_karakter = (game_characters[0] == karakter) ? game_characters[1] : game_characters[0];
if(karakter == 'O')
{
bot_algoritmasi[difficulty]();
play_ground[p.x == 0 ? (p.y+1)*3+LINE1 : p.x == 1 ? (p.y+1)*3+LINE2 : (p.y+1)*3+LINE3] = chars[p.x][p.y];
}
for(i = 0; ; i++)
{
if(status()) return ;
flag = 0;
while(!flag)
{
printf("%c konumu(x-y): ", karakter);
scanf("%d-%d", &p.x, &p.y);
if(p.x > 3 || p.x < 1 || p.y > 3 || p.y < 1) /* Menzil disi. */
{
printf("Konum yanl�� yere girildi!"NEWLINE);
continue;
}
else if(chars[--p.x][--p.y]) /* Zaten dolu */
{
printf("Dolu!"NEWLINE);
continue;
}
flag = play_ground[p.x == 0 ? (p.y+1)*3+LINE1 : p.x == 1 ? (p.y+1)*3+LINE2 : (p.y+1)*3+LINE3] = chars[p.x][p.y] = karakter;
}
if(status()) return ; /* Botun turu */
if(karakter == 'O' && i == 0) continue;
bot_algoritmasi[difficulty]();
play_ground[p.x == 0 ? (p.y+1)*3+LINE1 : p.x == 1 ? (p.y+1)*3+LINE2 : (p.y+1)*3+LINE3] = chars[p.x][p.y];
}
}

void main_menu(void)
{
int game_number;
strcpy(play_ground, play_ground_bak);
do
{
clrscr();
printf(NEWLINE
"1- �ki ki�i oyna"NEWLINE
"2- Bilgisayara kar�� kolay"NEWLINE
"3- Bilgisayara kar�� orta"NEWLINE
"4- Bilgisayara kar�� zor"NEWLINE
"5- Bilgisayara kar�� uzman"NEWLINE
"6- ��k��"NEWLINE
"��lem se�iniz: "NEWLINE
);
scanf("%d", &game_number);
if(game_number == 1) play_multiplayer();
else if(game_number >= 2 && game_number <= 5) play_computer(game_number-2);
else if(game_number == 6) exit(EXIT_SUCCESS);
}
while(game_number < 1 || game_number > 6);
}

int main(int argc, char **argv)
{
int i;
if(argc == 2 && (!strcmpi(argv[1], "/?") || !strcmpi(argv[1], "-?")))
{
print_help_message();
return 0;
}
else if(argc != 1)
{
fprintf(stderr, "Wrong number parametres.");
return 1;
}
main_menu();
while(1)
{
printf(NEWLINE"1- Yeniden Oyna"NEWLINE"2- ��k��"NEWLINE"��lem se�iniz: ");
scanf("%d", &i);
switch(i)
{
case 1:
for(i = 0; i < 9; i++)
chars[i/3][i%3] = '\0';
clrscr();
main_menu();
break;
case 2: return 0;
}
}
}
[/CODE]
@RaSGooL hocam kod daha iyi midir öncekinden?
 
Son düzenleme:
@RaSGooL hocam kod daha iyi midir öncekinden?
Yani, hala okumakta zorlanıyorum. Ben son 1 yıldır oop üzerinde çalıştığım için bu kodlar bana aşırı spagetti geliyor. Ayrıca neden yapay zekayı birçok tipte yaptın ki. Bir yapay zeka yapsan yeterli olurdu. Eğer bu oyun üzerinden devam etmek istiyorsan minimax algoritmasını araştırıp yapay zekayı minimax algoritmasi üzerinden çalışmasını sağlayabilirsin.
Ayrıca C ile görselliğe girmene gerek yok. Daha çok algoritma, veri yapıları gibi konulara çalış. C ile veri yapılarına çalışmak mükemmeldir.
Eğer örnek proje konusu istiyorsan senin için bir kaç proje fikri verebilirim.
 
Uyarı! Bu konu 5 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Technopat Haberler

Geri
Yukarı