【C语言】比较“智能”的三子棋

简介

三子棋是黑白棋的一种,是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、井字棋等。双方轮流在3×3的棋盘中落子,只要有一方的三个棋子走成一条线,则该方获胜。本文章中用c语言来实现这个游戏。

主函数部分

主函数部分包括一个菜单函数、游戏函数和main函数三个板块

菜单函数

void menu()
{
	printf("\n************井字棋游戏***********");
	printf("\n*********************************\n");
	printf("*****   1. play   0. exit   *****\n");
	printf("*********************************");
}

用于起始界面,供玩家选择游戏或退出

游戏函数

void game()
{
	char arr[ROW][COL] = { 0 };
	int row = ROW;
	int col = COL;
	init_chessboard(arr, row, col);
	while (1)
	{
		display_chessboard(arr,row,col);
		
		player_move(arr, row, col);
	
		if (whether_it_is_over(arr, row, col))
			;
		else
			break;
		
		if (whether_it_is_full(arr, row, col))
			;
		else
			break;
		
		computer_move(arr, row, col);

		if (whether_it_is_over(arr, row, col))
			;
		else
			break;
		
		if (whether_it_is_full(arr, row, col))
			;
		else
			break;
	}
}

游戏函数中我们创建数组、用宏定义的值来对行列赋值并且对棋盘进行初始化,而后进入循环。在循环中,主要的两个步骤是玩家和电脑落子,在将这两个步骤实现后,在落子前应先展示棋盘,因此调用了display函数;在落子后应判断游戏是否结束(包括一方胜出和平局),因此调用了whether_it_is_over和whether_it_is_full两个函数,最后在两个判断的地方设置好出口,大体的游戏逻辑框架就完成了。

main函数

int main()
{
	int input = 0;
	srand((unsigned)time(NULL));
	do {
		menu();
		printf("\n请输入指令:>");
		scanf("%d", &input);
		switch (input)
		{
			case 1:
				game();
				break;
			case 0:
				printf("退出游戏");
				break;
			default:
				printf("输入有误,请重新输入:>\n");
				break;
		}



	} while (input);

	return 0;

}

这里的逻辑同上一个游戏——扫雷相同,先借助随机数函数实现随机生成数字供电脑落子使用,然后利用do-while循环实现多次游戏,并在输入0时退出。

头文件

头文件中我们设置了棋盘的行列,包含了几个函数的声明以及要用到的头文件,这些函数在游戏函数中已出现过。

#pragma once

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define ROW 3
#define COL 3

void init_chessboard(char arr[ROW][COL], int row, int col);

void display_chessboard(char arr[ROW][COL], int row, int col);

void player_move(char arr[ROW][COL], int row, int col);

void computer_move(char arr[ROW][COL], int row, int col);

int whether_it_is_over(char arr[ROW][COL],int row,int col);

int whether_it_is_full(char arr[ROW][COL], int row, int col);

游戏函数及其实现

棋盘初始化函数实现

初始化即遍历数组,并将数组元素设置为‘ ’(空格),以保证在打印时棋盘的对应位置是空出来的,表示该区域并未落子。

void init_chessboard(char arr[ROW][COL],int row,int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			arr[i][j] = ' ';
		}
	}
}

棋盘展示函数

在此函数中,我们不仅要打印数组中的元素(棋子),还要将它们分割开来,也就是要把棋盘考虑在内。这里的设计并没有打印棋盘外围边框,主要是棋盘中的横竖各两条线。考虑到最后一行/列不再有边界,所以在循环过程中我们通过限制最后一行/列的打印来实现打印“井”字棋盘,详情请看代码。

void display_chessboard(char arr[ROW][COL],int row,int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			if (j >= col - 1)
				printf(" %c ", arr[i][j]);
			else
				printf(" %c |", arr[i][j]);
			
		}
		printf("\n");
		for (j = 0; j < row ; j++)
		{
			
			if (j >= row - 1)
				printf("---");
			else
			{
				printf("---|");
			}
		}
		
		printf("\n");

	}
}

