一个你永远都赢不了的三子棋

这是一个你永远都赢不了的三子棋,先将代码放出来,感兴趣的可以试一下。

为了方便讲解,我将代码放在了三个区域:

game.h头文件

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <time.h>
#define ROW 3
#define COL 3
void Initboard(char board[ROW][COL], int row, int col);
void Displayboard(char board[ROW][COL], int row, int col);
void Playertime(char board[ROW][COL], int row, int col);
void Computertime(char board[ROW][COL], int row, int col);
char Win(char board[ROW][COL], int row, int col);
int Full(char board[ROW][COL], int row, int col);

test.c源文件:

#include "game.h"
void game()
{
	char ret = 0;
	char board[ROW][COL];
	Initboard(board, ROW, COL);
	Displayboard(board, ROW, COL);
	while(1)
	{
		Playertime(board, ROW, COL);
		ret = Win(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
		Computertime(board, ROW, COL);
		ret = Win(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
	}
	if (ret == '*')
	{
		system("cls");
		printf("你赢了,");
		printf("游戏结果:\n");
		Displayboard(board, ROW, COL);
	}
	else if (ret == '#')
	{
		system("cls");
		printf("电脑赢了,");
		printf("游戏结果:\n");
		Displayboard(board, ROW, COL);
	}
	else
	{
		system("cls");
		printf("平局");
		printf("游戏结果:\n");
		Displayboard(board, ROW, COL);
	}
}
void menu()
{
	printf("********************\n");
	printf("*******1.play*******\n");
	printf("*******0.exit*******\n");
	printf("********************\n");
}
int main()
{
	int input = 0;
	int inputt = 0;
	srand((unsigned int)time(NULL));
	do {
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			Sleep(1000);
			system("cls");
			begin:
			game();
			printf("想要再来一盘吗?\n");
			printf("再来一盘请按1\n");
			printf("按其它键结束游戏\n");
			scanf("%d", &inputt);
			if (inputt == 1)
			{
				system("cls");
				goto begin;
			}
			else
			{
				printf("退出游戏中");
				Sleep(1000);
				system("cls");
				printf("退出成功");
				Sleep(1000);
				system("cls");
				goto end;
			}
		case 0:
			printf("退出游戏中");
			Sleep(1000);
			system("cls");
			printf("退出成功");
			Sleep(1000);
			system("cls");
			break;
		default:
			printf("选择错误,请重新选择");
			Sleep(1000);
			system("cls");
			break;
		}
	} while (input);
	end:
	return 0;
}

game.c源文件:

#include "game.h"
void Initboard(char board[ROW][COL], int row, int col)
{
	int i, j;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}
void Displayboard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for(j = 0;j < col-1 ; j++)
		{
			printf(" %c |", board[i][j]);
			if (j == 1)
			{
				printf(" %c", board[i][j+1]);
			}
			if (j == col - 2 && i != row-1)
			{
				printf("\n");
				for (j = 0; j < col; j++)
					if (j < col - 1)
					{
						printf("---|");
					}
					else
					{
						printf("---");
					}
			}
		}
		printf("\n");
	}
}
void Playertime(char board[ROW][COL], int row, int col)
{
	int x = 1;
	int y = 1;
	again:
	printf("请玩家下棋(输入坐标)\n");
	scanf("%d %d", &x, &y);
	while (1)
	{
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '*';
				system("cls");
				Displayboard(board, ROW, COL);
				break;
			}
			else
			{
				printf("此位已被占用,请重新输入\n");
				Sleep(1500);
				system("cls");
				Displayboard(board, ROW, COL);
				goto again;
			}
		}
		else
		{
			printf("输入错误,请重新输入");
			Sleep(1000);
			system("cls");
			Displayboard(board, ROW, COL);
			goto again;
		}
	}
}
void Computertime(char board[ROW][COL], int row, int col)
{
	printf("电脑正在下棋\n");
	int i = 0;
	int j = 0;
	int w = 0, p = 0;
	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < COL; j++)
		{
			if (board[i][j] == '*')
			{
				w++;
			}
			if (board[i][j] == '#')
			{
				p++;
			}
		}
	}
	Sleep(1000);
	if (board[1][1] == '*')
	{
		for (i = 0; i < row; i++)
		{
			if ((board[i][0] == board[i][1] && board[i][0] == '#') || (board[i][2] == board[i][1] && board[i][1] == '#') || (board[i][0] == board[i][2] && board[i][2] == '#'))
			{
				for (j = 0; j < COL; j++)
				{
					if (board[i][j] == ' ')
					{
						board[i][j] = '#';
						system("cls");
						Displayboard(board, ROW, COL);
						goto end;
					}
				}
			}
		}
		for (j = 0; j < col; j++)
		{
			if ((board[0][j] == board[1][j] && board[0][j] == '#') || (board[2][j] == board[1][j] && board[1][j] == '#') || (board[0][j] == board[2][j] && board[0][j] == '#'))
			{
				for (i = 0; i < COL; i++)
				{
					if (board[i][j] == ' ')
					{
						board[i][j] = '#';
						system("cls");
						Displayboard(board, ROW, COL);
						goto end;
					}
				}
			}
		}
		if ((board[0][0] == board[1][1] && board[0][0] == '#') || (board[2][2] == board[1][1] && board[1][1] == '#') || (board[0][0] == board[2][2] && board[0][0] == '#'))
		{
			for (j = 0; j < COL; j++)
			{
				if (board[j][j] == ' ')
				{
					board[j][j] = '#';
					system("cls");
					Displayboard(board, ROW, COL);
					goto end;
				}
			}
		}
		if ((board[0][2] == board[1][1] && board[0][2] == '#') || (board[2][0] == board[1][1] && board[1][1] == '#') || (board[2][0] == board[0][2] && board[2][0] == '#'))
		{
			for (j = 0; j < COL; j++)
			{
				if (board[j][2 - j] == ' ')
				{
					board[j][2 - j] = '#';
					system("cls");
					Displayboard(board, ROW, COL);
					goto end;
				}
			}
		}
			if (board[1][1] == '*' && w == 1)
			{
				int x = rand() % (row + 1);
				if (x == 0)
				{
					board[0][2] = '#';
					system("cls");
					Displayboard(board, ROW, COL);
				}
				if (x == 1)
				{
					board[2][0] = '#';
					system("cls");
					Displayboard(board, ROW, COL);
				}
				if (x == 2)
				{
					board[0][0] = '#';
					system("cls");
					Displayboard(board, ROW, COL);
				}
				if (x == 3)
				{
					board[2][2] = '#';
					system("cls");
					Displayboard(board, ROW, COL);
				}
			}
			else
			{
				for(int x=0;x<ROW;x++)
				{
					for(int y=0;y<COL;y++)
					{
						if (board[x][y] == '*' && board[2 - x][2 - y] == ' ' && (!(x == 1 && y == 1)))
						{
							board[2 - x][2 - y] = '#';
							system("cls");
							Displayboard(board, ROW, COL);
							goto end;
						}
					}
				}
				if (((board[0][0] == board[1][1]) && (board[0][0] == ' ') && (board[2][2] == '#')) || ((board[2][2] == board[1][1]) && (board[1][1] == ' ') && (board[0][0] == '#')) || ((board[0][0] == board[2][2]) && (board[0][0] == ' ') && (board[1][1] == '#')))
				{
					for (j = 0;; j += 2)
					{
						if (board[j][j] == ' ')
						{
							board[j][j] = '#';
							system("cls");
							Displayboard(board, ROW, COL);
							goto end;
						}
					}
				}
				if ((board[0][2] == board[1][1] && (board[0][2] == ' ') && board[2][0] == '#') || (board[2][0] == board[1][1] && (board[1][1] == ' ') && board[0][2] == '#') || (board[2][0] == board[0][2] && (board[2][0] == ' ') && board[1][1] == '#'))
				{
					for (j = 0;; j += 2)
					{
						if (board[j][2 - j] == ' ')
						{
							board[j][2 - j] = '#';
							system("cls");
							Displayboard(board, ROW, COL);
							goto end;
						}
					}
				}
				for (i = 0; i < row; i++)
				{
					if ((board[i][0] == board[i][1] && (board[i][0] == ' ') && board[i][2] == '#') || (board[i][2] == board[i][1] && (board[i][1] == ' ') && board[i][0] == '#') || (board[i][0] == board[i][2] && (board[i][2] == ' ') && board[i][1] == '#'))
					{
						for (j = 0;; j += 2)
						{
							if (board[i][j] == ' ')
							{
								board[i][j] = '#';
								system("cls");
								Displayboard(board, ROW, COL);
								goto end;
							}
						}
					}
				}
				for (j = 0; j < col; j++)
				{
					if ((board[0][j] == board[1][j] && (board[0][j] == ' ') && board[2][j] == '#') || (board[2][j] == board[1][j] && (board[1][j] == ' ') && board[0][j] == '#') || (board[0][j] == board[2][j] && (board[0][j] == ' ') && board[1][j] == '#'))
					{
						for (i = 0;; i += 2)
						{
							if (board[i][j] == ' ')
							{
								board[i][j] = '#';
								system("cls");
								Displayboard(board, ROW, COL);
								goto end;
							}
						}
					}
				}
				while (1)
				{
					int f = rand() % 3;
					int h = rand() % 3;
					if (board[f][h] == ' ')
					{
						board[f][h] = '#';
						system("cls");
						Displayboard(board, ROW, COL);
						break;
					}
				}
			}
	}
	else
	{
		for (i = 0; i < row; i++)
		{
			if ((board[i][0] == board[i][1] && board[i][0] == '#') || (board[i][2] == board[i][1] && board[i][1] == '#') || (board[i][0] == board[i][2] && board[i][2] == '#'))
			{
				for (j = 0; j < COL; j++)
				{
					if (board[i][j] == ' ')
					{
						board[i][j] = '#';
						system("cls");
						Displayboard(board, ROW, COL);
						goto end;
					}
				}
			}
		}
		for (j = 0; j < col; j++)
		{
			if ((board[0][j] == board[1][j] && board[0][j] == '#') || (board[2][j] == board[1][j] && board[1][j] == '#') || (board[0][j] == board[2][j] && board[0][j] == '#'))
			{
				for (i = 0; i < COL; i++)
				{
					if (board[i][j] == ' ')
					{
						board[i][j] = '#';
						system("cls");
						Displayboard(board, ROW, COL);
						goto end;
					}
				}
			}
		}
		if ((board[0][0] == board[1][1] && board[0][0] == '#') || (board[2][2] == board[1][1] && board[1][1] == '#') || (board[0][0] == board[2][2] && board[0][0] == '#'))
		{
			for (j = 0; j < COL; j++)
			{
				if (board[j][j] == ' ')
				{
					board[j][j] = '#';
					system("cls");
					Displayboard(board, ROW, COL);
					goto end;
				}
			}
		}
		if ((board[0][2] == board[1][1] && board[0][2] == '#') || (board[2][0] == board[1][1] && board[1][1] == '#') || (board[2][0] == board[0][2] && board[2][0] == '#'))
		{
			for (j = 0; j < COL; j++)
			{
				if (board[j][2 - j] == ' ')
				{
					board[j][2 - j] = '#';
					system("cls");
					Displayboard(board, ROW, COL);
					goto end;
				}
			}
		}
		if (board[1][1] == ' ')
			{
				board[1][1] = '#';
				system("cls");
				Displayboard(board, ROW, COL);
			}
		else
			{
			if ((board[0][0] == board[1][1] && board[0][0] == '*') || (board[2][2] == board[1][1] && board[1][1] == '*') || (board[0][0] == board[2][2] && board[0][0] == '*'))
			{
				for (j = 0; j < COL; j++)
				{
					if (board[j][j] == ' ')
					{
						board[j][j] = '#';
						system("cls");
						Displayboard(board, ROW, COL);
						goto end;
					}
				}
			}
			if ((board[0][2] == board[1][1] && board[0][2] == '*') || (board[2][0] == board[1][1] && board[1][1] == '*') || (board[2][0] == board[0][2] && board[2][0] == '*'))
			{
				for (j = 0; j < COL; j++)
				{
					if (board[j][2 - j] == ' ')
					{
						board[j][2 - j] = '#';
						system("cls");
						Displayboard(board, ROW, COL);
						goto end;
					}
				}
			}
			for (i = 0; i < row; i++)
				{
					if ((board[i][0] == board[i][1] && board[i][0] == '*') || (board[i][2] == board[i][1] && board[i][1] == '*') || (board[i][0] == board[i][2] && board[i][2] == '*'))
					{
						for (j = 0; j < COL; j++)
						{
							if (board[i][j] == ' ')
							{
								board[i][j] = '#';
								system("cls");
								Displayboard(board, ROW, COL);
								goto end;
							}
						}
					}
				}
			for (j = 0; j < col; j++)
				{
					if ((board[0][j] == board[1][j] && board[0][j] == '*') || (board[2][j] == board[1][j] && board[1][j] == '*') || (board[0][j] == board[2][j] && board[0][j] == '*'))
					{
						for (i = 0; i < COL; i++)
						{
							if (board[i][j] == ' ')
							{
								board[i][j] = '#';
								system("cls");
								Displayboard(board, ROW, COL);
								goto end;
							}
						}
					}
				}
			for (i = 0; i < row; i++)
				{
				if ((board[i][0] == board[i][1] && (board[i][0] == ' ') && board[i][2] == '#') || (board[i][2] == board[i][1] && (board[i][1] == ' ') && board[i][0] == '#') || (board[i][0] == board[i][2] && (board[i][2] == ' ') && board[i][1] == '#'))
					{
						for (j = 0;; j += 2)
						{
							if (board[i][j] == ' ')
							{
								board[i][j] = '#';
								system("cls");
								Displayboard(board, ROW, COL);
								goto end;
							}
						}
					}
				}
			for (j = 0; j < col; j++)
				{
				if ((board[0][j] == board[1][j] && (board[0][j] == ' ') && board[2][j] == '#') || (board[2][j] == board[1][j] && (board[1][j] == ' ') && board[0][j] == '#') || (board[0][j] == board[2][j] && (board[0][j] == ' ') && board[1][j] == '#'))
					{
						for (i = 0;; i += 2)
						{
							if (board[i][j] == ' ')
							{
								board[i][j] = '#';
								system("cls");
								Displayboard(board, ROW, COL);
								goto end;
							}
						}
					}
				}
			if (((board[0][0] == board[1][1]) && (board[0][0] == ' ') && (board[2][2] == '#')) || ((board[2][2] == board[1][1]) && (board[1][1] == ' ') && (board[0][0] == '#')) || ((board[0][0] == board[2][2]) && (board[0][0] == ' ') && (board[1][1] == '#')))
			{
				for (j = 0; j < COL; j++)
				{
					if (board[j][j] == ' ')
					{
						board[j][j] = '#';
						system("cls");
						Displayboard(board, ROW, COL);
						goto end;
					}
				}
			}
			if ((board[0][2] == board[1][1] && (board[0][2] == ' ') && board[2][0] == '#') || (board[2][0] == board[1][1] && (board[1][1] == ' ') && board[0][2] == '#') || (board[2][0] == board[0][2] && (board[2][0] == ' ') && board[1][1] == '#'))
			{
				for (j = 0; j < COL; j++)
				{
					if (board[j][2 - j] == ' ')
					{
						board[j][2 - j] = '#';
						system("cls");
						Displayboard(board, ROW, COL);
						goto end;
					}
				}
			}
		    while (1)
					{
						int f = rand() % 3;
						int h = rand() % 3;
						if (board[f][h] == ' ')
						{
							board[f][h] = '#';
							system("cls");
							Displayboard(board, ROW, COL);
							break;
						}
					}	
		    }
	}
