Сделал игру крестики нолики. Хотел узнать от опытных программистов, что можно улучшить, исправить, или в каких моментах лучше сделать по другому.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <locale.h>
#define SIZEFIELD 9
#define SPACE ' '
// field массив игрового поля
// обнуление игрового поля
void reboot_field(char field[], const int size)
{
int i;
for (i = 0; i < size; i++){
field[i] = SPACE;
}
}
// Проверка игрового поля на победу или ничью
int check_field( char field[])
{
// проверка выигрыша первого игрока
if(field[0] == 'X' && field[1] == 'X' && field[2] == 'X') {
reboot_field(field, SIZEFIELD);
return 1;
}
if( field[0] == 'X' && field[3] == 'X' && field[6] == 'X') {
reboot_field(field, SIZEFIELD);
return 1;
}
if ( field[0] == 'X' && field[4] == 'X' && field[8] == 'X' ) {
reboot_field(field, SIZEFIELD);
return 1;
}
if ( field[3] == 'X' && field[4] == 'X' && field[5] == 'X' ) {
reboot_field(field, SIZEFIELD);
return 1;
}
if ( field[6] == 'X' && field[7] == 'X' && field[8] == 'X') {
reboot_field(field, SIZEFIELD);
return 1;
}
if (field[6] == 'X' && field[4] == 'X' && field[2] == 'X') {
reboot_field(field, SIZEFIELD);
return 1;
}
if (field[1] == 'X' && field[4] == 'X' && field[7] == 'X') {
reboot_field(field, SIZEFIELD);
return 1;
}
// Проверка выигрыша второго игрока
//
if(field[0] == 'O' && field[1] == 'O' && field[2] == 'O') {
reboot_field(field, SIZEFIELD);
return 2;
}
if( field[0] == 'O' && field[3] == 'O' && field[6] == 'O') {
reboot_field(field, SIZEFIELD);
return 2;
}
if ( field[0] == 'O' && field[4] == 'O' && field[8] == 'O' ) {
reboot_field(field, SIZEFIELD);
return 2;
}
if ( field[3] == 'O' && field[4] == 'O' && field[5] == 'O' ) {
reboot_field(field, SIZEFIELD);
return 2;
}
if ( field[6] == 'O' && field[7] == 'O' && field[8] == 'O') {
reboot_field(field, SIZEFIELD);
return 2;
}
if (field[6] == 'O' && field[4] == 'O' && field[2] == 'O') {
reboot_field(field, SIZEFIELD);
return 2;
}
if (field[1] == 'O' && field[4] == 'O' && field[7] == 'O') {
reboot_field(field, SIZEFIELD);
return 2;
}
int cnt = 0, i;
for(i = 0; i < SIZEFIELD; i++){
if(field[i] != SPACE){
cnt++;
}
}
if (cnt == 9){
reboot_field(field, SIZEFIELD);
return 3;
}
return 0;
}
// Печать игрового поля на экра
void print_field(const char field[], const int size, const char name[])
{
system("clear");
/* int i;
puts("");
for( i = 0; i < size; i++) {
if( i == 3 || i == 6) {
puts("");
}
printf("%c", field[i]);
printf("%s", "___|");
}
puts("");
*/
printf("\n\t\tХод игрока %s\n\n", name);
printf("\n\t\t | | \n");
printf("\t\t %c | %c | %c \n", field[0], field[1], field[2]);
printf("\t\t______|______|______\n");
printf("\t\t | | \n");
printf("\t\t %c | %c | %c \n", field[3], field[4], field[5]);
printf("\t\t______|______|______\n");
printf("\t\t | | \n");
printf("\t\t %c | %c | %c \n", field[6], field[7], field[8]);
printf("\t\t | | \n");
}
// Режим игры против бота ( пока не реализован)
void game_with_computer(char field[], const int size)
{
puts("Computer пока не умеет играть, но скоро мы его научим :)");
}
// Режим игры с человеком
void game_with_people(char field[], const int size){
int player1, player2;
int i;
char name_player1[10];
char name_player2[10];
int check = 0; // Проверка на победу
system("clear");
printf("\nВведите имя первого игрока ");
scanf("%s", name_player1);
system("clear");
printf("\nВведите имя второго игрока ");
scanf("%s", name_player2);
while(check != 1 || check != 2 || check != 3) {
print_field(field, size, name_player1);
scanf("%d", &player1);
if(player1 > 0 && player1 < 10) {
field[player1 - 1] = 'X';
check = check_field(field);
}
print_field(field, size, name_player2);
if(check == 1) {
printf("\nИгрок %s выиграл(а)!!!\n", name_player1);
sleep(2);
break;
}
if (check == 3) {
printf("\nНичья\n");
sleep(1.5);
break;
}
scanf("%d", &player2);
if(player2 > 0 && player2 < 10) {
field[player2 - 1] = 'O';
check = check_field(field);
}
if (check == 2) {
printf("\nИгрок %s выиграл(а)!!!\n", name_player2);
sleep(2);
break;
}
if (check == 3) {
printf("\nНичья\n");
sleep(1.5);
break;
}
}
}
int main(void)
{
char *locale = setlocale(LC_ALL, "");
void (*menu[3])(char*, int) = {game_with_computer, game_with_people}; // Меню
// Массив игрового поля
char field[SIZEFIELD] = {SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE};
int choice; // выбор пункта меню
printf("\t\t\tКрестики нолики\n\n");
puts("1) Играть с компьютером");
puts("2) Играть с человеком");
puts("3) Выход");
printf ("( Для выбора пункта меню введите номер пункта) : ");
scanf("%d", &choice);
while(choice >= 0 && choice < 3) {
(*menu[choice - 1])(field, SIZEFIELD);
system("clear");
printf("\t\t\tКрестики нолики\n\n");
puts("1) Играть с компьютером");
puts("2) Играть с человеком");
puts("3) Выход");
printf ("\n( Для выбора пункта меню введите номер пункта) : ");
scanf("%d", &choice);
}
puts("Выход");
return 0;
}