玩家落子函数实现

在输入落子坐标后对其进行判断,若坐标越界或坐标已有棋子,则重新输入,直至输入的坐标不符合以上两个条件跳出循环,并为对应的棋盘坐标对应的数组进行赋值(落子)。

void player_move(char arr[ROW][COL],int row,int col)
{
	printf("请输入要落子的坐标,用空格隔开:>");
	int abscissa = 0;
	int ordinate = 0;
	while (1)
	{
		scanf("%d %d", &abscissa, &ordinate);
		if ((abscissa < 1) || (abscissa > 3) || (ordinate < 1) || (ordinate > 3))
		{
			printf("数据输入有误,请重新输入:>");
			continue;
		}	
		if ((arr[abscissa - 1][ordinate - 1] == '*')|| (arr[abscissa - 1][ordinate - 1] == '#'))
		{
			printf("此处已有棋子,还请换至他出:>");
			continue;
		}
		if (arr[abscissa - 1][ordinate - 1] == ' ')
		{
			break;
		}
	}
	arr[abscissa - 1][ordinate - 1] = '*';
}

电脑落子函数实现

臭长警告!!!
电脑落子的简单办法是利用随机数生成在棋盘坐标范围内的随机数坐标,而后判断是否符合落子规则,符合则进行落子,否则重新生成随机数后再次尝试。这里我们是在了解了三子棋的取胜规则后对于棋盘上可能出现的情况进行了不完全穷举(穷举了,但没完全穷举),但是基本可以保证电脑不败,嘿嘿。

