概述
本程序实现了一款经典的五子棋游戏,支持在Windows系统上运行,玩家可以通过键盘输入来落子,程序会实时更新棋盘并判断是否有玩家获胜。
主要功能
1、显示棋盘:程序会输出当前的五子棋棋盘状态。
2、初始化棋盘:程序会在开始游戏时初始化棋盘,所有位置都填充为空白。
3、游戏循环:程序会不断执行落子操作,直到有玩家获胜或者棋盘被填满。
4、胜负判断:程序会检查棋盘上是否存在连续5个相同颜色的棋子,如果存在,则判定相应的玩家获胜。
代码实现
#include <stdio.h> #define N 16 // 显示五子棋棋盘 void wzq_show(char (*GAME)[N]) { int i, j; printf("五子棋棋盘如下:\n"); for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { printf("%c ", GAME[i][j]); } printf("\n"); } } // 初始化五子棋棋盘 void wzq_init(char (*GAME)[N]) { int i, j; for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { GAME[i][j] = '+'; } } } // 游戏是否胜利的运算,一旦有人胜利则返回1 int wzq_play(int a, int b, char (*GAME)[N]) { int i, j, k; // 方向-上的 for (j = b - 4; j < b + 4; j++) { if (j < 0 || j >= N) continue; for (i = 0; i < 5; i++) { if ('@' == GAME[a][j + i] || '+' == GAME[a][j + i]) break; if ('O' == GAME[a][j + i] && 4 == i) { printf("\n恭喜你,白家——方向上获胜!\n"); return 1; } } } // 方向|上的 for (i = a - 4; i < a + 4; i++) { if (i < 0 || i >= N) continue; for (j = 0; j < 5; j++) { if ('@' == GAME[i + j][b] || '+' == GAME[i + j][b]) break; if ('O' == GAME[i + j][b] && 4 == j) { printf("\n恭喜你,白家——方向上获胜!\n"); return 1; } } } // 方向\上的 for (i = a - 4, j = b - 4; i < a + 4 && j < b + 4; i++, j++) { if (i < 0 || i >= N || j < 0 || j >= N) continue; for (k = 0; k < 5; k++) { if ('@' == GAME[i + k][j + k] || '+' == GAME[i + k][j + k]) break; if ('O' == GAME[i + k][j + k] && 4 == k) { printf("\n恭喜你,白家——方向上获胜!\n"); return 1; } } } // 方向/上的 for (i = a + 4, j = b - 4; i > a - 4 && j < b + 4; i--, j++) { if (i < 0 || i >= N || j < 0 || j >= N) continue; for (k = 0; k < 5; k++) { if ('@' == GAME[i - k][j + k] || '+' == GAME[i - k][j + k]) break; if ('O' == GAME[i - k][j + k] && 4 == k) { printf("\n恭喜你,白家——方向上获胜!\n"); return 1; } } } return 0; } int main() { char GAME[N][N] = {0}; int count = 0; // 轮换落子计算 int m, n; // 白家 int x, y; // 黑家 int res = 0; int k = 0; wzq_init(GAME); wzq_show(GAME); while (1) { // 当棋盘格子被下满了时 if (N * N == count) { printf("棋盘已经下满了,平局!\n"); return 0; } if (0 == count % 2) { printf("请白家落子(例如0 3或1 3):"); scanf("%d%d", &m, &n); while (m < 0 || m >= N || n < 0 || n >= N) { printf("输入的坐标超出范围,请重新输入:"); scanf("%d%d", &m, &n); } while ('+' != GAME[m][n]) { printf("此处已经落过子,请重新落子:"); scanf("%d%d", &m, &n); } GAME[m][n] = 'O'; res = wzq_play(m, n, GAME); if (1 == res) { wzq_show(GAME); printf("程序结束\n"); return 0; } } else { printf("请黑家落子(例如0 3或1 3):"); scanf("%d%d", &x, &y); while (x < 0 || x >= N || y < 0 || y >= N) { printf("输入的坐标超出范围,请重新输入:"); scanf("%d%d", &x, &y); } while ('+' != GAME[x][y]) { printf("此处已经落过子,请重新落子:"); scanf("%d%d", &x, &y); } GAME[x][y] = '@'; res = wzq_play(x, y, GAME); if (1 == res) { wzq_show(GAME); printf("程序结束\n"); return 0; } } count++; wzq_show(GAME); } return 0; }
详细说明
1、显示棋盘:通过wzq_show
函数打印出当前的五子棋棋盘状态。
2、初始化棋盘:通过wzq_init
函数初始化棋盘,所有位置都填充为空白。
3、游戏循环:程序会不断执行落子操作,直到有玩家获胜或者棋盘被填满。
4、胜负判断:通过wzq_play
函数检查棋盘上是否存在连续5个相同颜色的棋子,如果存在,则判定相应的玩家获胜。
代码注释
#define N 16
:定义了棋盘的大小为16x16。
#define MAX_COUNT 5
:定义了获胜所需棋子数量为5个。
int board[BOARD_SIZE][BOARD_SIZE];
:定义了战盘,形成二维数组。
GAME[m][n] = 'O';
:将第m
行第n
列上的位置标记为白棋。
GAME[x][y] = '@';
:将第x
行第y
列上的位置标记为黑棋。
希望这个代码能满足您的需求!如果有任何问题,请随时提问。
0