C语言—简单实现三子棋游戏

实现简单三子棋游戏基本思路;

1.首先创建一个数组并且初始化棋盘(数组);

void Initboard(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; j++)
		{
			board[i][j] = ' ';
		}
	}
}

2.打印棋盘;

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; j++)
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)
			{
				printf("|");
			}
		}printf("\n");
		for (j = 0; j < col; j++)
		{
			if (i < row - 1)
			{
				printf("---");
			}
			if (i == col-1)
			{
				break;
			}
			if (j < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");
	}

	/*for (i = 0; i < row; i++)
	{
		printf("  %c | %c | %c  \n", board[i][0], board[i][1], board[i][2]);
		if (i != row - 1)
			printf(" ---|---|--- \n");
	}*/
	
}

3.电脑随机走一步;



void Computer_move(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑走:>\n");
	while (1)
	{
		x = rand() % row; //产生随机值 0-row;
		y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = 'o';
			break;
		}
	
	}
	

}

3.玩家走一步;

void Player_move(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("请输入坐标:>\n");
	while (1)
	{
		
		scanf("%d%d", &x, &y);
		if (x  > 0 && x <= row &&y  >0 && y <= col && board[x-1][y-1] == ' ')
		{
			board[x - 1][y - 1] = 'x';
			break;
		}
		else
		printf("请重新输入坐标:>\n");
	}
	
}

4.判断输赢;

char check_win(char board[ROW][COL], int row, int col)
{
	int i;
	//判断电脑和玩家走过后,是否已经连成了三个点的直线;
	//如果有一条三个点连的直线,那么返回构成直线的符号;
	//'0'电脑赢    'x'玩家赢;
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2])
		{
			return board[i][1];
		}
	}
	for (i = 0; i <col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i])
		{
			return board[1][i];
		}
	}
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2])
	{
		return board[1][1];
	}
	else
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0])
	{
		return board[1][1];
	}
	
	if (is_full(board, row, col))//用一个函数实现判断棋盘是否已满,来判断平局;
	{
		return 'q';//棋盘满了返回'q';
	}
	
	return 0;

}

5.为了判断棋盘是否已经满了,编写一个is_full()函数;

int is_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;
}

 以上便是基本思路,完整代码见下

1.所需要的头文件 game.h

​#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define  ROW  3
#define  COL  3

void Computer_move(char board[ROW][COL], int row,int col);
void Player_move(char board[ROW][COL],int row, int col);
 
char check_win(char borad[ROW][COL], int row,int col );​

2.测试代码, tese.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"
void menu()
{

	printf("**************************************\n");
	printf("******* 1.play       0.exit **********\n");
	printf("**************************************\n");
}
void game()
{
	char ret = '0';
	char board[ROW][COL] = { 0 };
	Initboard(board, ROW, COL);
	Displayboard(board, ROW, COL);
	while (1)
	{
		Computer_move(board, ROW, COL);
		ret = check_win(board, ROW, COL);
		if (ret == 'o')
		{
			printf("电脑赢\n");
			Displayboard(board, ROW, COL);
			break;
		}
		else if (ret == 'q')
		    {
			printf("平局\n");
			Displayboard(board, ROW, COL);
			break;
		    }

	
		Displayboard(board, ROW, COL);
		Player_move(board, ROW, COL);
		ret = check_win(board, ROW, COL);

		if (ret == 'x')
		{
			printf("人赢\n");
			Displayboard(board, ROW, COL);
			break;
		}
		Displayboard(board, ROW, COL);
		
		
		
	}




}

int main()
{
	//三子棋
	//菜单
	//选择  1/0 
	//游戏
	int input = 0;
	do
	{
	 
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		srand((unsigned int)time(NULL));
		switch (input)
		{
		case 1: game();

			   break;
		case 0:printf("游戏结束\n");
			   break;
		default:printf("请重新选择:\n");
		}
	
	} while (input);
	system("pause");
	return 0;
}

 3.包含所有函数的定义  game.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"

void Initboard(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; 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; j++)
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)
			{
				printf("|");
			}
		}printf("\n");
		for (j = 0; j < col; j++)
		{
			if (i < row - 1)
			{
				printf("---");
			}
			if (i == col-1)
			{
				break;
			}
			if (j < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");
	}

	/*for (i = 0; i < row; i++)
	{
		printf("  %c | %c | %c  \n", board[i][0], board[i][1], board[i][2]);
		if (i != row - 1)
			printf(" ---|---|--- \n");
	}*/
	
}


void Computer_move(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑走:>\n");
	while (1)
	{
		x = rand() % row; //产生随机值 0-row;
		y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = 'o';
			break;
		}
	
	}
	

}

void Player_move(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("请输入坐标:>\n");
	while (1)
	{
		
		scanf("%d%d", &x, &y);
		if (x  > 0 && x <= row &&y  >0 && y <= col && board[x-1][y-1] == ' ')
		{
			board[x - 1][y - 1] = 'x';
			break;
		}
		else
		printf("请重新输入坐标:>\n");
	}
	
}

int is_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 check_win(char board[ROW][COL], int row, int col)
{
	int i;
	//判断电脑和玩家走过后,是否已经连成了三个点的直线;
	//如果有一条三个点连的直线,那么返回构成直线的符号;
	//'0'电脑赢    'x'玩家赢;
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2])
		{
			return board[i][1];
		}
	}
	for (i = 0; i <col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i])
		{
			return board[1][i];
		}
	}
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2])
	{
		return board[1][1];
	}
	else
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0])
	{
		return board[1][1];
	}
	
	if (is_full(board, row, col))//用一个函数实现判断棋盘是否已满,来判断平局;
	{
		return 'q';//棋盘满了返回'q';
	}
	
	return 0;

}

以上便是全部实现过程;

猜你喜欢

转载自blog.csdn.net/qq_42381855/article/details/87380820