void computer_move(char arr[ROW][COL], int row, int col)         
{                                                                
	int x = 0;
	int y = 0;
	
    if (arr[1][1] == ' ')
	{
		x = 1;
		y = 1;
	}
	//第一行'#'
	else if ((arr[0][2] == ' ') && (arr[0][0] == '#' && arr[0][1] == '#'))
	{
		x = 0;
		y = 2;
	}
	else if ((arr[0][1] == ' ') && (arr[0][0] == '#' && arr[0][2] == '#'))
	{
		x = 0;
		y = 1;
	}
	else if ((arr[0][0] == ' ') && (arr[0][1] == '#' && arr[0][2] == '#'))
	{
		x = 0;
		y = 0;
	}
	//第二行'#'
	else if ((arr[1][2] == ' ') && (arr[1][0] == '#' && arr[1][1] == '#'))
	{
		x = 1;
		y = 2;
	}
	else if ((arr[1][1] == ' ') && (arr[1][0] == '#' && arr[1][2] == '#'))
	{
		x = 1;
		y = 1;
	}
	else if ((arr[1][0] == ' ') && (arr[1][1] == '#' && arr[1][2] == '#'))
	{
		x = 1;
		y = 0;
	}
	//第三行'#'
	else if ((arr[2][2] == ' ') && (arr[2][0] == '#' && arr[2][1] == '#'))
	{
		x = 2;
		y = 2;
	}
	else if ((arr[2][1] == ' ') && (arr[2][0] == '#' && arr[2][2] == '#'))
	{
		x = 2;
		y = 1;
	}
	else if ((arr[2][0] == ' ') && (arr[2][1] == '#' && arr[2][2] == '#'))
	{
		x = 2;
		y = 0;
	}
	//第一列'#'
	else if ((arr[2][0] == ' ') && (arr[0][0] == '#' && arr[1][0] == '#'))
	{
		x = 2;
		y = 0;
	}
	else if ((arr[1][0] == ' ') && (arr[0][0] == '#' && arr[2][0] == '#'))
	{
		x = 1;
		y = 0;
	}
	else if ((arr[0][0] == ' ') && (arr[1][0] == '#' && arr[2][0] == '#'))
	{
		x = 0;
		y = 0;
	}
	//第二列'#'
	else if ((arr[2][1] == ' ') && (arr[0][1] == '#' && arr[1][1] == '#'))
	{
		x = 2;
		y = 1;
	}
	else if ((arr[1][1] == ' ') && (arr[0][1] == '#' && arr[2][1] == '#'))
	{
		x = 1;
		y = 1;
	}
	else if ((arr[0][1] == ' ') && (arr[1][1] == '#' && arr[2][1] == '#'))
	{
		x = 0;
		y = 1;
	}
	//第三列'#'
	else if ((arr[2][2] == ' ') && (arr[0][2] == '#' && arr[1][2] == '#'))
	{
		x = 2;
		y = 2;
	}
	else if ((arr[1][2] == ' ') && (arr[0][2] == '#' && arr[2][2] == '#'))
	{
		x = 1;
		y = 2;
	}
	else if ((arr[0][2] == ' ') && (arr[1][2] == '#' && arr[2][2] == '#'))
	{
		x = 0;
		y = 2;
	}
	//右斜'#'
	else if ((arr[2][2] == ' ') && (arr[0][0] == '#' && arr[1][1] == '#'))
	{
		x = 2;
		y = 2;
	}
	else if ((arr[1][1] == ' ') && (arr[0][0] == '#' && arr[2][2] == '#'))
	{
		x = 1;
		y = 1;
	}
	else if ((arr[0][0] == ' ') && (arr[1][1] == '#' && arr[2][2] == '#'))
	{
		x = 0;
		y = 0;
	}
	//左斜'#'
	else if ((arr[2][0] == ' ') && (arr[0][2] == '#' && arr[1][1] == '#'))
	{
		x = 2;
		y = 0;
	}
	else if ((arr[1][1] == ' ') && (arr[0][2] == '#' && arr[2][0] == '#'))
	{
		x = 1;
		y = 1;
	}
	else if ((arr[0][2] == ' ') && (arr[1][1] == '#' && arr[2][0] == '#'))
	{
		x = 0;
		y = 2;
	}
	//第一行'*'
	else if ((arr[0][2] == ' ') && (arr[0][0] == '*' && arr[0][1] == '*'))
	{
		x = 0;
		y = 2;
	}
	else if ((arr[0][1] == ' ') && (arr[0][0] == '*' && arr[0][2] == '*'))
	{
		x = 0;
		y = 1;
	}
	else if ((arr[0][0] == ' ') && (arr[0][1] == '*' && arr[0][2] == '*'))
	{
		x = 0;
		y = 0;
	}
	//第二行'*'
	else if ((arr[1][2] == ' ') && (arr[1][0] == '*' && arr[1][1] == '*'))
	{
		x = 1;
		y = 2;
	}
	else if ((arr[1][1] == ' ') && (arr[1][0] == '*' && arr[1][2] == '*'))
	{
		x = 1;
		y = 1;
	}
	else if ((arr[1][0] == ' ') && (arr[1][1] == '*' && arr[1][2] == '*'))
	{
		x = 1;
		y = 0;
	}
	//第三行'*'
	else if ((arr[2][2] == ' ') && (arr[2][0] == '*' && arr[2][1] == '*'))
	{
		x = 2;
		y = 2;
	}
	else if ((arr[2][1] == ' ') && (arr[2][0] == '*' && arr[2][2] == '*'))
	{
		x = 2;
		y = 1;
	}
	else if ((arr[2][0] == ' ') && (arr[2][1] == '*' && arr[2][2] == '*'))
	{
		x = 2;
		y = 0;
	}
	//第一列'*'
	else if ((arr[2][0] == ' ') && (arr[0][0] == '*' && arr[1][0] == '*'))
	{
		x = 2;
		y = 0;
	}
	else if ((arr[1][0] == ' ') && (arr[0][0] == '*' && arr[2][0] == '*'))
	{
		x = 1;
		y = 0;
	}
	else if ((arr[0][0] == ' ') && (arr[1][0] == '*' && arr[2][0] == '*'))
	{
		x = 0;
		y = 0;
	}
	//第二列'*'
	else if ((arr[2][1] == ' ') && (arr[0][1] == '*' && arr[1][1] == '*'))
	{
		x = 2;
		y = 1;
	}
	else if ((arr[1][1] == ' ') && (arr[0][1] == '*' && arr[2][1] == '*'))
	{
		x = 1;
		y = 1;
	}
	else if ((arr[0][1] == ' ') && (arr[1][1] == '*' && arr[2][1] == '*'))
	{
		x = 0;
		y = 1;
	}
	//第三列'*'
	else if ((arr[2][2] == ' ') && (arr[0][2] == '*' && arr[1][2] == '*'))
	{
		x = 2;
		y = 2;
	}
	else if ((arr[1][2] == ' ') && (arr[0][2] == '*' && arr[2][2] == '*'))
	{
		x = 1;
		y = 2;
	}
	else if ((arr[0][2] == ' ') && (arr[1][2] == '*' && arr[2][2] == '*'))
	{
		x = 0;
		y = 2;
	}
	//右斜'*'
	else if ((arr[2][2] == ' ') && (arr[0][0] == '*' && arr[1][1] == '*'))
	{
		x = 2;
		y = 2;
	}
	else if ((arr[1][1] == ' ') && (arr[0][0] == '*' && arr[2][2] == '*'))
	{
		x = 1;
		y = 1;
	}
	else if ((arr[0][0] == ' ') && (arr[1][1] == '*' && arr[2][2] == '*'))
	{
		x = 0;
		y = 0;
	}
	//左斜'*'
	else if ((arr[2][0] == ' ') && (arr[0][2] == '*' && arr[1][1] == '*'))
	{
		x = 2;
		y = 0;
	}
	else if ((arr[1][1] == ' ') && (arr[0][2] == '*' && arr[2][0] == '*'))
	{
		x = 1;
		y = 1;
	}
	else if ((arr[0][2] == ' ') && (arr[1][1] == '*' && arr[2][0] == '*'))
	{
		x = 0;
		y = 2;
	}
	else if (arr[1][1] == ' ')
	{
		x = 1;
		y = 1;
	}
	else if ((arr[1][1] == '*') && (arr[0][0] == ' ') && (arr[0][1] == ' ') && (arr[0][2] == ' ') && (arr[1][0] == ' ') && (arr[1][2] == ' ') && (arr[2][0] == ' ') && (arr[2][1] == ' ') && (arr[2][2] == ' '))
	{
	    x = 0;
	    y = 0;
	}
	else if ((arr[1][1] == '*') && (arr[0][0] == '*') && (arr[0][1] == ' ') && (arr[0][2] == ' ') && (arr[1][0] == ' ') && (arr[1][2] == ' ') && (arr[2][0] == ' ') && (arr[2][1] == ' ') && (arr[2][2] == '#'))
	{
		x = 2;
		y = 0;
	}
	else if ((arr[1][1] == '*') && (arr[0][0] == ' ') && (arr[0][1] == ' ') && (arr[0][2] == '*') && (arr[1][0] == ' ') && (arr[1][2] == ' ') && (arr[2][0] == '#') && (arr[2][1] == ' ') && (arr[2][2] == ' '))
	{
	    x = 0;
	    y = 0;
	}
	else if ((arr[1][1] == '*') && (arr[0][0] == '#') && (arr[0][1] == ' ') && (arr[0][2] == ' ') && (arr[1][0] == ' ') && (arr[1][2] == ' ') && (arr[2][0] == ' ') && (arr[2][1] == ' ') && (arr[2][2] == '*'))
	{
	    x = 0;
	    y = 2;
	}
	else if ((arr[1][1] == '*') && (arr[0][0] == ' ') && (arr[0][1] == ' ') && (arr[0][2] == '#') && (arr[1][0] == ' ') && (arr[1][2] == ' ') && (arr[2][0] == '*') && (arr[2][1] == ' ') && (arr[2][2] == ' '))
	{
		x = 2;
		y = 2;
	}
	else if ((arr[1][1] == '#') && (arr[0][0] == '*') && (arr[0][1] == ' ') && (arr[0][2] == ' ') && (arr[1][0] == ' ') && (arr[1][2] == ' ') && (arr[2][0] == ' ') && (arr[2][1] == ' ') && (arr[2][2] == '*'))
	{
		x = 1;
		y = 0;
	}
	else if ((arr[1][1] == '#') && (arr[0][0] == ' ') && (arr[0][1] == ' ') && (arr[0][2] == '*') && (arr[1][0] == ' ') && (arr[1][2] == ' ') && (arr[2][0] == '*') && (arr[2][1] == ' ') && (arr[2][2] == ' '))
	{
		x = 0;
		y = 1;
	}
	else if ((arr[1][1] == '*') && (arr[0][0] == ' ') && (arr[0][1] == '*') && (arr[0][2] == ' ') && (arr[1][0] == ' ') && (arr[1][2] == ' ') && (arr[2][0] == '#') && (arr[2][1] == ' ') && (arr[2][2] == ' '))
	{
		x = 0;
		y = 0;
	}
	else if ((arr[1][1] == '*') && (arr[0][0] == ' ') && (arr[0][1] == ' ') && (arr[0][2] == ' ') && (arr[1][0] == '#') && (arr[1][2] == '*') && (arr[2][0] == ' ') && (arr[2][1] == ' ') && (arr[2][2] == ' '))
	{
		x = 0;
		y = 2;
	}
	else if ((arr[1][1] == '*') && (arr[0][0] == ' ') && (arr[0][1] == '#') && (arr[0][2] == ' ') && (arr[1][0] == ' ') && (arr[1][2] == ' ') && (arr[2][0] == ' ') && (arr[2][1] == '*') && (arr[2][2] == ' '))
	{
		x = 2;
		y = 2;
	}
	else if ((arr[1][1] == '*') && (arr[0][0] == ' ') && (arr[0][1] == ' ') && (arr[0][2] == '*') && (arr[1][0] == '*') && (arr[1][2] == '#') && (arr[2][0] == ' ') && (arr[2][1] == ' ') && (arr[2][2] == ' '))
	{
		x = 2;
		y = 0;
	}
	else if ((arr[1][1] == ' ') && (arr[0][0] == ' ') && (arr[0][1] == '*') && (arr[0][2] == '#') && (arr[1][0] == ' ') && (arr[1][2] == ' ') && (arr[2][0] == ' ') && (arr[2][1] == '*') && (arr[2][2] == ' '))
	{
		x = 1;
		y = 1;
	}
	else if ((arr[1][1] == ' ') && (arr[0][0] == ' ') && (arr[0][1] == '*') && (arr[0][2] == ' ') && (arr[1][0] == ' ') && (arr[1][2] == ' ') && (arr[2][0] == ' ') && (arr[2][1] == '*') && (arr[2][2] == '#'))
	{
		x = 1;
		y = 1;
	}
	else if ((arr[1][1] == ' ') && (arr[0][0] == ' ') && (arr[0][1] == '*') && (arr[0][2] == ' ') && (arr[1][0] == ' ') && (arr[1][2] == ' ') && (arr[2][0] == '#') && (arr[2][1] == '*') && (arr[2][2] == ' '))
	{
		x = 1;
		y = 1;
	}
	else if ((arr[1][1] == ' ') && (arr[0][0] == '#') && (arr[0][1] == '*') && (arr[0][2] == ' ') && (arr[1][0] == ' ') && (arr[1][2] == ' ') && (arr[2][0] == ' ') && (arr[2][1] == '*') && (arr[2][2] == ' '))
	{
		x = 1;
		y = 1;
	}
	else if ((arr[1][1] == ' ') && (arr[0][0] == ' ') && (arr[0][1] == ' ') && (arr[0][2] == '#') && (arr[1][0] == '*') && (arr[1][2] == '*') && (arr[2][0] == ' ') && (arr[2][1] == '*') && (arr[2][2] == ' '))
	{
		x = 1;
		y = 1;
	}
	else if ((arr[1][1] == ' ') && (arr[0][0] == ' ') && (arr[0][1] == ' ') && (arr[0][2] == ' ') && (arr[1][0] == '*') && (arr[1][2] == '*') && (arr[2][0] == ' ') && (arr[2][1] == '*') && (arr[2][2] == '#'))
	{
		x = 1;
		y = 1;
	}
	else if ((arr[1][1] == ' ') && (arr[0][0] == ' ') && (arr[0][1] == ' ') && (arr[0][2] == ' ') && (arr[1][0] == '*') && (arr[1][2] == '*') && (arr[2][0] == '#') && (arr[2][1] == '*') && (arr[2][2] == ' '))
	{
		x = 1;
		y = 1;
	}
	else if ((arr[1][1] == ' ') && (arr[0][0] == '#') && (arr[0][1] == ' ') && (arr[0][2] == ' ') && (arr[1][0] == '*') && (arr[1][2] == '*') && (arr[2][0] == ' ') && (arr[2][1] == '*') && (arr[2][2] == ' '))
	{
		x = 1;
		y = 1;
	}
	else if ((arr[1][1] == '#') && (arr[0][0] == ' ') && (arr[0][1] == '*') && (arr[0][2] == ' ') && (arr[1][0] == ' ') && (arr[1][2] == ' ') && (arr[2][0] == ' ') && (arr[2][1] == '*') && (arr[2][2] == ' '))
	{
		x = 0;
		y = 2;
	}
	else if ((arr[1][1] == '#') && (arr[0][0] == ' ') && (arr[0][1] == '*') && (arr[0][2] == ' ') && (arr[1][0] == '*') && (arr[1][2] == '*') && (arr[2][0] == ' ') && (arr[2][1] == ' ') && (arr[2][2] == ' '))
	{
		x = 2;
		y = 2;
	}
	else if ((arr[1][1] == '*') && (arr[0][0] == ' ') && (arr[0][1] == '*') && (arr[0][2] == ' ') && (arr[1][0] == ' ') && (arr[1][2] == ' ') && (arr[2][0] == ' ') && (arr[2][1] == '#') && (arr[2][2] == ' '))
	{
		x = 0;
		y = 0;
	}
	else if ((arr[1][1] == '*') && (arr[0][0] == ' ') && (arr[0][1] == ' ') && (arr[0][2] == ' ') && (arr[1][0] == '#') && (arr[1][2] == '*') && (arr[2][0] == ' ') && (arr[2][1] == ' ') && (arr[2][2] == ' '))
	{
		x = 0;
		y = 2;
	}
	else if ((arr[1][1] == '*') && (arr[0][0] == ' ') && (arr[0][1] == '#') && (arr[0][2] == ' ') && (arr[1][0] == ' ') && (arr[1][2] == ' ') && (arr[2][0] == ' ') && (arr[2][1] == '*') && (arr[2][2] == ' '))
	{
		x = 2;
		y = 2;
	}
	else if ((arr[1][1] == '*') && (arr[0][0] == ' ') && (arr[0][1] == ' ') && (arr[0][2] == ' ') && (arr[1][0] == '*') && (arr[1][2] == '#') && (arr[2][0] == ' ') && (arr[2][1] == ' ') && (arr[2][2] == ' '))
	{
		x = 2;
		y = 0;
	}
	//随机赋值
	else
	{
		x = rand() % ROW;
		y = rand() % COL;
	}
	if (arr[x][y] == ' ')
	{
		arr[x][y] = '#';
	}
	else
	{
		computer_move(arr, ROW, COL);
	}
}

