在B站up学习井字棋的兴趣下,自己按照同样的逻辑编写了五子棋的程序,其中可以自己修改棋盘大小以及胜利条件,例如将棋盘大小改成3*3胜利条件为3个连续就可以把这个五子棋的程序变为井字棋,其中头文件game.h游戏程序game.c主函数test.c代码分别如下
game.h
#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include <stdio.h>
#include <windows.h>
#define ROW 14
#define COL 14
void initial(char Board[ROW][COL], int row, int col);
void display(char board[ROW][COL], int row, int col);
void player1(char Board[ROW][COL], int row, int col);
void player2(char Board[ROW][COL], int row, int col);
char is_win(char Board[ROW][COL], int row, int col, int windet);
game.c
#include "game.h"
void initial(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
void display(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
printf(" ");
for (i = 0; i < row; i++)
{
printf("%2d ", i + 1);
}
printf("\n");
for (i = 0; i < row; i++)
{
printf("%2d", i + 1);
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
{
printf("|");
}
}
printf("\n ");
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
}
}
}
void player1(char Board[ROW][COL], int row, int col)
{
printf("玩家一请输入:");
int a;
int b;
while (1)
{
scanf("%d%d", &a, &b);
if ((Board[a - 1][b - 1] == ' ') && a <= row && b <= col)
{
Board[a - 1][b - 1] = 'O';
break;
}
else
{
printf("输入错误请重新输入\n");
}
}
}
void player2(char Board[ROW][COL], int row, int col)
{
printf("玩家二请输入:");
int a;
int b;
while (1)
{
scanf("%d%d", &a, &b);
if ((Board[a - 1][b - 1] == ' ') && a <= row && b <= col)
{
Board[a - 1][b - 1] = 'X';
break;
}
else
{
printf("输入错误请重新输入\n");
}
}
}
char is_win(char Board[ROW][COL], int row, int col, int windet)
{
int i = 0;
int j = 0;
int k = 0;
//判断行
for (i = 0; i < row; i++)
{
for (j = 0; j < (col - windet + 1); j++)
{
for (k = 0; k < windet - 1; k++)
{
if (((Board[i][j + k] == Board[i][j + k + 1])) && (Board[i][j + k] != ' ') && (Board[i][j + k + 1] != ' '))
{
if (k == windet - 2)
{
return Board[i][j + k];
}
}
else
{
break;
}
}
}
}
//判断列
for (i = 0; i < col; i++)
{
for (j = 0; j < (row - windet + 1); j++)
{
for (k = 0; k < windet - 1; k++)
{
if (((Board[j + k][i] == Board[j + k + 1][i])) && (Board[j + k][i] != ' ') && (Board[j + k + 1][i] != ' '))
{
if (k == windet - 2)
{
return Board[j + k][i];
}
continue;
}
else
{
break;
}
}
}
}
//判断左对角
for (i = 0; i < (row - windet + 1); i++)
{
for (j = 0; j < (col - windet + 1); j++)
{
for (k = 0; k < windet - 1; k++)
{
if (((Board[i + k][j + k] == Board[i + k + 1][j + k + 1])) && (Board[i + k][j + k] != ' ') && (Board[i + k + 1][j + k + 1] != ' '))
{
if (k == windet - 2)
{
return Board[i + k][j + k];
}
continue;
}
else
{
break;
}
}
}
}
//判断右对角
for (i = 0; i < (row - windet + 1); i++)
{
for (j = col - 1; j > windet - 2; j--)
{
for (k = 0; k < windet - 1; k++)
{
if (((Board[i + k][j - k] == Board[i + k + 1][j - k - 1])) && (Board[i + k][j - k] != ' ') && (Board[i + k + 1][j - k - 1] != ' '))
{
if (k == windet - 2)
{
return Board[i + k][j - k];
}
continue;
}
else
{
break;
}
}
}
}
//判断平局
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (Board[i][j] == ' ')
goto flag;
}
if ((i == row - 1) && (j == col))
return'D';
}
flag:
return 'C';
}
main.c
#include "game.h"
void game()
{
system("cls");
char board[ROW][COL];
//初始化棋盘
initial(board, ROW, COL);
//打印棋盘
display(board, ROW, COL);
//赢得连续条件
int win_detect = 5;
char conclude;
while (1)
{
//玩家1下棋
player1(board, ROW, COL);
system("cls");
//展示棋盘
display(board, ROW, COL);
//检测输赢
conclude = is_win(board, ROW, COL, win_detect);
if (conclude == 'O')
{
printf("玩家一胜利\n");
break;
}
if (conclude == 'D')
{
printf("平局\n");
break;
}
//玩家2下棋
player2(board, ROW, COL);
system("cls");
//展示棋盘
display(board, ROW, COL);
//检测输赢
conclude = is_win(board, ROW, COL, win_detect);
if (conclude == 'X')
{
printf("玩家二胜利\n");
break;
}
if (conclude == 'D')
{
printf("平局\n");
break;
}
}
}
int main()
{
int a = 0;
do
{
menu();
scanf("%d", &a);
switch (a)
{
case 1:
game();
break;
case 0:
break;
default:
printf("输入错误\n");
}
} while (a);
return 0;
}
menu()
{
printf("**********************\n");
printf("*****1 play ******\n");
printf("*****0 exit ******\n");
printf("**********************\n");
}
运行后如下

输入了1之后

相比较老师的,如果是游玩五子棋还是需要在行和列备注每行每列的数字方便输入
现在我们依次让玩家输入(1,1)(1,2)(1,3)(1,4)(1,5)来看看执行的效果

可以看到符号准确的填入。
其中填写代码的时候发现了一个小问题就是

conclude = is_win(...)这段代码 并不可以直接
if (is_win(...)=='X')
这样子永远都进入不了if的选择语句之中,需要先给conclude赋值在判断,我猜测这个问题归结于C语言的底层逻辑,is_win能够return里面的字符串,但是不能直接拿来和单字符比较,必须要先赋值才可以。
另外,对二维数组进行传参的时候,函数命令直接输入数组名字加上后面的中括号即可
如下所示

C语言实现可定制五子棋与井字棋程序:基础代码与问题解析,
本文介绍了作者基于B站教程,使用C语言编写的五子棋程序,可以自定义棋盘大小和胜利条件。代码展示了如何初始化棋盘、显示棋局及检测胜利条件,同时提及了在函数调用中的小问题和C语言的一些特性。
9183

被折叠的 条评论
为什么被折叠?



