(test.h)
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
extern void Game();
#define COL 3
#define ROW 3
#define INIT ' '
#define PLAYER 'X'//玩家赢的返回值
#define COM 'O'//电脑
#define DRAW 'D'//平局
#define NEXT 'N'//继续下一步
( main .c)
#include"test.h"
void Menu()
{
printf("+-----------------------------------+\n");
printf("| 1.游戏 --------- 0.退出 |\n");
printf("+-----------------------------------+\n");
}
int main()
{
int select, flag = 1;
while (flag)
{
Menu();
printf("请输入:");
scanf_s("%d", &select);
switch (select)
{
case 0:
flag = 0;
break;
case 1:
Game();
break;
default:
printf("输入有问题!!!\n");
break;
}
}
printf("结束,再见");
}
(test.c)
#include"test.h"
static void InitBoard(char board[ROW][COL], int row, int col)//初始化数组
{
for (int i = 0; i < ROW; i++)
for (int j = 0; j < COL; j++)
board[i][j] = INIT;
}
static void Showboard(char board[ROW][COL], int row, int col)//展示面板
{
system("cls");
for (int i = 0; i < ROW; i++)
printf("%4d", i + 1);
printf("\n--------------\n");
for (int i = 0; i < row; i++)
{
printf("%-2d", i+1 );
for (int j = 0; j < col; j++)
{
printf("| %c ", board[i][j]);
}
printf("\n--------------\n");
}
}
static char Isend(char board[ROW][COL], int row, int col)//是否结束判断
{
for (int i = 0; i < row; i++)//对九宫格内每行进行判断,是否有连成一条线的
//如果有的话,返回该行的内容字符
{
if (board[i][0] == board[i][1] &&
board[i][1] == board[i][2] &&
board[i][0] != INIT)
return board[i][0];
}
for (int j = 0; j < col; j++)//对九宫格内每列进行判断,是否有连成一条线的
//如果有的话,返回该行的内容字符
{
if (board[0][j] == board[1][j] &&
board[1][j] == board[2][j] &&
board[0][j] != INIT)
return board[0][j];
}
if (board[0][0] == board[1][1] &&
board[1][1] == board[2][2] &&
board[1][1] != INIT)//对角线判断
return board[1][1];
if (board[0][2] == board[1][1] &&
board[1][1] == board[2][0] &&
board[1][1] != INIT)//对角线判断
return board[1][1];
for (int i = 0; i < ROW; i++)//判断数组内是否有空格,也就是判断还能不能继续走
for (int j = 0; j < COL; j++)
if (board[i][j] == INIT)
{
return NEXT;
}
return DRAW;//如果走到这一步说明前面都没有 return,且没有成功和所有格子走满,说明平局
}
static void Playermove(char board[ROW][COL], int row, int col)//玩家走一步
{
int x = 0, y = 0;
while (1)//一直循环,直到输入正确坐标才能退出
{
printf("请输入要走的坐标(x,y):");
scanf_s("%d%d", &x, &y);
if (x < 1 || x>3 || y < 1 || y>3)
{
printf("你输入的坐标有问题!!!\n");
continue;
}
if (board[x - 1][y - 1] != INIT)
{
printf("你输入的坐标已经被走了\n");
continue;
}
else
{
board[x - 1][y - 1] = PLAYER;
break;
}
}
}
static void Compultermove(char board[ROW][COL], int row, int col)//电脑走下一步
{
while (1)
{
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == INIT)//寻找能走的格子,当前不符合就一直随机
{
board[x][y] = COM;
break;
}
}
}
void Game()
{
char board[ROW][COL];
InitBoard(board, ROW, COL);//初始化数组
srand((unsigned long)time(NULL));//种一个随机数种子,电脑的每一步都是随机的
char result;
while (1)
{
Showboard(board, ROW, COL);//展示面板(这个函数内存在清屏操作,每次显示前进行清屏)
Playermove(board, ROW, COL); //玩家走一步
result = Isend(board, ROW, COL);//是否结束判断
if (result != NEXT)
break;
Compultermove(board, ROW, COL);//电脑走下一步
result = Isend(board, ROW, COL);//是否结束判断
if (result != NEXT)
break;
}
switch (result)
{
case PLAYER:
printf("你赢了!!!\n");
break;
case COM:
printf("你好菜,电脑赢了\n");
break;
case DRAW:
printf("你居然和电脑不分伯仲,小辣鸡\n");
break;
default:
printf("包看了,电脑出BUG了!!!\n");
break;
}