Windows 10系统下C语言五子棋游戏的源代码和编译指南
概述
本程序实现了一款经典的五子棋游戏,支持在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
