c语言实现五子棋

  五子棋是一个非常经典的游戏,今天我试着用c语言来写,可以自定义多少个子连在一起算是胜利,自定义棋盘大小,不足的是AI只能下随机,没有一定的分析棋盘能力。

  首先理清楚思路,我希望程序能先打印棋盘,然后让我下棋,之后判断下棋位置的合法性(不合法则提示我重新下),然后判断玩家是否胜利,接着判断平局。机器下则是运用随机数,别的步骤是一样的。

  思路理清开始写代码,先写一个简单的打印菜单;

void menu()
{
	printf("-----------------------------------\n");
	printf("*******    1.开始游戏     *********\n");
	printf("*******    0.退出游戏     *********\n");
	printf("-----------------------------------\n");
	int input = 0;
	char arr[HANG][LIE] = { 0 };
	printf("请选择:");
	do
	{
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game(arr, HANG, LIE);
			break;
		case 0:
			printf("退出");
			break;
		default:
			printf("输入的值错误,请重新输入:");
		}
	} while (input);
}

然后写出游戏函数

void game(char arr[HANG][LIE],int hang,int lie)
{
	chushihua(arr, hang, lie);
	display(arr, hang, lie);
	while (1)
	{
		if (put_palyer(arr,hang,lie) == 1)
		{
			display(arr, hang, lie);
			printf("\n玩家赢\n");
			break;
		}
		if (is_full(arr, hang, lie))
		{
			display(arr, hang, lie);
			printf("\n平局\n");
			break;
		}
		display(arr, hang, lie);
		if (put_computer(arr,hang,lie) == 1)
		{
			display(arr, hang, lie);
			printf("电脑赢");
			break;
		}
		if (is_full(arr, hang, lie))
		{
			display(arr, hang, lie);
			printf("\n平局\n");
			break;
		}
		display(arr, hang, lie);	
	}
	menu();//我希望结束后玩家能看到上次结束时的完整棋盘,并可以选择是否进行下一次游戏
}

当然数组最好是要初始化一下

void chushihua(char arr[HANG][LIE], int hang, int lie)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < hang; i++)
	{
		for (j = 0; j < lie; j++)
			arr[i][j] = ' ';
	}
}

之后写出打印函数,能打印出棋盘

void display(char arr[HANG][LIE], int hang, int lie)
{
	system("cls");
	int i = 0;
	int j = 0;
	for (i = 0; i < hang; i++)
		printf("  %d ", i + 1);
	printf("\n");
	for (i = 0; i < hang; i++)
	{
		printf("%d", i + 1);
		for (j = 0; j < lie-1; j++)
		{
			printf(" %c |", arr[i][j]);
		}
		printf(" %c\n ", arr[i][j]);
		if (i < hang - 1)
		{
			for (j = 0; j < lie - 1; j++)
				printf("---|");
			printf("---\n");
		}
	}
}

接着写出 玩家和计算机下棋的函数

int put_palyer(char arr[HANG][LIE],int hang,int lie)
{
	int i = 0;
	int j = 0;
	printf("(#方)请输入坐标:");
	while (1)
	{
		scanf("%d %d", &i, &j);
		if (i < 1 || i > hang || j < 1 || j > lie)
		{
			printf("坐标非法,重新输入:");
			continue;
		}
		else if (arr[i-1][j-1] != ' ')
		{
			printf("坐标占用,重新输入:");
			continue;
		}
		else
		{
			arr[i-1][j-1] = '#';
			break;
		}
	}
	if (panduan(arr, hang, lie, '#') == 1)
		return 1;
	return 0;
}


int put_computer(char arr[HANG][LIE], int hang, int lie)
{
	while (1)
	{
		int i = rand() % hang;
		srand((unsigned int)time(NULL));
		int j = rand() % lie;
		if (0 <= i && i < hang && 0 <= j && j < lie && arr[i][j] == ' ')
		{
			arr[i][j] = '@';
			break;
		}
	}
	if (panduan(arr, hang, lie, '@') == 1)
		return 1;
	return 0;
}

最后最难的是实现判断输赢的函数

我的思路是4个大判断 分别为竖直 水平 左上到右下 左下到右上 4 个大判断

