简易三子棋

目录

1、开始界面

2、退出程序

3、制作棋盘

4、放置棋子

5、判断胜负

胜负

平局

6、开始游戏

结束

1、开始界面

void Show_Menu() {
	printf("######################## \n");
	printf("#         请选择       # \n");
	printf("#      1、开始游戏     # \n");
	printf("#      2、退出游戏     # \n");
	printf("######################## \n");
}

2、退出程序

void ExitGame() {
	
	printf("######################## \n");
	printf("#                      # \n");
	printf("#     欢迎下次再来     # \n");
	printf("#                      # \n");
	printf("######################## \n");
	system("pause");
	exit(0);			// 可以直接退出程序
}

(搞这么多主要是为了好看)

3、制作棋盘

先定义一个二维数组

为了方便就在全局定义

int arr[3][3] = { { 0,0,0 },
				  { 0,0,0 },
				  { 0,0,0 } };

打印棋盘

数组中0 为空     1为白子      -1为黑子

void Show_Map() {
	printf("   1  2  3\n");		// 横坐标	
	for (int i = 0; i < 3; i++) {
		printf("%d ", i+1);		// 纵坐标
		for (int j = 0; j < 3; j++)
		{

			if (arr[i][j] == 1) printf("●");
			else if (arr[i][j] == -1) printf("○");
			else printf("  ");

			if (j == 0 || j == 1) printf("|");			
		}
		printf("\n");
		if (i == 0 || i == 1) printf("  —|—|—\n");
	}
}

效果图

4、放置棋子

void Place(int i, int j,int chess) {
	arr[i][j] = chess;	
}

这里的 chess 就是棋子的类型   1 或  -1

5、判断胜负

胜负

int Judge(int chess) {
	int sum = 0;
	for (int i = 0; i < 3; i++) {			// 判断 行
		sum = 0;
		for (int j = 0; j < 3; j++) {
			if (arr[i][j] == chess) sum++;
			if (sum == 3) {
				return 1;
			}
		}
	}
	sum = 0;
	for (int i = 0; i < 3; i++) {			// 判断 列
		sum = 0;
		for (int j = 0; j < 3; j++) {
			if (arr[j][i] == chess) sum++;
			if (sum == 3) {
				return 1;
			}
		}
	}
	sum = 0;
	for (int i = 0; i < 3; i++) {			// 判断 主对角线
		if (arr[i][i] == chess) sum++;
		if (sum == 3) {
			return 1;
		}
	}
	sum = 0;
	for (int i = 0; i < 3; i++) {			// 判断 次对角线
		if (arr[i][2-i] == chess) sum++;
		if (sum == 3) {
			return 1;
		}
	}
	return 0;
}

因为我们只需要在一方下一个棋子后  判断这方的棋子类型能否连成三个

所以只需要循环遍历判断 传进去的 类型的棋子 

平局

在一方下完一个棋子 判断 不能 赢得胜利后 

再来判断棋盘是否满了

满了 就为平局

int Is_Full() {
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			if (arr[i][j] == 0) {			// 只有有一个 0 就说明 棋盘没满
				return 0;
			}
		}
	}
	return 1;
}

6、开始游戏

void play() {
	int chess = 1;						// 有个好处
	int i = 1, j = 1;					
	Show_Map();
	while (1) {
		printf("请输入坐标:");
		scanf_s("%d %d", &i, &j);
		if (arr[i - 1][j - 1] != 0) {	// 判断输入的位置是否 有棋子
			printf("已有棋子,请重新输入\n");
			system("pause");
			continue;					// 直接跳过下面的进入下层循环 (下同)
		}
		if (i>3||i<1||j>3||j<1) {		// 判断输入的位置是否 超出界限
			printf("无效位置,请重新输入\n");
			system("pause");
			continue;					
		}
		Place(i-1, j-1, chess);			// i-1 j-1 是因为 数组下标是从0 开始
		system("cls");
		Show_Map();
		if (Judge(chess)) {				// 只需要判断 刚刚放置的棋子类型 是否能赢
			switch (chess)
			{
			case 1:printf("白子胜利了!\n");
				break;
			case -1:printf("黑子胜利了!\n");
				break;
			}
			break;
		}
		else if(Is_Full()) {			// 如果不能赢 可以判断 棋盘是否满了
			printf("平局了!\n");
			break;
		}
		chess = -chess;				// chess 为 1和-1 的好处就是 方便转换
	}
	system("pause");
	system("cls");
}

结束

测试一下

 还行。

完整代码在这

四月份/4-27 · 一点鱼/C语言练习作业 - 码云 - 开源中国 (gitee.com)https://gitee.com/OnePointFish/C-practice/tree/master/%E5%9B%9B%E6%9C%88%E4%BB%BD/4-27

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值