震惊!100行代码做出人机对战五子棋?!
  • 板块灌水区
  • 楼主JoeBiden2020
  • 当前回复21
  • 已保存回复21
  • 发布时间2022/2/14 21:40
  • 上次更新2023/10/28 08:30:57
查看原帖
震惊!100行代码做出人机对战五子棋?!
432183
JoeBiden2020楼主2022/2/14 21:40
#include<stdio.h>
#include<math.h>
#include<windows.h>
const int mSize=15;
int board[mSize+1][mSize+1],value[mSize+1][mSize+1],optX=1,optY=1;
int move_x,move_y,maxn;
void gotoxy(short x,short y){
    COORD coord={x,y}; 
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
}
int GetLineValue(int x,int y){
	if(board[x][y]!=0)return -114514;
	int cnt1=0,cnt2=0,pt=board[x-1][y],pm=board[x+1][y];
	for(int i=x-1;i>=1&&board[i][y]!=0;i--){
		if(board[i][y]==pt)cnt1++;
		else break;
	}
	if(cnt1>=3)cnt1=15;
	for(int i=x+1;i<=mSize&&board[i][y]!=0;i--){
		if(board[i][y]==pm)cnt2++;
		else break;
	}
	if(cnt2>=3)cnt2=15;
	return (int)pow(cnt1,3)*pt+pow(cnt1,3)*pm;
}
int GetColValue(int x,int y){
	if(board[x][y]!=0)return -114514;
	int cnt1=0,cnt2=0,pt=board[x][y-1],pm=board[x][y+1];
	for(int i=y-1;i>=1&&board[x][i]!=0;i--){
		if(board[x][i]==pt)cnt1++;
		else break;
	}
	if(cnt1>=3)cnt1=15;
	for(int i=y+1;i<=mSize&&board[x][i]!=0;i--){
		if(board[x][i]==pm)cnt2++;
		else break;
	}
	if(cnt2>=3)cnt2=15;
	return (int)pow(cnt1,3)*pt+pow(cnt1,3)*pm;
}
int GetFalValue(int x,int y){
	if(board[x][y]!=0)return -114514;
	int cnt=0,pt=board[x+1][y+1],pm=board[x-1][y-1],pq=board[x+1][y-1],ps=board[x-1][y+1];
	for(int i=1;board[x+i][y+i]==pt&&x+i<=mSize&&y+i<=mSize&&pt;i++)cnt++;
	for(int i=1;board[x-i][y-i]==pm&&x-i>0&&y-i>0&&pm;i++)cnt++;
	for(int i=1;board[x+i][y-i]==pm&&x+i<=mSize&&y-i>0&&pq;i++)cnt++;
	for(int i=1;board[x-i][y+i]==pm&&x-i>0&&y+i<=mSize&&ps;i++)cnt++;
	return (cnt*cnt*cnt)/4;
}
void CalculateVal(){
	maxn=-1;
	memset(value,0,sizeof(value));
	for(int i=1;i<=mSize;i++){
		for(int j=1;j<=mSize;j++){
			value[i][j]=GetLineValue(i,j)+GetColValue(i,j)+GetFalValue(i,j);
			value[7][7]=90000;
			if(value[i][j]>maxn&&!board[i][j]){
				maxn=value[i][j];
				move_x=i;move_y=j;
			}
		}
	}
} 
void AiMove(){
	CalculateVal();
	board[move_x][move_y]=1;
}
void PlayerMove(){
	puts("Version 1.02 Developed by JoeBiden2020 at Luogu");
	puts("Player,input the position that you want to place.");
	printf("%d\n",value[1][7]); 
	scanf("%d%d",&move_x,&move_y);
	if(!board[move_x][move_y])board[move_x][move_y]=2;
} 
void PrintBoard(){
	gotoxy(0,0); 
	puts(" 1  2  3  4  5  6  7  8  9 10 11 12");
	puts("-------------------------------------");
	for(int i=1;i<=12;i++){
		for(int j=1;j<=12;j++){
			printf("| ");
			if(board[i][j]==0)putchar(' ');
			if(board[i][j]==1)putchar('X');
			if(board[i][j]==2)putchar('O');
		}
		printf("| %d\n",i);
		printf("-------------------------------------\n");
	}
}
void CheckWin(){
	for(int i=1;i<=mSize;i++){
		for(int j=1;j<=mSize;j++){
			int s=board[i][j];
			bool flag=0;
			if(s==0)continue;
			if(j+4<=mSize)if(board[i][j+1]==s&&board[i][j+2]==s&&board[i][j+3]==s&&board[i][j+4]==s)flag=1;
			if(j-4>0)if(board[i][j-1]==s&&board[i][j-2]==s&&board[i][j-3]==s&&board[i][j-4]==s)flag=1;
			if(i+4<=mSize)if(board[i+1][j]==s&&board[i+2][j]==s&&board[i+3][j]==s&&board[i+4][j]==s)flag=1;
			if(i-4>0)if(board[i-1][j]==s&&board[i-2][j]==s&&board[i-3][j]==s&&board[i-4][j]==s)flag=1;
			if(j+4<=mSize&&i+4<=mSize)
			if(board[i+1][j+1]==s&&board[i+2][j+2]==s&&board[i+3][j+3]==s&&board[i+4][j+4]==s)flag=1;
			if(j-4>0&&i-4>0)
			if(board[i-1][j-1]==s&&board[i-2][j-2]==s&&board[i-3][j-3]==s&&board[i-4][j-4]==s)flag=1;
			if(j+4<=mSize&&i-4>0)
			if(board[i-1][j+1]==s&&board[i-2][j+2]==s&&board[i-3][j+3]==s&&board[i-4][j+4]==s)flag=1;
			if(j-4>0&&i+4<=mSize)
			if(board[i+1][j-1]==s&&board[i+2][j-2]==s&&board[i+3][j-3]==s&&board[i+4][j-4]==s)flag=1;
			if(flag){
				PrintBoard();
				puts(s==1?"\n\nAI WINS!":"\n\nPLAYER WINS!");
				system("pause");
				exit(0);
			}
		}
	}
}
int main(){
	while(1){
		AiMove();
		CheckWin();
		PrintBoard();
		PlayerMove();
		CheckWin();
		PrintBoard();
	}
}

AI“非常聪明”。

2022/2/14 21:40
加载中...