end:
	;
}
int Full(char board[ROW][COL], int row, int col)
{
	int i, j;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				return 0;
			}
		}
	}
	return 1;
}
char Win(char board[ROW][COL], int row, int col)
{
	int i,j;
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][2] == board[i][1] && board[i][1] != ' ')
		{
			return board[i][0];
		}
	}
	for (j = 0; j < col; j++)
	{
		if (board[0][j] == board[1][j] && board[2][j] == board[1][j] && board[1][j] != ' ')
		{
			return board[0][j];
		}
	}
	if (board[0][0] == board[1][1] && board[2][2] == board[1][1] && board[1][1] != ' ')
	{
		return board[0][0];
	}
	if (board[0][2] == board[1][1] && board[2][0] == board[1][1] && board[1][1] != ' ')
	{
		return board[0][0];
	}
	int full=Full(board, ROW, COL);
	if (full == 1)
	{
		return 'Q';
	}
	if (full == 0)
	{
		return 'C';
	}
}

这里的重头戏当然就是电脑执行的部分,首先我将下面这一部分代码,即电脑防玩家的部分命名为"电脑防"

if ((board[0][0] == board[1][1] && board[0][0] == '*') || (board[2][2] == board[1][1] && board[1][1] == '*') || (board[0][0] == board[2][2] && board[0][0] == '*'))
{
	for (j = 0; j < COL; j++)
	{
		if (board[j][j] == ' ')
		{
			board[j][j] = '#';
			system("cls");
			Displayboard(board, ROW, COL);
			goto end;
		}
	}
}
if ((board[0][2] == board[1][1] && board[0][2] == '*') || (board[2][0] == board[1][1] && board[1][1] == '*') || (board[2][0] == board[0][2] && board[2][0] == '*'))
{
	for (j = 0; j < COL; j++)
	{
		if (board[j][2 - j] == ' ')
		{
			board[j][2 - j] = '#';
			system("cls");
			Displayboard(board, ROW, COL);
			goto end;
		}
	}
}
for (i = 0; i < row; i++)
	{
		if ((board[i][0] == board[i][1] && board[i][0] == '*') || (board[i][2] == board[i][1] && board[i][1] == '*') || (board[i][0] == board[i][2] && board[i][2] == '*'))
		{
			for (j = 0; j < COL; j++)
			{
				if (board[i][j] == ' ')
				{
					board[i][j] = '#';
					system("cls");
					Displayboard(board, ROW, COL);
					goto end;
				}
			}
		}
	}
