头文件:game.h
#pragma once
//游戏代码的声明(函数声明,符号定于)
#define ROW 10//棋盘的行数
#define LIN 10//棋盘的列数
void ceshi();
void meau();//打印游戏菜单
void game();//三子棋游戏逻辑的实现
void init_board(char board[ROW][LIN], int row, int lin);//初始化棋盘
//打印棋盘
void print_board(char board[ROW][LIN], int row, int lin);
//判断是否连成三子
//返回为1表示连成三子,返回0表示不成三子
int pan_duan(char board[ROW][LIN], int row, int lin);
//比较两个字符是否相等,相等返回1;不相等返回0
int bi_jiao(char a, char b);
//判断从改子往上数共n个数是否一样
int pan_duan_shang(char board[ROW][LIN], int i, int j, int n);
//判断从该子往下数共n个数是否一样
int pan_duan_xia(char board[ROW][LIN], int i, int j, int n);
//判断从该子往左数共n个数是否一样
int pan_duan_zuo(char board[ROW][LIN], int i, int j, int n);
//判断从该子往右数共n个数是否一样
int pan_duan_you(char board[ROW][LIN], int i, int j, int n);
//判断从该子往左上数共n个数是否一样
int pan_duan_zuoshang(char board[ROW][LIN], int i, int j, int n);
//判断从该子往左下数共n个数是否一样
int pan_duan_zuoxia(char board[ROW][LIN], int i, int j, int n);
//判断从该子往右上数共n个数是否一样
int pan_duan_youshang(char board[ROW][LIN], int i, int j, int n);
//判断从该子往右下数共n个数是否一样
int pan_duan_youxia(char board[ROW][LIN], int i, int j, int n);
//玩家下棋
void player(char board[ROW][LIN]);
代码:game.c
#define _CRT_SECURE_NO_WARNINGS
//游戏代码的实现
#include<stdio.h>
#include"game.h"
//测试数据
void ceshi()
{
}
//打印游戏菜单
void meau()
{
printf("********************\n");
printf("******1.play********\n");
printf("******0.exit********\n");
printf("********************\n");
}
//实现游戏的逻辑
void game()
{
char board[ROW][LIN] = { 0 };
//初始化棋盘
init_board(board, ROW, LIN);
//打印初始化后的棋盘
printf("初始棋盘如下:\n");
print_board(board, ROW, LIN);
//玩家开始游戏
while (1)
{ //先让玩家看见棋盘
/*print_board(board, ROW, LIN); */
//玩家下棋
player(board);
//下一次棋,显示一次棋盘
print_board(board, ROW, LIN);
判断是否连成三子
int c = pan_duan(board,ROW,LIN);
if (c == 1)
{
printf("恭喜您!\n");
break;
}
/*if(c != 1)
{
player(board);
}*/
}
//打印最终棋盘
print_board(board, ROW, LIN);
printf("恭喜您,已成功连成5子,最终结果如上↑\n");
}
//初始化棋盘
void init_board(char board[ROW][LIN], int row, int lin)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < lin; j++)
{
board[i][j] = ' ';
}
}
}
//打印棋盘
//void print_board(char board[ROW][LIN], int row, int lin)
//{
// int i = 0;
// int j = 0;
// //输出最上面的边框---------
// for (j = 0; j < lin; j++)
// {
// printf(" ---");
// }
// printf("\n");
// for (i = 0; i < row; i++)
// {
// for (j = 0; j < lin; j++)
// {
// printf("| %c ",board[i][j]);
// if (j == lin - 1)
// {
// printf("|");
// }
// }
// printf("\n");
// for (j = 0; j < lin; j++)
// {
// printf(" ---");
// }
// printf("\n");
// }
//}
//打印棋盘
void print_board(char board[ROW][LIN], int row, int lin)
{
int i = 0;
int j = 0;
//首先打印对应的列数
for (j = 1; j <= LIN; j++)
{
if (j == 1)//空出两个与行数对齐
{
printf(" ");
}
printf(" %-2d", j);
}
printf("\n");
//打印表格的上边界
for (j = 0; j < LIN; j++)
{
if (j == 0)
{
printf(" ");
}
printf(" ---");
}
printf("\n");
//打印剩下的表格
for (i = 0; i < ROW; i++)
{
for (j = 0; j < LIN; j++)
{
if (j == 0)
{
printf("%-2d", i+1);//打印行数
}
printf("| %-2c", board[i][j]);
if (j == LIN - 1)
{
printf("|");
}
}
printf("\n");
for (j = 0; j < LIN; j++)
{
if (j == 0)
{
printf(" ");
}
printf(" ---");
}
printf("\n");
}
}
//判断从该子往上数共n个数是否一样
int pan_duan_shang(char board[ROW][LIN],int i,int j,int n)
{
//首先判断此位置是是否为空,为空则不需要判断
if (board[i][j] != ' ')
{
//判断从改子往上是否连成三子
//先判断往上数是都由三个格子,没有则不需要判断
if (i >= n - 1)
{
//三子需要判断三次,n子需要判断n-1次,当前位置与下一个位置进行比较
int m = i;//用来控制判断次数
for (m = i; m >= i - n + 2; m--)
{
if (m != i - n + 2)//还未比较到最后一位
{
if (board[m][j] == board[m - 1][j])
{
continue;
}
else
{
return 0;
}
}
if (m == i - n + 2)//比较到最后一位时
{
if (board[m][j] == board[m - 1][j])
{
return 1;
}
else
{
return 0;
}
}
}
}
else
{
return 0;
}
}
else
{
return 0;
}
}
//判断从该子往下数共n个数是否一样
int pan_duan_xia(char board[ROW][LIN], int i, int j, int n)
{
//首先判断此位置是是否为空,为空则不需要判断
if (board[i][j] != ' ')
{
//判断从改子往下是否连成三子
//先判断往上数是都由三个格子,没有则不需要判断
if (ROW - 1 - i >= n - 1)
{
//三子需要判断三次,n子需要判断n-1次,当前位置与下一个位置进行比较
int m = i;//用来控制判断次数
for (m = i; m <= i + n - 2; m++)
{
if (m != i + n - 2)//还未比较到最后一位
{
if (board[m][j] == board[m + 1][j])
{
continue;//相同直接进行比较下一位
}
else
{
return 0;//不相同直接跳出不需要比较
}
}
if (m == i + n - 2)//比较到最后一位时
{
if (board[m][j] == board[m + 1][j])
{
return 1;
}
else
{
return 0;
}
}
}
}
else
{
return 0;
}
}
else
{
return 0;
}
}
//判断从该子往左数共n个数是否一样
int pan_duan_zuo(char board[ROW][LIN], int i, int j, int n)
{
//首先判断此位置是是否为空,为空则不需要判断
if (board[i][j] != ' ')
{
//判断从改子往左是否连成三子
//先判断往左数是否有三个格子,没有则不需要判断
if (j >= n - 1)
{
//三子需要判断三次,n子需要判断n-1次,当前位置与下一个位置进行比较
int m = j;//用来控制判断次数
for (m = j; m >= j - n + 2; m--)
{
if (m != j - n + 2)//还未比较到最后一位
{
if (board[i][m] == board[i][m-1])
{
continue;
}
else
{
return 0;
}
}
if (m == j - n + 2)//比较到最后一位时
{
if (board[i][m] == board[i][m-1])
{
return 1;
}
else
{
return 0;
}
}
}
}
else
{
return 0;
}
}
else
{
return 0;
}
}
//判断从该子往右数共n个数是否一样
int pan_duan_you(char board[ROW][LIN], int i, int j, int n)
{
//首先判断此位置是是否为空,为空则不需要判断
if (board[i][j] != ' ')
{
//判断从改子往下是否连成三子
//先判断往上数是都由三个格子,没有则不需要判断
if (LIN -1 - j >= n - 1)
{
//三子需要判断三次,n子需要判断n-1次,当前位置与下一个位置进行比较
int m = j;//用来控制判断次数
for (m = j; m <= j + n - 2; m++)
{
if (m != j + n - 2)//还未比较到最后一位
{
if (board[i][m] == board[i][m+1])
{
continue;//相同直接进行比较下一位
}
else
{
return 0;//不相同直接跳出不需要比较
}
}
if (m == j + n - 2)//比较到最后一位时
{
if (board[i][m] == board[i][m + 1])
{
return 1;
}
else
{
return 0;
}
}
}
}
else
{
return 0;
}
}
else
{
return 0;
}
}
//判断从该子往左上数共n个数是否一样
int pan_duan_zuoshang(char board[ROW][LIN], int i, int j, int n)
{
//首先判断此位置是是否为空,为空则不需要判断
if (board[i][j] != ' ')
{
//判断从改子往上是否连成三子
//先判断往上数是都由三个格子,没有则不需要判断
if (i >= n - 1 && j >=n-1)
{
//三子需要判断三次,n子需要判断n-1次,当前位置与下一个位置进行比较
int m = i;
int z = j;//用来控制判断次数
for (m = i,z = j; m >= i - n + 2,z >= j - n+2; m--,z--)
{
if (m != i - n + 2 && z!=j-n+2)//还未比较到最后一位
{
if (board[m][z] == board[m - 1][z-1])
{
continue;
}
else
{
return 0;
}
}
if (m == i - n + 2 && z == j-n+2)//比较到最后一位时
{
if (board[m][z] == board[m - 1][z-1])
{
return 1;
}
else
{
return 0;
}
}
}
}
else
{
return 0;
}
}
else
{
return 0;
}
}
//判断从该子往左下数共n个数是否一样
int pan_duan_zuoxia(char board[ROW][LIN], int i, int j, int n)
{
//首先判断此位置是是否为空,为空则不需要判断
if (board[i][j] != ' ')
{
//判断从改子往左下是否连成三子
//先判断往左下数是都由三个格子,没有则不需要判断
if (ROW - 1 -i >= n - 1 && j >= n - 1)
{
//三子需要判断三次,n子需要判断n-1次,当前位置与下一个位置进行比较
int m = i;
int z = j;//用来控制判断次数
for (m = i, z = j; m <= i + n -2, z >= j - n + 2; m++, z--)
{
if (m != i + n - 2 && z != j - n + 2)//还未比较到最后一位
{
if (board[m][z] == board[m + 1][z - 1])
{
continue;
}
else
{
return 0;
}
}
if (m == i + n - 2 && z == j - n + 2)//比较到最后一位时
{
if (board[m][z] == board[m + 1][z - 1])
{
return 1;
}
else
{
return 0;
}
}
}
}
else
{
return 0;
}
}
else
{
return 0;
}
}
//判断从该子往右上数共n个数是否一样
int pan_duan_youshang(char board[ROW][LIN], int i, int j, int n)
{
//首先判断此位置是是否为空,为空则不需要判断
if (board[i][j] != ' ')
{
//判断从改子往左下是否连成三子
//先判断往左下数是都由三个格子,没有则不需要判断
if (i >= n - 1 && LIN-1-j >= n - 1)
{
//三子需要判断三次,n子需要判断n-1次,当前位置与下一个位置进行比较
int m = i;
int z = j;//用来控制判断次数
for (m = i, z = j; m >= i - n + 2, z <= j + n - 2; m--, z++)
{
if (m != i - n + 2 && z != j + n - 2)//还未比较到最后一位
{
if (board[m][z] == board[m - 1][z + 1])
{
continue;
}
else
{
return 0;
}
}
if (m == i - n + 2 && z == j + n - 2)//比较到最后一位时
{
if (board[m][z] == board[m -1][z + 1])
{
return 1;
}
else
{
return 0;
}
}
}
}
else
{
return 0;
}
}
else
{
return 0;
}
}
//判断从该子往右下数共n个数是否一样
int pan_duan_youxia(char board[ROW][LIN], int i, int j, int n)
{
//首先判断此位置是是否为空,为空则不需要判断
if (board[i][j] != ' ')
{
//判断从改子往左下是否连成三子
//先判断往左下数是都由三个格子,没有则不需要判断
if (ROW - 1 - i >= n - 1 && LIN - 1 - j >= n - 1)
{
//三子需要判断三次,n子需要判断n-1次,当前位置与下一个位置进行比较
int m = i;
int z = j;//用来控制判断次数
for (m = i, z = j; m <= i + n - 2, z <= j + n - 2; m++, z++)
{
if (m != i + n - 2 && z != j + n - 2)//还未比较到最后一位
{
if (board[m][z] == board[m + 1][z + 1])
{
continue;
}
else
{
return 0;
}
}
if (m == i + n - 2 && z == j + n - 2)//比较到最后一位时
{
if (board[m][z] == board[m + 1][z + 1])
{
return 1;
}
else
{
return 0;
}
}
}
}
else
{
return 0;
}
}
else
{
return 0;
}
}
//判断是否连成n子
int pan_duan(char board[ROW][LIN],int row,int lin)
{
int n = 5;//3表明判断成三子
int i = 0;
int j = 0;
int shang = 0;
int xia = 0;
int zuo = 0;
int you = 0;
int zuoshang = 0;
int youshang = 0;
int zuoxia = 0;
int youxia = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < lin; j++)
{
//判断从改子往上数共n个数是否一样
shang = pan_duan_shang(board, i, j,n);
if (shang == 1)
{
return 1;
}
//判断从改子往下数共n个数是否一样
xia = pan_duan_xia(board, i, j, n);
if (xia == 1)
{
return 1;
}
//判断从改子往上数共n个数是否一样
zuo = pan_duan_zuo(board, i, j, n);
if (zuo == 1)
{
return 1;
}
//判断从改子往上数共n个数是否一样
you = pan_duan_you(board, i, j, n);
if (you == 1)
{
return 1;
}
//判断从改子往上数共n个数是否一样
zuoshang = pan_duan_zuoshang(board, i, j, n);
if (zuoshang == 1)
{
return 1;
}
//判断从改子往上数共n个数是否一样
zuoxia = pan_duan_zuoxia(board, i, j, n);
if (zuoxia == 1)
{
return 1;
}
//判断从改子往上数共n个数是否一样
youshang = pan_duan_youshang(board, i, j, n);
if (youshang == 1)
{
return 1;
}
//判断从改子往上数共n个数是否一样
youxia = pan_duan_youxia(board, i, j, n);
if (youxia == 1)
{
return 1;
}
}
}
return 0;
}
//判断是否连成n子
//int pan_duan(char board[ROW][LIN], int row, int lin,int* x,int* y)
//{
// int n = 5;//3表明判断成三子
// int i = (*x);
// int j = (*y);
//
// int shang = 0;
// int xia = 0;
// int zuo = 0;
// int you = 0;
// int zuoshang = 0;
// int youshang = 0;
// int zuoxia = 0;
// int youxia = 0;
//
// //判断从改子往上数共n个数是否一样
// shang = pan_duan_shang(board, i, j,n);
// if (shang == 1)
// {
// return 1;
// }
//
// //判断从改子往下数共n个数是否一样
// xia = pan_duan_xia(board, i, j, n);
// if (xia == 1)
// {
// return 1;
// }
//
// //判断从改子往上数共n个数是否一样
// zuo = pan_duan_zuo(board, i, j, n);
// if (zuo == 1)
// {
// return 1;
// }
//
// //判断从改子往上数共n个数是否一样
// you = pan_duan_you(board, i, j, n);
// if (you == 1)
// {
// return 1;
// }
//
// //判断从改子往上数共n个数是否一样
// zuoshang = pan_duan_zuoshang(board, i, j, n);
// if (zuoshang == 1)
// {
// return 1;
// }
//
// //判断从改子往上数共n个数是否一样
// zuoxia = pan_duan_zuoxia(board, i, j, n);
// if (zuoxia == 1)
// {
// return 1;
// }
//
// //判断从改子往上数共n个数是否一样
// youshang = pan_duan_youshang(board, i, j, n);
// if (youshang == 1)
// {
// return 1;
// }
//
// //判断从改子往上数共n个数是否一样
// youxia = pan_duan_youxia(board, i, j, n);
// if (youxia == 1)
// {
// return 1;
// }
// return 0;
//
//}
//int pan_duan(char board[ROW][LIN], int i, int j)
//{
// int n = 3;//3表明判断成三子
// int i = 0;
// int j = 0;
// int shang = 0;
// int xia = 0;
// int zuo = 0;
// int you = 0;
// int zuoshang = 0;
// int youshang = 0;
// int zuoxia = 0;
// int youxia = 0;
// for (i = 0; i < row; i++)
// {
// for (j = 0; j < lin; j++)
// {
// //判断从改子往上数共n个数是否一样
// shang = pan_duan_shang(board, i, j, n);
// if (shang == 1)
// {
// return 1;
// }
//
// //判断从改子往下数共n个数是否一样
// xia = pan_duan_xia(board, i, j, n);
// if (xia == 1)
// {
// return 1;
// }
//
// //判断从改子往上数共n个数是否一样
// zuo = pan_duan_zuo(board, i, j, n);
// if (zuo == 1)
// {
// return 1;
// }
//
// //判断从改子往上数共n个数是否一样
// you = pan_duan_you(board, i, j, n);
// if (you == 1)
// {
// return 1;
// }
//
// //判断从改子往上数共n个数是否一样
// zuoshang = pan_duan_zuoshang(board, i, j, n);
// if (zuoshang == 1)
// {
// return 1;
// }
//
// //判断从改子往上数共n个数是否一样
// zuoxia = pan_duan_zuoxia(board, i, j, n);
// if (zuoxia == 1)
// {
// return 1;
// }
//
// //判断从改子往上数共n个数是否一样
// youshang = pan_duan_youshang(board, i, j, n);
// if (youshang == 1)
// {
// return 1;
// }
//
// //判断从改子往上数共n个数是否一样
// youxia = pan_duan_youxia(board, i, j, n);
// if (youxia == 1)
// {
// return 1;
// }
//
// }
// }
// return 0;
//}
//比较两个字符是否相等
int bi_jiao(char a, char b)
{
if (a == b)
{
return 1;
}
else
{
return 0;
}
}
//玩家下棋
void player(char board[ROW][LIN])
{
int x = 0;
int y = 0;
char signal = 0;
do
{
printf("请输入您要下的位置与棋子符号:\n");
printf("若您想下在5行5列处,棋子符号为*,请输入:5 5 *,中间用空格隔开,输入结束后按回车\n");
scanf("%d %d %c", &x, &y, &signal);
if (board[x - 1][y - 1] != ' ')
{
printf("对不起,您输入的位置已经下过了,请重新输入\n");
}
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = signal;
break;
}
} while (1);
}
//电脑下棋
运行:test.c
#define _CRT_SECURE_NO_WARNINGS
//用来测试游戏的逻辑
#include<stdio.h>
#include"game.h"
int main()
{
int input = 0;
ceshi();
//首先打印菜单,选择游戏模式
do
{
meau();
printf("请输入您要选择的游戏模式-->\n");
scanf("%d", &input);
switch (input)
{
case 1:
printf("请注意游戏即将开始,请输入你要下棋的位置与棋子符号\n");
printf("例如您想下载棋盘的5行5列处,棋子符号为 *\n");
printf("此时请输入:\n");
printf("5 5 *\n");
printf("注意用空格隔开,输入结束后按回车!!!\n");
printf("祝您游戏愉快!!!\n");
game();//游戏逻辑的实现
printf("\n=========================================================\n\n");
break;
case 0:
printf("成功退出游戏\n");
printf("\n=========================================================\n\n");
break;
default:
printf("对不起,您选择的模式错误\n");
printf("\n=========================================================\n\n");
break;
}
} while (input);
return 0;
}