然后创建一个全局变量flag  如果在某行 或者 某列 或者 某斜线中 发现有玩家或者电脑下的棋,flag就+1,但是如果没有,就说明被断开了,flag就要变为0,在这一列,或者在这行中,或者在这斜线中,发现flag=5,那么就可以说明玩家或者电脑获胜。非常需要注意的是,换行,换列,换斜线都要重新让flag=0。

知道了判断思路,但是怎么写判断过程呢。竖直和水平是很容易的,难点是斜线判断。这里引入局部变量k,再次将左上到右下,左下到右上分别分为两个部分。

 我们来看左上到右下的过程。分为两个部分。靠上的箭头和靠下的箭头。

从靠下的箭头来讲。我希望用k来表示判断斜线的下移,但是因为五子棋的缘故,所以k最大为hang-5,其中hang为行数。然后就像竖直和水平那样,进行判断,但是每次行都要以k为起始位置。

从靠上的箭头来讲。我希望用k来表示判断斜线的右移。但是因为五子棋的缘故,所以k最低为lie-5,其中lie为列数,然后就和上面的是一样,只不过,k最大为lie-5,列数每次都从k开始。

int panduan2(char x,char y)
{
	if (x == y)
		flag++;
	else
		flag = 0;
	if (flag == 5)
		return 1;
	return 0;
}
int panduan(char arr[HANG][LIE], int hang, int lie, char a)
{
	int flag = 0;
	int i = 0;
	int j = 0;
	int k = 0;
	for (i = 0; i < hang; i++)//横向判断
	{
		flag = 0;
		for (j = 0; j < lie; j++)
			if (panduan2(arr[i][j], a) == 1)
				return 1;
	}
	for (j = 0; j < hang; j++)//竖向判断
	{
		flag = 0;
		for (i = 0; i < lie; i++)
			if (panduan2(arr[i][j], a) == 1)
				return 1;
	}
	for (k = 0; k < hang - 4; k++)
	{
		flag = 0;
		for (i = k, j = 0; i < hang; i++, j++)
			if (panduan2(arr[i][j], a) == 1)
				return 1;
	}
	for (k = 1; k < lie - 4; k++)
	{
		flag = 0;
		for (i = 0, j = k; j < lie; i++, j++)
			if (panduan2(arr[i][j], a) == 1)
				return 1;
	}
	for (k = hang - 1; k > 3; k--)
	{
		flag = 0;
		for (i = k, j = 0; i >= 0; i--, j++)
			if (panduan2(arr[i][j], a) == 1)
				return 1;
	}
	for (k = 1; k < lie - 4; k++)
	{
		flag = 0;
		for (i = hang - 1, j = k; j < lie; j++, i--)
			if (panduan2(arr[i][j], a) == 1)
				return 1;
	}
	return 0;
}

左下到右上也是一样的方法和思路。

最后我们还需要写一个判断平局的代码。

int is_full(char arr[HANG][LIE], int hang, int lie)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < hang; i++)
	{
		for (j = 0; j < lie; j++)
			if (arr[i][j] == ' ')
				return 0;
	}
	return 1;
}

最后完成了整个程序的基本实现逻辑。

gitee链接:RoseIsBlue/learning_c_language - Gitee.com