for (j = 0; j < col; j++)
	{
		if ((board[0][j] == board[1][j] && board[0][j] == '*') || (board[2][j] == board[1][j] && board[1][j] == '*') || (board[0][j] == board[2][j] && board[0][j] == '*'))
		{
			for (i = 0; i < COL; i++)
			{
				if (board[i][j] == ' ')
				{
					board[i][j] = '#';
					system("cls");
					Displayboard(board, ROW, COL);
					goto end;
				}
			}
		}
	}

这里的两个if是防守两条斜线的,即如果在一条线上有两个玩家的棋时就得防守

两个for语句则是防守竖着三列和横着三排的

然后我将下面这一部分电脑在不需要防御时攻击玩家的部分拷贝下来,简称"电脑攻"跟"电脑防"相似,两条斜线方向和三条竖线三条横线上若有一个地方是棋盘下的而其他两处是空的,则可以下在两个地方的其中一处,而优先下在哪里下面会细讲

if (((board[0][0] == board[1][1]) && (board[0][0] == ' ') && (board[2][2] == '#')) || ((board[2][2] == board[1][1]) && (board[1][1] == ' ') && (board[0][0] == '#')) || ((board[0][0] == board[2][2]) && (board[0][0] == ' ') && (board[1][1] == '#')))
{
				for (j = 0;; j += 2)
				{
					if (board[j][j] == ' ')
					{
						board[j][j] = '#';
						system("cls");
						Displayboard(board, ROW, COL);
						goto end;
					}
				}
}
if ((board[0][2] == board[1][1] && (board[0][2] == ' ') && board[2][0] == '#') || (board[2][0] == board[1][1] && (board[1][1] == ' ') && board[0][2] == '#') || (board[2][0] == board[0][2] && (board[2][0] == ' ') && board[1][1] == '#'))
{
				for (j = 0;; j += 2)
				{
					if (board[j][2 - j] == ' ')
					{
						board[j][2 - j] = '#';
						system("cls");
						Displayboard(board, ROW, COL);
						goto end;
					}
				}
}
for (i = 0; i < row; i++)
{
				if ((board[i][0] == board[i][1] && (board[i][0] == ' ') && board[i][2] == '#') || (board[i][2] == board[i][1] && (board[i][1] == ' ') && board[i][0] == '#') || (board[i][0] == board[i][2] && (board[i][2] == ' ') && board[i][1] == '#'))
				{
					for (j = 0;; j += 2)
					{
						if (board[i][j] == ' ')
						{
							board[i][j] = '#';
							system("cls");
							Displayboard(board, ROW, COL);
							goto end;
						}
					}
				}
}
for (j = 0; j < col; j++)
{
				if ((board[0][j] == board[1][j] && (board[0][j] == ' ') && board[2][j] == '#') || (board[2][j] == board[1][j] && (board[1][j] == ' ') && board[0][j] == '#') || (board[0][j] == board[2][j] && (board[0][j] == ' ') && board[1][j] == '#'))
				{
					for (i = 0;; i += 2)
					{
						if (board[i][j] == ' ')
						{
							board[i][j] = '#';
							system("cls");
							Displayboard(board, ROW, COL);
							goto end;
						}
					}
				}
}

