五子棋人机对弈

这是一个使用C语言实现的五子棋游戏,包括绘制棋盘、控制棋子移动、判断胜负等功能。玩家可以执黑子或白子,通过键盘方向键移动光标并用空格键落子。程序会自动检查是否有四子连珠,以判断胜负。
摘要由CSDN通过智能技术生成
#include "windows.h"
#include <stdio.h>  
#include <stdlib.h>    
#include <conio.h>
#ifndef __cplusplus
#include <stdbool.h>   /*包含bool、false */
#endif //__cplusplus
/*****************************************/
#define BOARD 16
COORD g_chessPos={38,18};   /*存储光标位置*/
short g_chessInfo[BOARD][BOARD]; /*g_chessInfo存储棋局信息,白子置为1,黑子为2,空则为0*/ 
/*****************************************/ 
void map(void);          //绘制棋盘 
void gotoxy(short,short);
void down(short,short);  //落子 
void play(int);               
void run(void);
void showCursor(void);   //显示光标
void clsCursor(void);    //清除光标
void mark(int) ;        //参数为1标记白子,参数为0标记黑子 
void printInfo(void);   //输出信息
bool isEmpty(short,short);     //有棋子则为false 
bool isWin(int);    /*判断是否获胜,true为获胜,int参数为1白子 ,2为黑子*/ 
void generateWay(void);
bool isWin(int);    /*判断是否获胜,true为获胜,int参数为1白子 ,2为黑*/ 
int counter(short,short,short);
int mmax(int ,int);
/*****************************************/
int main(int argc, char *argv[]) {  
	system("mode con lines=36 cols=100");   //设置控制台大小 
	system("color f0");         
	CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };	//隐藏光标
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
	printInfo();
	map();
	showCursor();
	run();
	down(g_chessPos.X,g_chessPos.Y);
	system("pause");
	return 0;
}  
void gotoxy(short x,short y)
{
	HANDLE s_hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
	COORD coord={x,y};
	SetConsoleCursorPosition(s_hConsole,coord);
}
void map(void)
{
	short x,y;
	for( x=10;x<=70;x+=4)
	{
		for( y=2;y<=32;y+=2)
		{
			gotoxy(x,y);    printf("╋━");
			gotoxy(x,y+1);  printf("┃");
		}
	}
	/*清除棋盘多余部分*/
	for(y=2;y<=32;y+=2)
	{
		gotoxy(70+2,y);printf(" ");
	}
	for(x=10;x<=70;x+=4)
	{
		gotoxy(x,32+1);printf(" ");
	}
}
void printInfo(void)
{
	gotoxy(76, 9);printf("控制:"); 
	gotoxy(76,10);printf("↓ ↑ ← →控制移动"); 
	gotoxy(76,11);printf("空格键落子");
	gotoxy(76,12);printf("按Esc退出"); 
}
void down(short x,short y)
{ 
   //黑子下棋 
	gotoxy(x,y);
	printf("●");
	mark(0);      //标记为黑子 
	if(isWin(2))  //判断黑棋是否获胜 
	{
		gotoxy(38,18);printf("黑子获胜");
		system("pause");
	}    
	//白子下棋 
	gotoxy(76,16);printf("执白子");
	generateWay();
	mark(1);   //标记白子 
	if(isWin(1))
	{
		 gotoxy(38,18);printf("bai子获胜");
		 system("pause");
	}
	gotoxy(76,16);printf("执黑子");
}
int mmax(int x,int y)
{
	return x>=y?x:y;
}
void run(void)
{
	gotoxy(76,16);printf("执黑子");
	while(1)
		if(_kbhit())
			play(_getch());
}
bool isEmpty(short x,short y)
{
	if(g_chessInfo[(x-10)/4] [(y-2)/2])
	    return false;
	return true;
}
void mark(int i) 
{
	/*i为1,白子置为1,i为0置黑子为2*/ 
	g_chessInfo[(g_chessPos.X-10)/4] [(g_chessPos.Y-2)/2]=(i?1:2);
}
void play(int c)
{
	clsCursor();
	switch(c)
	{
	case 72:    //上
		if(g_chessPos.Y-2>=2)  /*确保在棋盘内*/
			g_chessPos.Y-=2;
		break;     
	case 80:    //下	
		if(g_chessPos.Y+2<=32)
			g_chessPos.Y+=2;   
		break;     
	case 75:    //左
		if(g_chessPos.X-4>=10)
			g_chessPos.X-=4;   
		break;     	 
	case 77:    //右
		if(g_chessPos.X+4<=70)
			g_chessPos.X+=4;   
		break;     
	case 32:   //空格落子
	    if(isEmpty(g_chessPos.X,g_chessPos.Y))
		    down(g_chessPos.X,g_chessPos.Y);
		break;
	case 27:   //Esc键
		exit(1);
		break;
	}
	showCursor();
}
void showCursor(void)
{
	gotoxy(g_chessPos.X-2,g_chessPos.Y-1);printf("┏━┓");
	gotoxy(g_chessPos.X-2,g_chessPos.Y+1);printf("┗━┛");
}
void clsCursor(void)
{
	gotoxy(g_chessPos.X-2,g_chessPos.Y-1);printf("     ");
	gotoxy(g_chessPos.X-2,g_chessPos.Y+1);printf("     ");
	if(g_chessPos.Y!=2)
	{
		gotoxy(g_chessPos.X,g_chessPos.Y-1);
		printf("┃");
	}
	if(g_chessPos.Y!=32)
	{
		gotoxy(g_chessPos.X,g_chessPos.Y+1);
		printf("┃");
	}
}
void generateWay()
{
	short i,j;
	int num1=0,num2=0;
	COORD cd1={42,22},cd2={42,22};
	for(i=10;i<=70;i+=4)
	{
		for(j=2;j<=32;j+=2)
		{
			if(isEmpty(i,j))
			{
				if(num1<counter(i,j,1))
				{
					cd1.X=i; cd1.Y=j;
					num1=counter(i,j,1);
				}
				if(num2<counter(i,j,2))
				{
					cd2.X=i;cd2.Y=j;
					num2=counter(i,j,2);
				}
			}
		}
	}
	if(num1>=4) 
		g_chessPos=cd1;
	else if(num2>=4)
		g_chessPos=cd2;
	else if(num1>=3)
		g_chessPos=cd1;
	else if(num2>=3)
		g_chessPos=cd2;
	else if(num1>=2)
		g_chessPos=cd1;
	else if(num2>=2)
		g_chessPos=cd2;
	else
		g_chessPos=cd2;
	gotoxy(g_chessPos.X,g_chessPos.Y);printf("○");
}
int counter(short cx,short cy,short t)
	/*不会做,抄某位前辈的,呵呵......*/
{
	int i,j,num,tnum;
    int x=(cx-10)/4;	
	int y=(cy-2)/2;
    /
	i=x+1;j=y;num=0,tnum=0;				//横向向右
	while(i>=0&&i<BOARD&&t==g_chessInfo[i][j]){++num;++i;}
	i=x-1;					    //横向向左
	while(i>=0&&i<BOARD&&t==g_chessInfo[i][j]){++num;--i;} 
    tnum=mmax(tnum,num);
	/
	i=x;j=y+1;num=0;				//纵向向下			
	while(j>=0&&j<BOARD&&t==g_chessInfo[i][j]){++num;++j;}
	j=y-1;					//纵向向上
	while(j>=0&&j<BOARD&&t==g_chessInfo[i][j]){++num;--j;} 
    tnum=mmax(tnum,num);
	/
	i=x+1;j=y+1;num=0;				//左斜向下		
	while(j>=0&&j<BOARD&&t==g_chessInfo[i][j]){++num;++i;++j;}
	i=x-1;j=y-1;				//左斜向上
	while(j>=0&&j<BOARD&&t==g_chessInfo[i][j]){++num;--i;--j;} 
    tnum=mmax(tnum,num);
	i=x-1;j=y+1;num=0;				//右斜向下			
	while(j>=0&&j<BOARD&&t==g_chessInfo[i][j]){++num;--i;++j;}
	i=x+1;j=y-1;				//右斜向向上
	while(j>=0&&j<BOARD&&t==g_chessInfo[i][j]){++num;++i;--j;} 
    return mmax(tnum,num);
}
bool isWin(int tmp)
{
	if(counter(g_chessPos.X,g_chessPos.Y,tmp)>=4)
		return true;
	return false;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值