Модераторы: Hawk , Romeo , Absurd , DeeJayC , WinMain
SaintBob
Сообщения: 1 Зарегистрирован: 25 ноя 2015, 09:16
25 ноя 2015, 09:19
Всем привет форумчане,прошу помочь,в одном щекотливом деле!Как можно исправить данный код игры крестики нолики,чтобы можно было выбирать размер поля и,как сделать проверку ходов универсальную,а не как у меня!Кому не сложно помогите сделать такое!)Заранее спасибо!
Код: Выделить всё
#include <stdio.h>
#include <stdlib.h>
char matrix[3][3]; /* матрица игры */
char check(void);
void init_matrix(void);
void get_player_move(void);
void get_computer_move(void);
void disp_matrix(void);
int main(void)
{
char done;
printf("Это игра в крестики-нолики.\n");
printf("Вы будете играть против компьютера.\n");
done = ' ';
init_matrix();
do {
disp_matrix();
get_player_move();
done = check(); /* проверка, есть ли победитель */
if(done!= ' ') break; /* есть победитель */
get_computer_move();
done = check(); /* проверка, есть ли победитель */
} while(done== ' ');
if(done=='X') printf("Вы победили!\n");
else printf("Победил компьютер!!!!\n");
disp_matrix(); /* показ финальной позиции */
return 0;
}
/* Инициализация матрицы игры. */
void init_matrix(void)
{
int i, j;
for(i=0; i<3; i++)
for(j=0; j<3; j++) matrix[i][j] = ' ';
}
/* Ход игрока. */
void get_player_move(void)
{
int x, y;
printf("Введите координаты X,Y Вашего хода: ");
scanf("%d%*c%d", &x, &y);
x--; y--;
if(matrix[x][y]!= ' '){
printf("Неверный ход, попытайтесь еще.\n");
get_player_move();
}
else matrix[x][y] = 'X';
}
/* Ход компьютера. */
void get_computer_move(void)
{
int i, j;
for(i=0; i<3; i++){
for(j=0; j<3; j++)
if(matrix[i][j]==' ') break;
if(matrix[i][j]==' ') break;
/* Второй break нужен для выхода из цикла по i */
}
if(i*j==9) {
printf("Конец игры\n");
exit(0);
}
else
matrix[i][j] = 'O';
}
/* Вывод матрицы на экран. */
void disp_matrix(void)
{
int t;
for(t=0; t<3; t++) {
printf(" %c | %c | %c ",matrix[t][0],
matrix[t][1], matrix [t][2]);
if(t!=2) printf("\n---|---|---\n");
}
printf("\n");
}
/* Определение победителя. */
char check(void)
{
int i;
for(i=0; i<3; i++) /* проверка строк */
if(matrix[i][0]==matrix[i][1] &&
matrix[i][0]==matrix[i][2]) return matrix[i][0];
for(i=0; i<3; i++) /* проверка столбцов */
if(matrix[0][i]==matrix[1][i] &&
matrix[0][i]==matrix[2][i]) return matrix[0][i];
/* проверка диагоналей */
if(matrix[0][0]==matrix[1][1] &&
matrix[1][1]==matrix[2][2])
return matrix[0][0];
if(matrix[0][2]==matrix[1][1] &&
matrix[1][1]==matrix[2][0])
return matrix[0][2];
return ' ';
}
Din666
Сообщения: 52 Зарегистрирован: 17 июл 2015, 13:25
Откуда: Moscow
Контактная информация:
26 ноя 2015, 11:44
ну например так:
(этот код не претендует на отсутствие ошибок в математической части)
Код: Выделить всё
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define Rows 3
#define Cols 3
char matrix[Rows][Cols]; /* матрица игры */
char check(void);
void init_matrix(void);
void get_player_move(void);
void get_computer_move(void);
void disp_matrix(void);
int main(void)
{
char done;
printf("Это игра в крестики-нолики.\n");
printf("Вы будете играть против компьютера.\n");
done = ' ';
init_matrix();
do {
disp_matrix();
get_player_move();
done = check(); /* проверка, есть ли победитель */
if(done!= ' ') break; /* есть победитель */
get_computer_move();
done = check(); /* проверка, есть ли победитель */
} while(done== ' ');
if(done=='X') printf("Вы победили!\n");
else printf("Победил компьютер!!!!\n");
disp_matrix(); /* показ финальной позиции */
return 0;
}
/* Инициализация матрицы игры. */
void init_matrix(void)
{
memset(matrix, ' ', sizeof(matrix)); // так быстрее и красивее заполнить весь массив пробелами
}
/* Ход игрока. */
void get_player_move(void)
{
do {
unsigned int x = 0, y = 0; // лучше юзать в данном случае беззнаковый тип, чтобы не проверять на отрицательность
int scanResult = 0;
printf("Введите координаты X,Y Вашего хода: ");
scanResult = scanf("%d%*c%d", &x, &y);
--x; --y;
if(
0 == scanResult // а вдруг ввели не числа
|| y >= Rows // проверим что не вылезли за границу массива
|| x >= Cols
|| ' ' != matrix[x][y]
) {
char c = EOF;
printf("Неверный ход, попытайтесь еще.\n");
while ( (c = getchar()) != '\n' && c != EOF ); // надо очистить входной буфер для следующего scanf
}
else {
matrix[x][y] = 'X';
break;
}
} while(1);
}
/* Ход компьютера. */
void get_computer_move(void)
{
unsigned int i = 0, j = 0;
for(i=0; i<Rows; i++) {
for(j=0; j<Cols; j++) { // в таких местах лучше расставлять фигурные скобочки для понятности кода
if(matrix[i][j]==' ') break;
}
if(matrix[i][j]==' ') break;
/* Второй break нужен для выхода из цикла по i */
}
if(i*j== Rows*Cols) {
printf("Конец игры\n");
exit(0);
}
else
matrix[i][j] = 'O';
}
static void printLine(unsigned int y);
static void printLastLine();
/* Вывод матрицы на экран. */
void disp_matrix(void)
{
unsigned int y = 0;
for(; y < Rows; ++y) {
printLine(y);
printf("\n");
if ( Rows-1 != y) printLastLine();
printf("\n");
}
}
static void printLine(unsigned int y) {
unsigned int x = 0;
for(; x < Cols; ++x) {
printf(
" %c %s" // ' X |'
, matrix[x][y]
, Cols-1 != x ? "|" : ""
);
}
}
static void printLastLine() {
unsigned int x = 0;
for(; x < Cols; ++x) printf("---%s", Cols-1 != x ? "|" : "" );
}
/* Определение победителя. */
char check(void)
{
unsigned int i = 0;
{ // проверка строк
unsigned int y = 0;
for(; y < Rows; ++y) {
unsigned int x = 0;
const char c = matrix[x][y]; // запомним первый элемент строки
++x; // и сравним его с остальными
for(; x < Cols; ++x) if ( c == matrix[x][y] ) return matrix[x][y];
}
}
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// А дальше по аналогии сам догадаешься !!!!!!!!!! ))))
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
for(i=0; i<Rows; i++) /* проверка столбцов */
if(matrix[0][i]==matrix[1][i] &&
matrix[0][i]==matrix[2][i]) return matrix[0][i];
/* проверка диагоналей */
if(matrix[0][0]==matrix[1][1] &&
matrix[1][1]==matrix[2][2])
return matrix[0][0];
if(matrix[0][2]==matrix[1][1] &&
matrix[1][1]==matrix[2][0])
return matrix[0][2];
return ' ';
}