五子棋 算法 的简单实现

此例子为电脑随机测试,用的是全盘扫描,写法简单,效率不高。
	import java.util.Scanner;
public class 五子棋 {
	static char zi[] = { '●', '○' }; // 黑子玩家 9679; 白字玩家 9675
public static void main(String[] args) {
	int arr[][] = new int[11][11];
	printf(arr);
	Scanner input = new Scanner(System.in);
	int x, y;
	int flag = 1; // 下次改哪个玩家下
	int player; // 当前玩家是谁
	do {
		player = flag;
		switch (flag) {
		case 1:
			System.out.println("请 1 玩家(黑子)输入x , y坐标,从1开始:");
			flag = 2;
			break;
		case 2:
			System.out.println("请 2 玩家(白子)输入x , y坐标,从1开始:");
			flag = 1;
			break;
		}
		// x = input.nextInt();
		// y = input.nextInt();
		x = (int) (Math.random() * 11 + 1);
		y = (int) (Math.random() * 11 + 1);
		if (x < 1 || y < 1 || x > 11 || y > 11) {
			System.out.println("坐标超出区域,请重新确认!");
			flag = player;
			continue;
		} else if (arr[x - 1][y - 1] != 0) {
			System.out.println("此位置已有棋子,请重新确认!");
			flag = player;
			continue;
		} else if (arr[x - 1][y - 1] == 0)
			arr[x - 1][y - 1] = player;
		printf(arr);
	} while (!judge(arr, x, y, player));
	System.out.println("玩家" + zi[player - 1] + "赢了");
	input.close();
	return;
}

// 打印棋谱
public static void printf(int a[][]) {
	for (int i = 0; i < a[0].length; i++) {
		for (int j = 0; j < a[0].length; j++) {
			if (a[i][j] != 0)
				System.out.print(zi[a[i][j] - 1] + "  ");
			else
				System.out.print("=  ");
		}
		System.out.println();
	}
}

// 判断
static boolean judge(int a[][], int x, int y, int player) {
	int row = 0, col = 0, left = 0, right = 0;
	if (x < 1 || y < 1 || x > 11 || y > 11) // 出界
		return false;
	for (int i = 0; i < a.length; i++) {
		// 判断所在行
		if (a[x - 1][i] == player) {
			row++;
			if (row == 5)
				return true;
		} else
			row = 0;
		// 判断列
		if (a[i][y - 1] == player) {
			col++;
			if (col == 5)
				return true;
		} else
			col = 0;
	}
	// 判断斜线
	int sum1 = x - y; // 左斜 (x-1)-(y-1) 差一样
	int sum2 = x + y - 2; // 右斜 (x-1)+(y-1) 和一样
	for (int i = 0; i < a.length; i++) {
		for (int j = 0; j < a[i].length; j++) {
			// 左斜
			if ((i - j) == sum1 && a[i][j] == player) {
				left++;
				if (left == 5)
					return true;
			} else if ((i - j) == sum1 && a[i][j] != player)
				left = 0;
			// 右斜
			if ((i + j) == sum2 && a[i][j] == player) {
				right++;
				if (right == 5)
					return true;
			} else if ((i + j) == sum2 && a[i][j] != player)
				right = 0;
		}
	}
	return false;
}

}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值