这是实现五子棋落子和判断胜负的源代码,电脑落子涉及的人工智能算法(目前AI属于弱智的随机落子)暂时没有实现。本文重点讲一下胜负判断功能的实现,我们都知道五子棋中获胜的条件就是五联子,而五联子的方向有四种:水平、竖直和两个对角线方向。扫描的思想是在每个落子的位置判断各个方向能扫描的次数(最多为5)。以水平方向为例,数组下标为【5】【5】的从【5】【0】开始判断连往右的五个坐标(即数组元素)的值是否相等,如果是则表明获胜。
#include <stdio.h>
#include <stdlib.h>
#define NO_CHESS "十"
#define RED_CHESS "❤️"
#define BLACK_CHESS "♠️"
#define BOARD_SIZE 15 //定义棋盘的大小
typedef int DataType;
struct Stack
{
DataType arr[BOARD_SIZE][BOARD_SIZE];
int top;
};
//定义一个二维数组来充当棋盘
const char *Chesses[BOARD_SIZE][BOARD_SIZE];
//----函数的声明-----
//初始化棋盘
void initChess(void);
//输出棋盘
void prChess(void);
//判断输赢
void winJudge(char* corlor,int x,int y);
//提示获得胜利
void printWin(char* color);
//横向扫描函数
void horizonScan(char* color,int x,int y);
//纵向扫描函数
void verticalScan(char* color,int x,int y);
//正对角线扫描函数
void diagonalScan(char* color,int x,int y);
//反对角线扫描函数
void opposeDiagonalScan(char* color,int x,int y);
//悔棋函数
void retract();
//-----函数的实现-----
//初始化棋盘
void initChess(void)
{
//把每一个元素赋值为 "十" 用于控制台画出棋盘
for (int i =0; i<BOARD_SIZE; i++)
{
for (int k =0; k<BOARD_SIZE; k++)
{
Chesses[i][k] = NO_CHESS;
}
}
}
//输出棋盘
void prChess(void)
{
printf(" 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14\n");
//打印每个数组元素的值
for (int i =0; i<BOARD_SIZE; i++)//行
{
printf("%02d ",i);
for (int k =0; k<BOARD_SIZE; k++)//列
{
printf("%s ",Chesses[i][k]);
}
//换行
printf("\n");
}
}
//判断输赢
void winJudge(char* color,