控制台小游戏 - 五子棋算法(优化)

import java.util.Scanner;
public class 完整五子棋 {
	static char zi[] = { '●', '○' }; // 黑子玩家 9679; 白字玩家 9675
public static void main(String[] args) {
	int arr[][] = new int[12][12];
	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坐标:");
			flag = 2;
			break;
		case 2:
			System.out.println("请 2 玩家(白子)输入x , y坐标:");
			flag = 1;
			break;
		}
		// x = input.nextInt();
		// y = input.nextInt();
		x = (int) (Math.random() * 11 + 1);
		y = (int) (Math.random() * 11 + 1);
		if (x == 0 || y == 0 || x > 11 || y > 11) {
			System.out.println("坐标超出区域,请重新确认!");
			flag = player;
			continue;
		} else if (arr[x][y] != 0) {
			System.out.println("此位置已有棋子,请重新确认!");
			flag = player;
			continue;
		} else if (arr[x][y] == 0)
			arr[x][y] = player;
		printf(arr);
	} while (!isWin(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.length; i++) {
		for (int j = 0; j < a[0].length; j++) {
			if (i == 0) {
				if (j > 8)
					System.out.print((j) + "-");
				else
					System.out.print((j) + "--");
			} else if (j == 0 && i > 0) {
				if (i > 9)
					System.out.print((i) + ":");
				else
					System.out.print((i) + ": ");
			} else if (a[i][j] != 0)
				System.out.print(zi[a[i][j] - 1] + "  ");
			else if (a[i][j] == 0)
				System.out.print("-  ");
		}
		System.out.println();
	}
}
/**
 * 只判断当前棋子所在的行、列、斜,不扫描棋盘
 * @param a
 * @param x
 * @param y
 * @param player
 * @return
 */
	static boolean isWin(int a[][], int x, int y, int player) {
		int row = 0, col = 0, left = 0, right = 0;
		if (x == 0 || y == 0 || x > 11 || y > 11) // 出界
			return false;
		for (int i = 1; i < a.length; i++) {
			// 判断所在行
			if (a[x][i] == player) {
				row++;
				if (row == 5)
					return true;
			} else
				row = 0;
			// 判断列
			if (a[i][y] == player) {
				col++;
				if (col == 5)
					return true;
			} else
				col = 0;
		}
		// 判断左斜
		int sum1 = x - y;
		if (a.length - Math.abs(sum1) - 1 >= 5) { // 第一列是说明,所以去掉1
			int i = x < y ? (1 - sum1) : 1; // 左上斜:左下斜
			for (int j = 0; j < (a.length - Math.abs(sum1)) - 1; j++) { // 减去一个说明列
				if (a[sum1 + i + j][i + j] == player) { // 确定第一个遍历的位置
					left++;
					if (left == 5)
						return true;
				} else {
					left = 0;
				}
			}
		}
		// 判断右斜
		int sum2 = x + y;
		// 右斜上 个数比sum2少一
		if (sum2 <= a.length && (sum2 - 1) >= 5) {
			for (int i = 0; i < sum2 - 1; i++) {
				if (a[sum2 - 1 - i][i + 1] == player) {
					right++;
					if (right == 5)
						return true;
				} else
					right = 0;
			}
		}
		// 右斜下,个数+sum2=a.length*2-1
		if (sum2 > a.length && (a.length * 2 - 1 - sum2) >= 5) {
			for (int i = 0; i < (a.length * 2 - 1 - sum2); i++) {
				if (a[a.length - 1 - i][sum2 - (a.length - 1) + i] == player) {
					right++;
					if (right == 5)
						return true;
				} else
					right = 0;
			}
		}
		return false;
	}
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的五子棋游戏的C语言代码,包含基本的游戏逻辑和界面: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <windows.h> #define BOARD_SIZE 15 #define PLAYER1 'X' #define PLAYER2 'O' char board[BOARD_SIZE][BOARD_SIZE]; void init_board() { int i, j; for (i = 0; i < BOARD_SIZE; i++) { for (j = 0; j < BOARD_SIZE; j++) { board[i][j] = '+'; } } } void display_board() { int i, j; printf(" "); for (i = 0; i < BOARD_SIZE; i++) { printf("%c ", 'A' + i); } printf("\n"); for (i = 0; i < BOARD_SIZE; i++) { printf("%2d", i+1); for (j = 0; j < BOARD_SIZE; j++) { printf("%c ", board[i][j]); } printf("\n"); } } int check_win(int row, int col, char player) { int i, j; int count; // 检查行 count = 0; for (j = col - 4; j <= col; j++) { if (j >= 0 && j + 4 < BOARD_SIZE) { for (i = 0; i < 5; i++) { if (board[row][j+i] == player) { count++; } } if (count == 5) { return 1; } count = 0; } } // 检查列 count = 0; for (i = row - 4; i <= row; i++) { if (i >= 0 && i + 4 < BOARD_SIZE) { for (j = 0; j < 5; j++) { if (board[i+j][col] == player) { count++; } } if (count == 5) { return 1; } count = 0; } } // 检查左上到右下的对角线 count = 0; for (i = row - 4, j = col - 4; i <= row && j <= col; i++, j++) { if (i >= 0 && i + 4 < BOARD_SIZE && j >= 0 && j + 4 < BOARD_SIZE) { for (int k = 0; k < 5; k++) { if (board[i+k][j+k] == player) { count++; } } if (count == 5) { return 1; } count = 0; } } // 检查左下到右上的对角线 count = 0; for (i = row + 4, j = col - 4; i >= row && j <= col; i--, j++) { if (i >= 0 && i - 4 < BOARD_SIZE && j >= 0 && j + 4 < BOARD_SIZE) { for (int k = 0; k < 5; k++) { if (board[i-k][j+k] == player) { count++; } } if (count == 5) { return 1; } count = 0; } } return 0; } void play_game() { int row, col; char player = PLAYER1; while (1) { printf("Player %c's turn:\n", player); printf("Enter row (1-%d) and column (A-%c): ", BOARD_SIZE, 'A' + BOARD_SIZE - 1); scanf("%d %c", &row, &col); row--; col -= 'A'; if (row < 0 || row >= BOARD_SIZE || col < 0 || col >= BOARD_SIZE || board[row][col] != '+') { printf("Invalid move!\n"); } else { board[row][col] = player; display_board(); if (check_win(row, col, player)) { printf("Player %c wins!\n", player); break; } player = (player == PLAYER1) ? PLAYER2 : PLAYER1; } } } int main() { init_board(); display_board(); play_game(); return 0; } ``` 这个代码实现了一个控制台界面的五子棋游戏,玩家可以通过输入行和列来下棋,程序会检查胜负并输出结果。由于时间和精力有限,这个代码仅实现了最基本的游戏逻辑,还有很多方面可以改进,比如增加AI、优化算法等等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值