11.8的代码

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 以下是一个简单的五子棋游戏的示例代码,使用 VC++ 编写。 ```c++ #include <iostream> #include <Windows.h> using namespace std; const int BOARD_SIZE = 15; // 棋盘大小 const int CHESS_BLACK = 1; // 黑子 const int CHESS_WHITE = 2; // 白子 const int CHESS_EMPTY = 0; // 空白 int board[BOARD_SIZE][BOARD_SIZE]; // 棋盘 bool is_black_turn = true; // 是否黑子下棋 void init_board(); // 初始化棋盘 void print_board(); // 打印棋盘 void put_chess(int x, int y, int chess_type); // 下棋 bool check_win(int x, int y); // 检查是否获胜 bool check_draw(); // 检查是否平局 int main() { init_board(); while (true) { print_board(); int x, y; cout << "请输入坐标(x y): "; cin >> x >> y; if (x < 1 || x > BOARD_SIZE || y < 1 || y > BOARD_SIZE) { cout << "坐标不合法,请重新输入!" << endl; continue; } if (board[x - 1][y - 1] != CHESS_EMPTY) { cout << "该位置已有棋子,请重新输入!" << endl; continue; } int chess_type = is_black_turn ? CHESS_BLACK : CHESS_WHITE; put_chess(x - 1, y - 1, chess_type); if (check_win(x - 1, y - 1)) { print_board(); cout << (is_black_turn ? "黑子" : "白子") << "获胜!" << endl; break; } if (check_draw()) { print_board(); cout << "平局!" << endl; break; } is_black_turn = !is_black_turn; } return 0; } void init_board() { for (int i = 0; i < BOARD_SIZE; i++) { for (int j = 0; j < BOARD_SIZE; j++) { board[i][j] = CHESS_EMPTY; } } } void print_board() { system("cls"); // 清屏 cout << " "; for (int i = 1; i <= BOARD_SIZE; i++) { cout << " " << i; } cout << endl; for (int i = 0; i < BOARD_SIZE; i++) { cout << i + 1 << " "; for (int j = 0; j < BOARD_SIZE; j++) { char chess; if (board[i][j] == CHESS_BLACK) { chess = 'X'; } else if (board[i][j] == CHESS_WHITE) { chess = 'O'; } else { chess = ' '; } cout << "|" << chess; } cout << "|" << endl; } } void put_chess(int x, int y, int chess_type) { board[x][y] = chess_type; } bool check_win(int x, int y) { int chess_type = board[x][y]; // 横向 int count = 0; for (int i = max(x - 4, 0); i <= min(x + 4, BOARD_SIZE - 1); i++) { if (board[i][y] == chess_type) { count++; if (count == 5) { return true; } } else { count = 0; } } // 纵向 count = 0; for (int i = max(y - 4, 0); i <= min(y + 4, BOARD_SIZE - 1); i++) { if (board[x][i] == chess_type) { count++; if (count == 5) { return true; } } else { count = 0; } } // 斜向(左上到右下) count = 0; for (int i = max(x - 4, 0), j = max(y - 4, 0); i <= min(x + 4, BOARD_SIZE - 1) && j <= min(y + 4, BOARD_SIZE - 1); i++, j++) { if (board[i][j] == chess_type) { count++; if (count == 5) { return true; } } else { count = 0; } } // 斜向(右上到左下) count = 0; for (int i = max(x - 4, 0), j = min(y + 4, BOARD_SIZE - 1); i <= min(x + 4, BOARD_SIZE - 1) && j >= max(y - 4, 0); i++, j--) { if (board[i][j] == chess_type) { count++; if (count == 5) { return true; } } else { count = 0; } } return false; } bool check_draw() { for (int i = 0; i < BOARD_SIZE; i++) { for (int j = 0; j < BOARD_SIZE; j++) { if (board[i][j] == CHESS_EMPTY) { return false; } } } return true; } ``` 注意:该示例代码只是五子棋游戏的基本实现,还有很多改进的空间,例如添加悔棋、保存棋谱等功能。如果需要实现更完整的五子棋游戏,建议参考其他资料。 ### 回答2: 编写vcC语言五子棋游戏,需要按照以下步骤进行: 1. 首先,在VC中创建一个新的Win32控制台应用程序项目。 2. 引入相关头文件和库文件,如 `windows.h` 和 `conio.h`。 3. 定义游戏所需的全局变量,如棋盘大小、棋子颜色等。 4. 编写一个函数初始化棋盘,将棋盘上的所有位置初始化为空。 5. 编写一个函数绘制棋盘,使用循环来绘制棋盘的行和列,并根据棋盘上的棋子绘制相应的标记。 6. 编写一个函数判断游戏是否胜利,通过检查棋盘上的每一个位置来判断是否有五子连珠的情况。 7. 编写一个函数落子,允许玩家输入坐标来落子,并将相应位置的棋盘标记为玩家的颜色。 8. 编写一个函数实现游戏的主循环,不断交替调用落子函数,直到出现胜利或平局的情况。 9. 在主函数中调用初始化函数和游戏主循环函数。 以上是编写vcC语言五子棋游戏的大致步骤,具体实现细节需要根据自己的需求进行调整和完善。编写完毕后,可以通过编译和运行来验证游戏的功能和正确性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

roseisbule

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

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

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

打赏作者

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

抵扣说明:

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

余额充值