判断是否有一方胜利函数

我们已知游戏的胜利条件是三子相连,因此我们就在行、列、两斜四个方向进行判断是否有符合条件的棋子。若有符合条件的棋子,则返回对应的棋子已取胜。

int whether_it_is_over(char arr[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		if ((arr[i][0] == arr[i][1]) && (arr[i][2] == arr[i][1]) && (arr[i][0] == '*'))
		{
			printf("\n玩家取胜!\n");
			display_chessboard(arr, row, col);
			return 0;
		}	
		else if ((arr[i][0] == arr[i][1]) && (arr[i][2] == arr[i][1]) && (arr[i][0] == '#'))
		{
			printf("\n电脑取胜!\n");
			display_chessboard(arr, row, col);
			return 0;
		}

	}
	for (i = 0; i < col; i++)
	{
		if ((arr[0][i] == arr[1][i]) && (arr[2][i] == arr[1][i]) && (arr[0][i] == '*'))
		{
			printf("\n玩家取胜!\n");
			display_chessboard(arr, row, col);
			return 0;
		}
		else if ((arr[0][i] == arr[1][i]) && (arr[2][i] == arr[1][i]) && (arr[0][i] == '#'))
		{
			printf("\n电脑取胜!\n");
			display_chessboard(arr, row, col);
			return 0;

		}

	}
	
	i = 0;
	if ((arr[i][i] == arr[i + 1][i + 1]) && (arr[i + 1][i + 1] == arr[i + 2][i + 2]) && (arr[i][i] == '*'))
	{
		printf("\n玩家取胜!\n");
		display_chessboard(arr, row, col);
		return 0;
	}
	else if ((arr[i][i] == arr[i + 1][i + 1]) && (arr[i + 1][i + 1] == arr[i + 2][i + 2]) && (arr[i][i] == '*'))
	{
		printf("\n电脑取胜!\n");
		display_chessboard(arr, row, col);
		return 0;
	}

	i = 0;
	if ((arr[i][row - i - 1] == arr[i + 1][row - i - 2]) && (arr[i + 1][row - i - 2] == arr[i + 2][row - i - 3]) && (arr[i][row - i - 1] == '*'))
	{
		printf("\n玩家取胜!\n");
		display_chessboard(arr, row, col);
		return 0;
	}
	else if ((arr[i][row - i - 1] == arr[i + 1][row - i - 2]) && (arr[i + 1][row - i - 2] == arr[i + 2][row - i - 3]) && (arr[i][row - i - 1] == '#'))
	{
		printf("\n电脑取胜!\n");
		display_chessboard(arr, row, col);
		return 0;
	}

	return 1;
}

判断平局函数

在数组中计算非空格元素的数量,如果数量与棋盘格子数相同,证明棋盘已满,(因为在游戏函数中,我们将判断胜利的函数置于此函数之前,因此如果有一方胜利则不会进入此函数)此局游戏为平局。

int whether_it_is_full(char arr[ROW][COL], int row, int col)
{
	int i = 0;
	int count = 0;
	int sum = row * col;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			if (arr[i][j] != ' ')
				count++;
		}
	}
	if (count == sum)
	{
		printf("\n棋盘已满,和局。\n");
		display_chessboard(arr, row, col);
		printf("\n");
		return 0;
	}
	else
		return 1;
}

游戏实际体验画面

在这里插入图片描述

结束语

以上便是笔者所完成的三子棋游戏,尽管比较“智能”,但是电脑落子的代码的冗余程度,棋盘大小推广的实现等仍然存在问题,欢迎读者在评论区进行讨论,一起学习,一起进步。(●’◡’●)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值