C语言-----三子棋的实现

相信大家都玩过五子棋吧,今天我来写一个简易版的三子棋,第一次写超过200行的代码,是自己的一个进步,这算是我的第一个小项目了。

写三子棋首先要有一个简单的思路:

1. 要有棋盘,初始化棋盘,显示棋盘

2. 该下棋了,人和电脑进行对战,那就需要两个函数,分别是人下棋的函数和电脑下棋的函数。
3. 下完棋之后,每一步都要判断输赢。

我们先来看一下运行结果:
O---------玩家
X---------电脑
首先,打印一个菜单供玩家选择int menu( ),当玩家选择玩游戏时,进入游戏函数  game( )。
进入游戏之后,进行初始化棋盘InitBoard(board, ROW, COL)
初始化完成之后,需要下棋,由电脑和玩家进行对战,ComputerMove(board, ROW, COL),电脑和玩家每一次下完棋都要进行判断是否已经赢了。下列为头文件:
#define ROW 3
#define COL 3

#ifndef __三子棋__H__
#define __三子棋__H__
//初始化
void InitBoard(char arr[ROW][COL], int row, int col);

//显示棋盘
void DisplayBoard(char arr[ROW][COL], int row, int col);

//电脑下棋
void ComputerMove(char arr[ROW][COL], int row, int col);

//人下棋
void PlayerMove(char arr[ROW][COL], int row, int col);

//判断输赢
char IsWin(char arr[ROW][COL], int row, int col);
#endif __三子棋__H__
以下是测试函数功能是否编写正确的代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include "三子棋.h"

int menu(void)
{
	int choose;
	printf("********************\n");
	printf("      0.退出        \n");
	printf("      1.玩游戏      \n");
	printf("********************\n");
	printf("choose:");
	scanf("%d", &choose);
	return choose;
}

void game(void)
{
	char ret = 0;
	char board[ROW][COL];
	InitBoard(board, ROW, COL);//初始化面板
	do{
		ComputerMove(board, ROW, COL);  //电脑下棋
		DisplayBoard(board, ROW, COL);//显示棋盘
		ret = IsWin(board, ROW, COL);//判断输赢

		if (ret == 'X')
		{
			printf("你输了\n");
			break;
		}
		else if (ret == 'O')
		{
			printf("你赢了\n");
			break;
		}
		else if (ret == 'E')
		{
			printf("水平相当\n");
			break;
		}
		PlayerMove(board, ROW, COL);
		ret = IsWin(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		if (ret == 'X')
		{
			printf("你输了\n");
			break;
		}
		else if (ret == 'O')
		{
			printf("你赢了\n");
			break;
		}
		else if (ret == 'E')
		{
			printf("水平相当\n");
			break;
		}
	} while (1);
}

int main()
{
	int choose = 0;
	int ret = 0;
	srand((unsigned int)time(NULL));
	do{
		choose = menu();
		switch (choose){
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误\n");
			break;
		}

	} while (choose);
	system("pause");
	return 0;
}


接下来就是各个函数的功能实现了
#define _CRT_SECURE_NO_WARNINGS 1
#include "三子棋.h"
#include<stdio.h>
#include<stdlib.h>

void InitBoard(char arr[ROW][COL], int row, int col)//初始化一个三行三列的棋盘
{
	int i = 0, j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			arr[i][j] =  ' ';
		}
	}
}

void DisplayBoard(char arr[ROW][COL], int row, int col)//显示棋盘
{
	int i = 0, j = 0;
	printf("-------------\n");
	for (i = 0; i < row; i++)
	{
		printf("  %c|  %c |  %c\n", arr[i][0], arr[i][1], arr[i][2]);
	    printf("-------------\n");
	}
}

//电脑下棋
void ComputerMove(char arr[ROW][COL], int row, int col)
{
	int x = 0, y = 0;
	while (1)
	{
		x = rand() % row;//电脑下棋产生随机数,也就是随机坐标
		y = rand() % col;
		if (arr[x][y] == ' ')//判断为空才能下棋
		{
			arr[x][y] = 'X';
			break;
		}
	}
}

//玩家下棋
void PlayerMove(char arr[ROW][COL], int row, int col)
{
	int x = 0, y = 0;
	printf("请输入你想下的坐标(x,y):");
	do{
		scanf("%d,%d", &x, &y);//玩家输入坐标2,3
		x--;                   //x-1,y-1就是棋盘的真实坐标
		y--;
		if ((0 <= x &&x <= 2) && (0 <= y && y <= 2))//判断坐标输入是否正确
		{
			if ((arr[x][y] == ' '))//输入坐标没有子才能下棋
			{
				arr[x][y] = 'O';
				break;
			}
			else
			{
				printf("该坐标已有子不能输入,请重新输入:");
			}
		}
		else
		{
			printf("输入坐标有误,请重新输入:");
		}
	} while (1);
}

static int Isfull(char arr[ROW][COL], int row, int col)//静态函数,只能在此源文件内使用
{                                                      //判断棋盘是否已下满
	int i = 0, j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (arr[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}
//判断输赢,三横三竖或两个对角线即为赢
char IsWin(char arr[ROW][COL], int row, int col)
{
	int i = 0,j = 0;
	for (i = 0; i < row; i++)
	{
		if (((arr[i][0] == arr[i][1]) && (arr[i][1] == arr[i][2]) && (arr[i][2] == 'X')) ||
			((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i]) && (arr[2][i] == 'X')))
			return 'X';
		if (((arr[i][0] == arr[i][1]) && (arr[i][1] == arr[i][2]) && (arr[i][2] == 'O')) ||
			((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i]) && (arr[2][i] == 'O')))
			return 'O';
	}
	if(((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && (arr[2][2] == 'X')) ||
		((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && (arr[2][0] == 'X')))
		return 'X';
	if (((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && (arr[2][2] == 'O')) ||
		((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && (arr[2][0] == 'O')))
		return 'O';
	if(Isfull(arr, row, col))
	{
		return 'E';
	}
}
这就是简易版的三子棋的代码了,写完再看发现也不是特别难,就是一定要有一个清晰的思路。加油加油

猜你喜欢

转载自blog.csdn.net/abc_xixi111/article/details/79944353