这里重点介绍的是电脑下棋的原理,因此就暂且不分析三子棋游戏的制作过程了。

工作原理大致如下:(以下’#‘为电脑下的棋,’*‘则视为玩家下的棋)

因为玩家先下,所以可以将代码分为两部分,第一部分是玩家将第一颗棋下在中间的位置,这时电脑如果下在九宫格上下左右的四个位置任意一处,玩家就一定有机会赢,示例如下:

b5b49a93422648609e44006a3a3cf2cd.png

假设电脑将棋子下在(1,2),则玩家可以下在(3,3)处,这样的话电脑就必须堵在(1,1)处,此时玩家下在(1,3)处时,电脑不论是堵住(3,1)还是(2,3)玩家都能稳赢

故我们只能让电脑将棋下在四个角中的任意一处,而下在哪一处就可以用时间戳确定的随机值来确定了,代码如下:

if (board[1][1] == '*' && w == 1)
{
	int x = rand() % (row + 1);
	if (x == 0)
	{
		board[0][2] = '#';
		system("cls");
		Displayboard(board, ROW, COL);
	}
	if (x == 1)
	{
		board[2][0] = '#';
		system("cls");
		Displayboard(board, ROW, COL);
	}
	if (x == 2)
	{
		board[0][0] = '#';
		system("cls");
		Displayboard(board, ROW, COL);
	}
	if (x == 3)
	{
		board[2][2] = '#';
		system("cls");
		Displayboard(board, ROW, COL);
	}
}

 这里的'w'是在开始的时候监测棋盘中玩家下的棋的个数,因为只需要在玩家在中间下了一棋之后电脑在四角下棋,其他情况就没有必要了,故w==1时才能在四角任下一棋。

而后面玩家再下一棋后就一定会出现一条线上有两个是玩家的棋,因为玩家已经在中盘下了一棋,此时电脑就得防守了,若玩家下在二维数组的(0,0)处,则电脑需要堵在(2-0,2-0)即(2,2)处,若玩家下在二维数组的(0,1)处,则电脑需要将棋下在(2-0,2-1)即(2,1)处

则代码如下

for(int x=0;x<ROW;x++)
{
				for(int y=0;y<COL;y++)
				{
					if (board[x][y] == '*' && board[2 - x][2 - y] == ' ' && (!(x == 1 && y == 1)))
					{
						board[2 - x][2 - y] = '#';
						system("cls");
						Displayboard(board, ROW, COL);
						goto end;
					}
				}
}

但还是得防玩家不将棋子下在有机会连成线的情况,例如下面情况:

9170fa868fae4a1f8efc6282660c3036.png

这种情况就不需要防守了,所以为了防止这种现象,我们就得写一段代码让电脑攻,上面已经将电脑攻讲到了,而我们要判断的就是电脑应当先将棋子下在哪里,若将棋子下在上下左右四个格子中的一处,玩家就又有机会赢得游戏,解释与之前的相似故省略,所以我们可以先将棋子下在对角线处,而这里有一步可以减少计算机的计算量即:

for (i = 0;; i += 2)

这样的话电脑就会先监测j=0和j=2处,而不会监测j=1即中间的坐标,因为中间已经有棋了,所以再监测也没有意义了

而后面的while部分主要为了防一些特殊情况,则直接让电脑下在随机坐标,根据目前监测来看基本上是用不到的

---------------------------------------------------------------------------------------------------------------------------------下面讲解玩家第一步没有下在中间的情况,这样来看的话电脑第一步直接将棋下在中间就行了,即

if (board[1][1] == ' ')
	{
		board[1][1] = '#';
		system("cls");
		Displayboard(board, ROW, COL);
	}

然后就要将优先级最高的防玩家部分写下来了,即将"电脑防"的部分写下来,上面已经讲到过就不重复代码了

那么接下来就是写"电脑攻"的部分了,这里同样要考虑下棋优先级的问题,首先电脑一定不能将棋下在四角处,这里与第一部分的攻击方式不同,原因如下:

d4dc2afdf3d34930ae1ca0e41848e104.png

假设玩家将棋下在二维数组(0,0)处,电脑首先肯定将棋下在棋盘中间,然后玩家若将棋下在棋盘的右下角处,而电脑将棋下在了右上角,则玩家再将棋下在左下角处电脑就基本不可能获胜了

因此先攻中路,即中间的一排,用两个for语句就可以将棋下在第二排的左边或右边,之后再监测两条对角线,这样防守就更加坚固了

后面的while部分主要为了防一些特殊情况,则直接让电脑下在随机坐标,根据目前监测来看基本上是用不到的(目前还没有发现)

而电脑如果发现有一条线上有两个都是自己的棋而另一处正好是空白,则直接将最后一棋下出来获得游戏胜利,这个优先级无疑是最高的,故放在两种情况的代码的最前面,即

for (i = 0; i < row; i++)
{
	if ((board[i][0] == board[i][1] && board[i][0] == '#') || (board[i][2] == board[i][1] && board[i][1] == '#') || (board[i][0] == board[i][2] && board[i][2] == '#'))
	{
		for (j = 0; j < COL; j++)
		{
			if (board[i][j] == ' ')
			{
				board[i][j] = '#';
				system("cls");
				Displayboard(board, ROW, COL);
				goto end;
			}
		}
	}
}
for (j = 0; j < col; j++)
{
	if ((board[0][j] == board[1][j] && board[0][j] == '#') || (board[2][j] == board[1][j] && board[1][j] == '#') || (board[0][j] == board[2][j] && board[0][j] == '#'))
	{
		for (i = 0; i < COL; i++)
		{
			if (board[i][j] == ' ')
			{
				board[i][j] = '#';
				system("cls");
				Displayboard(board, ROW, COL);
				goto end;
			}
		}
	}
}
if ((board[0][0] == board[1][1] && board[0][0] == '#') || (board[2][2] == board[1][1] && board[1][1] == '#') || (board[0][0] == board[2][2] && board[0][0] == '#'))
{
	for (j = 0; j < COL; j++)
	{
		if (board[j][j] == ' ')
		{
			board[j][j] = '#';
			system("cls");
			Displayboard(board, ROW, COL);
			goto end;
		}
	}
}
if ((board[0][2] == board[1][1] && board[0][2] == '#') || (board[2][0] == board[1][1] && board[1][1] == '#') || (board[2][0] == board[0][2] && board[2][0] == '#'))
{
	for (j = 0; j < COL; j++)
	{
		if (board[j][2 - j] == ' ')
		{
			board[j][2 - j] = '#';
			system("cls");
			Displayboard(board, ROW, COL);
			goto end;
		}
	}
}

至此,电脑下棋部分的代码就讲完了,作为一名大一新生写一篇博客不容易,所以麻烦各位点一个免费的赞支持一下我吧,感谢观看!

 

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘家炫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值