用C代码实现三子棋


三子棋部分

今天我们准备写一个三子棋的游戏

首先要几个步骤:

初始化棋盘

首先把棋盘数组中的内容全部初始化为空格,这样的话可以在下棋的时候,用其他字符来填充这个空格,就能很好地达到下棋的目的

//数组初始化
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");
		
		if (i < row - 1)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
				{
					printf("|");


				}
			}
		}
		printf("\n");
	}
}

玩家下棋

玩家下棋的时候,既要进行判断该位置上面的坐标对不对,也就是在不在棋盘里面,还要想到棋盘上的这个位置有没有人落子,如果有人落子,就要被告知有棋子在上面,如果想下棋的位置不在这个棋盘内,就要被告知这个坐标是不对的,要重新输入,如果坐标是棋盘上的,就用break跳出这次下棋的过程

//棋手下棋
void PlayerMove(char board[Row][Col], int row, int col)
{
	int x = 0;
	int y = 0;


	while (1)
	{
		printf("棋手下棋\n");
		printf("请输入要下入的坐标:>\n");
		scanf("%d%d", &x, &y);
		if (x >= 1 && y >= 1 && x <= row && y <= col)
		{


			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else
				printf("该位置上有棋子了,请选择其他位置\n");


		}
		else
			printf("输入的坐标位置不合法,请重新输入\n");
	}




}

电脑下棋

在电脑下棋的时候,用到rand函数进行随机生成一个数,但在调用rand函数之前,要在主函数内部进行srand函数的调用

利用time函数可以随机根据时间戳随机生成一个数


//电脑下棋
void ComputerMove(char board[Row][Col], int row, int col)
{
	//用rand和srand函数进行随机生成数
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("电脑下棋\n");
		x = rand() % row;
		y = rand() % col;
		printf("电脑下棋的位置为:%d %d\n", x + 1, y + 1);
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

判断输赢

判断输赢是在行,列,左对角线和右对角线判断是否有三个相同的棋子,如果有的话,就要对这个棋子进行返回,如果是玩家下的那种棋子,就是玩家赢了,否则是电脑赢了。

//判断输赢
char IsWin(char board[Row][Col], int row, int col)
{
	//行
	int i = 0;
	int j = 0;


	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
		{
			return board[i][1];
		}
	}
	//列
	for (j = 0; j < col; j++)
	{
		if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
		{
			return board[1][j];
		}
	}
	//对角线
	
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
	{
		return board[1][1];
	}


	//判断棋盘是否为满
	if(IsFull(board,row,col))
	{
		return 'Q';
	}
	return 'C';
}

判断棋盘满没满

棋盘满没满是在判断获没获胜的时候需要考虑的,当期盘满了的时候,就不能再继续下棋了 就要中断下棋的过程

int IsFull(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++)
		{
			if (board[i][j] == ' ')
			{
				return 0;
			}
		}
	}
	return 1;
}

一共分为三个文件,以工程的形式进行书写

分别是game.h头文件

game.c函数实现文件

test.c测试运行文件

game.h

#pragma once
#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.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 PlayerMove(char board[Row][Col], int row, int col);


//电脑下棋
void ComputerMove(char board[Row][Col], int row, int col);


//判断输赢
char IsWin(char board[Row][Col], int row, int col);

game.c

#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");
		
		if (i < row - 1)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
				{
					printf("|");


				}
			}
		}
		printf("\n");
	}
}


//棋手下棋
void PlayerMove(char board[Row][Col], int row, int col)
{
	int x = 0;
	int y = 0;


	while (1)
	{
		printf("棋手下棋\n");
		printf("请输入要下入的坐标:>\n");
		scanf("%d%d", &x, &y);
		if (x >= 1 && y >= 1 && x <= row && y <= col)
		{


			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else
				printf("该位置上有棋子了,请选择其他位置\n");


		}
		else
			printf("输入的坐标位置不合法,请重新输入\n");
	}




}

//电脑下棋
void ComputerMove(char board[Row][Col], int row, int col)
{
	//用rand和srand函数进行随机生成数
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("电脑下棋\n");
		x = rand() % row;
		y = rand() % col;
		printf("电脑下棋的位置为:%d %d\n", x + 1, y + 1);
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}


int IsFull(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++)
		{
			if (board[i][j] == ' ')
			{
				return 0;
			}
		}
	}
	return 1;
}




//判断输赢
char IsWin(char board[Row][Col], int row, int col)
{
	//行
	int i = 0;
	int j = 0;


	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
		{
			return board[i][1];
		}
	}
	//列
	for (j = 0; j < col; j++)
	{
		if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
		{
			return board[1][j];
		}
	}
	//对角线
	
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
	{
		return board[1][1];
	}


	//判断棋盘是否为满
	if(IsFull(board,row,col))
	{
		return 'Q';
	}
	return 'C';
}

test.c

#include"game.h"
void menu()
{
	printf("***********************************\n");
	printf("*************1.play****************\n");
	printf("***********************************\n");
	printf("*************0.exit****************\n");
	printf("***********************************\n");


}


void game()
{
	//定义数组并初始化
	char board[Row][Col] = { 0 };


	char ret = 0;


	//数组进行初始化
	InitBoard(board, Row, Col);


	//打印棋盘
	DisplayBoard(board, Row, Col);


	//判断输赢
	 IsWin(board, Row, Col);


	while (1)
	{
		//棋手下棋
		PlayerMove(board, Row, Col);
		ret = IsWin(board, Row, Col);
		if (ret != 'C')
		{
			break;
		}
		DisplayBoard(board, Row, Col);




		//电脑下棋
		ComputerMove(board, Row, Col);
		ret = IsWin(board, Row, Col);
		if (ret != 'C')
		{
			break;
		}
		DisplayBoard(board, Row, Col);
	}
	if (ret == '*')
	{
		printf("玩家赢了\n");
	}
	else if (ret == '#')
	{
		printf("电脑赢了\n");
	}
	else
	{
		printf("平局\n");


	}
	DisplayBoard(board, Row, Col);


}
int main()
{
	srand((unsigned)time(NULL));


	//菜单函数
	int input = 0;
	do 
	{
		menu();
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	
	} while (input);

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值