1.程序代码
game.h
#define _CRT_SECURE_NO_WARNINGS 1
#ifndef _GAME_H__
#define _GAME_H__
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROW 3
#define COL 3
void init_board(char arr[ROW][COL], int row, int col);
void print_board(char arr[ROW][COL], int row, int col);
void player_move(char arr[ROW][COL], int row, int col);
void computer_move(char arr[ROW][COL], int row, int col);
char check_win(char arr[ROW][COL], int row, int col);
int check_full(char arr[ROW][COL], int row, int col);
#endif// _GAME_H__
text.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
printf("******************************\n");
printf("******* 1.开始游戏 *******\n");
printf("******* 0.退出游戏 *******\n");
printf("******************************\n");
}
void game()
{
char arr[ROW][COL] = { 0 };
srand((unsigned int)time(NULL));
char win = 0;
init_board(arr, ROW, COL);
print_board(arr, ROW, COL);
do
{
player_move(arr, ROW, COL);
print_board(arr, ROW, COL);
win = check_win(arr, ROW, COL);
if (win != ' ')
{
break;
}
computer_move(arr, ROW, COL);
print_board(arr, ROW, COL);
win = check_win(arr, ROW, COL);
if (win != ' ')
{
break;
}
} while (1);
if (win == 'X')
{
printf("玩家赢!\n");
}
else if (win == '0')
{
printf("电脑赢!\n");
}
else if (win == 'H')
{
printf("平局\n");
}
}
void text()
{
int input;
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
break;
}
} while (input);
}
int main()
{
text();
system("pause");
return 0;
}
game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void init_board(char arr[ROW][COL], int row, int col)
{
memset(arr, ' ', row*col * sizeof(arr[0][0]));
}
void print_board(char arr[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (j = 0; j < row; j++)
{
for (i = 0; i < col; i++)
{
printf(" %c ",arr[j][i]);
if (i < (col - 1))
{
printf("|");
}
}
printf("\n");
if (j < (row - 1))
{
for (i = 0; i < col; i++)
{
printf("---");
if (i < (col - 1))
{
printf("|");
}
}
printf("\n");
}
}
}
void player_move(char arr[ROW][COL], int row, int col)
{
int left = 0;
int right = 0;
while (1)
{
printf("玩家走(请输入坐标):");
scanf("%d %d", &left, &right);
if ((left >= 1) && (left <= col) && (right >= 1) && (right <= row))
{
if (arr[left - 1][right - 1] == ' ')
{
arr[left - 1][right - 1] ='X';
break;
}
else
{
printf("此处已被占,请重新输入:\n");
}
}
else
{
printf("该坐标超出范围,请重新输入:\n");
}
}
}
void computer_move(char arr[ROW][COL], int row, int col)
{
int left = 0;
int right = 0;
printf("电脑下:\n");
while (1)
{
right = rand() % 3;
left = rand() % 3;
if (arr[left][right] == ' ')
{
arr[left][right] = '0';
break;
}
}
}
char check_win(char arr[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < col; i++)
{
for (j = 0; j < (row - 2); j++)
{
if ((arr[i][j] == arr[i][j + 1])&&(arr[i][j] == arr[i][j + 2])&&(arr[i][j] != ' '))
{
if (arr[i][j] == 'X')
{
return 'X';
}
else if (arr[i][j] == '0')
{
return '0';
}
}
}
}
for (j = 0; j < row; j++)
{
for (i = 0; i < (col - 2); i++)
{
if ((arr[i][j] == arr[i + 1][j]) && (arr[i][j] == arr[i + 2][j]) && (arr[i][j] != ' '))
{
if (arr[i][j] == 'X')
{
return 'X';
}
else if (arr[i][j] == '0')
{
return '0';
}
}
}
}
for (i = 0; i < (col - 2); i++)
{
for (j = 0; j < (row - 2); j++)
{
if (((arr[i][j] == arr[i + 1][j + 1]) && (arr[i][j] == arr[i + 2][j + 2]) && (arr[i][j] != ' ')) ||
((arr[i + 2][j] == arr[i + 1][j + 1]) && (arr[i][j + 2] == arr[i + 1][j + 1]) && (arr[i][j + 2] != ' ')))
{
if (arr[i + 1][j + 1] == 'X')
{
return 'X';
}
else if (arr[i + 1][j + 1] == '0')
{
return '0';
}
}
}
}
if (check_full(arr, row, col) == 1)
{
return 'H';
}
return ' ';
}
int check_full(char arr[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < col; i++)
{
for (j = 0; j < row; j++)
{
if (arr[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
2.执行结果
可以通过更改COL和ROW,来更改棋盘的大小