C语言实现三子棋游戏 代码+思路+电脑下棋算法
重点:
当检测到电脑已经两子连续时,将会尝试获得胜利。
在检测到玩家即将胜利(连城两子)时,进行拦截
尝试胜利的优先级高于拦截,意味着如果玩家不能再下一步截断电脑连续的两子,下一回合中将会被击败。
源码:
GitHub链接
https://github.com/SWQXDBA/Sanzi-chess/tree/main/sanziqi

其中

void clear(char board[H_max][L_max], int H, int L);//清空棋盘
void printboard(char board[H_max][L_max], int H, int L);//打印棋盘
void printmenu();//打印游戏菜单选项
void computerplay(char board[H_max][L_max], int H, int L);//电脑下棋
void search(char board[H_max][L_max], int X, int Y, int H, int L, char ch, char ch2);//核心算法:用于寻找电脑下棋的位置,会把找到的位置传给X和Y;
void putBoard(char board[H_max][L_max],char ch, int x, int y);/把棋子放置到某个位置,ch表示棋子,其中玩家为‘*’,电脑为‘#’;
char isWin(char board[H_max][L_max], int H, int L);判断是否胜利
int isFulled(char board[H_max]判断是否填满棋盘(平局)

main函数部分:

注意,这里使用了一个int类型来接收getchar()的字符,因为scanf("%d".&option),如果玩家输入了一个非字符的东西会出错
如果像上图这样写,则

但是如果写成scanf并且尝试接收一个int,如


出现死循环
此问题也可以通过加入getchar()来解决,比如

///分割线
关于play()函数
void play()
{
int x, y;
char Board[H_max][L_max];
clear(Board, H_max, L_max);
printboard(Board, H_max, L_max);
while (1)
{
printf(“请输入要下的坐标>”);
scanf("%d%d", &x, &y);
if (x > H_max || y > L_max)
{
printf(“坐标输入错误!请输入x(1,%d) y(1,%d)\n”, H_max, L_max);
continue;
}
if (Board[x - 1][y - 1] != ’ ')
{
printf(“坐标输入错误!请选择没下过的位置\n”);
continue;
}
putBoard(Board, ‘’,x-1 ,y-1 );
printboard(Board, H_max, L_max);
if (isWin(Board, H_max, L_max) == '
’)
{
printf(“恭喜获胜!\n”);
return;
}
if (isFulled(Board, H_max, L_max))
{
printf(“平局!\n”);
return;
}
computerplay(Board, H_max, L_max);
printboard(Board, H_max, L_max);
if (isWin(Board, H_max, L_max) == ‘#’)
{
printf(“您输了!\n”);
return;
}
if (isFulled(Board, H_max, L_max))
{
printf(“平局!\n”);
return;
}
}
}
此处不加赘述,即执行玩家和电脑轮流下棋的过程,其中穿插胜负,平局的判断,每下一个子,打印一次。
清空(初始化)棋盘
void clear(char board[H_max][L_max], int H, int L)
{
for (int i = 0; i < H;i++)
for (int j = 0; j < L; j++)
board[i][j] = ’ ';
}
打印棋盘:
void printboard(char board[H_max][L_max], int H, int L)
{
for (int j = 0; j < L; j++)
{
printf(" —");

}
printf("\n");for (int i = 0; i <H; i++){printf("|");for (int j = 0; j < L; j++){printf(" %c ", board[i][j]);printf("|");}printf("\n");if (i<H)for (int j = 0; j < L; j++){printf(" ---");}printf("\n");
}

}
打印效果

电脑下棋:
void computerplay(char board[H_max][L_max], int H, int L)
{
int x, y;
search(board, &x, &y, H,L, ‘#’,’*’);
printf(“电脑下!%d,%d\n”,x+1,y+1);
putBoard(board, ‘#’, x, y);

}
此时电脑会调用search函数,以获得下棋的位置,然后使用putBoard函数落子;
search函数保证了返回的x y坐标是无子的。

之后是最关键的部分,判断电脑应该下哪里
void search(char board[H_max][L_max], int *X, int *Y, int H, int L, char ch,char ch2)
{
//尝试获胜
//核心思路:在一行/一列/对角线之中进行搜索,如果找到了一个’ ',则记录它的位置,以供下棋。用count记录找到的相同的棋子,如果找到两个相同的,则把可供落子的loc坐标通过指针返回。
for (int i = 0; i < H; i++)
{
int count = 0;
int loc = -1;
for (int j = 0; j < L; j++)
{
if (board[i][j] == ch)
count++;
else if(board[j][i] == ’ ')
loc = j;
}
if (count == 2 && board[i][loc] == ’ '&&loc >= 0)
{
puts(“尝试行获胜”);
*X = i;
*Y = loc;
return;
}
}
for (int i = 0; i < H; i++)
{
int count = 0;
int loc = -1;

 for (int j = 0; j < L; j++){if (board[j][i] == ch)count++;else if (board[j][i]==' ')loc = j;}if (count == 2 && board[loc][i] == ' '&&loc >= 0){puts("尝试列获胜");*X = loc;*Y = i;return;}
}//判断对角线int loc=-1;int findcount = 0;for (int i = 0; i < H; i++){if (board[i][i] == ch){findcount++;}else if (board[i][i] == ' ')loc = i;}if (findcount == 2&&loc!=-1){puts("尝试对角线获胜");*X = loc;*Y = loc;return;}loc = -1;findcount = 0;for (int i = 0; i < H; i++){if (board[i][H-i-1] == ch){findcount++;}else if (board[i][H - i - 1] == ' ')loc = i;}if (findcount == 2 && loc != -1){puts("尝试对角线获胜");*X = loc;*Y = H - loc - 1;return;}
//尝试阻止玩家获胜
for (int i = 0; i < H; i++)
{int count = 0;int loc = -1;for (int j = 0; j < L; j++){if (board[i][j] == ch2)count++;elseloc = j;}if (count == 2 && board[i][loc] == ' '&&loc >= 0){puts("尝试阻止行");*X = i;*Y = loc;return;}
}
for (int i = 0; i < H; i++)
{int count = 0;int loc = -1;for (int j = 0; j < L; j++){if (board[j][i] == ch2)count++;elseloc = j;}if (count == 2 && board[loc][i] == ' '&&loc >= 0){puts("尝试阻止列");*X = loc;*Y = i;return;}
}
//判断对角线loc = -1;findcount = 0;
for (int i = 0; i < H; i++)
{if (board[i][i] == ch2){findcount++;}else if (board[i][i] == ' ')loc = i;
}
if (findcount == 2 && loc != -1)
{puts("尝试阻止对角线");*X = loc;*Y = loc;return;
}
loc = -1;
findcount = 0;
for (int i = 0; i < H; i++)
{if (board[i][H - i - 1] == ch2){findcount++;}else if (board[i][H - i - 1] == ' ')loc = i;
}
if (findcount == 2 && loc != -1)
{puts("尝试阻止对角线");*X = loc;*Y = H - loc - 1;return;
}//随机下
printf("电脑随便走\n");
srand((unsigned int)time(NULL));
while (1)
{int x = rand() % L_max;int y = rand() % H_max;if (board[x][y] == ' '){*X = x;*Y = y;return;}
}

}
isWin函数,返回一个char,isWin函数判断每行,每列,两个对角线中三个元素是否相等,如果相等则返回这个元素,如果没有找到,则返回‘ ’
char isWin(char board[H_max][L_max], int H, int L)
{
for (int i = 0; i < H; i++)//行列
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2])
return board[i][0];
if (board[0][i] == board[1][i] && board[1][i] == board[2][i])
return board[0][i];
}
if (board[0][0] == board[1][1] && board[2][2] == board[1][1])//对角线
return board[0][0];
if (board[0][2] == board[1][1] && board[0][2] == board[2][0])//对角线
return board[0][0];
return ’ ';
}

isFull函数判断棋盘是否没有’ '元素,如果没有则返回1,代表棋盘已满,在play()函数中用于判断是否平局
int isFulled(char board[H_max][L_max], int H, int L)
{
int i, j;
for (i = 0; i < H; i++)
for (j = 0; j < L; j++)
if (board[i][j] == ’ ')
return 0;
return 1;

}
运行结果展示:

C语言实现三子棋游戏 代码+思路+电脑下棋算法相关推荐

  1. 编写一个三子棋游戏,和弱智电脑下棋

    头程序块 #define ROW 3//设定横坐标极值 #define COL 3//设定纵坐标极值#include<stdio.h> #include<stdlib.h> # ...

  2. 用C语言实现三子棋游戏(附上思路+项目展示+源代码)

    文章目录 前言 一.三子棋游戏整体实现思路 二.实现步骤 分模板实现 (以及具体应用实列) 1.test.c 源文件讲解: 2. game.c 源文件讲解: 3.game.h 源文件讲解 三 game ...

  3. c语言程序下三子棋,C语言实现三子棋游戏(初级版)

    本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下 game.h #include #include #include #define ROW 3 #define COL 3 ...

  4. 【C语言】三子棋游戏的实现(玩家VS玩家 or 玩家VS电脑)

    目    录 一.三子棋游戏介绍 二.游戏功能函数分析 1 菜单显示函数 2 菜单选择函数 3 选择确认函数 4 显示当前棋盘状态函数 5 棋盘初始化函数 6 玩家下棋函数 7 电脑下棋函数 8 棋局 ...

  5. 初识C语言之三子棋游戏

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 三子棋游戏的主要介绍 一.编写逻辑思维 二.游戏的初步实现 1.游戏的相关代码 2.游戏的试运行结果 总结 三子棋游戏的初步 ...

  6. C语言实现三子棋游戏—可扩展到任意N子棋

    C语言实现三子棋 游戏介绍 游戏编程思路 游戏代码详解 主函数 游戏菜单函数 游戏逻辑函数 初始化棋盘 打印棋盘 玩家下棋 电脑下棋 判断输赢 完整代码 test.c game_chess.c gam ...

  7. 使用c语言实现三子棋游戏

    下面简介如何使用c语言的基础语法实现三子游戏的底层逻辑: 首先是菜单模块 使用switch语句进入游戏模块 前置交互完成,开始进入游戏函数. 第一部分棋盘创建,使用二维数组实现. a.初始化棋盘 为什 ...

  8. C语言实现三子棋游戏(规范化)

    `在复习了数组之后,对有些经典的数组题进行了,其中一道就是三子棋游戏这一功能的实现.下面附上我的个人理解和代码,希望各位大佬不吝指教. 首先有一个万能游戏模板,在c语言中有好多实现游戏的代码,我总结了 ...

  9. C语言程序设计——三子棋游戏

    三子棋游戏又叫井字棋游戏,是很多人小时候都玩过的一种小游戏,游戏的玩法是两名玩家在三行三列的九个格子子里依次下棋,若一方的棋子有三个在横.竖,斜线三种中的任何一种连成一条线就获得游戏胜利.接下来就让我 ...

最新文章

  1. gitlab 安装gitlabrunner 无法连接tiller_谈一谈GitLab Runner是个什么东东?
  2. 一些关于图论和二叉树的
  3. ListView问题:Your content must have a ListView wh...
  4. C++: find()函数的注意事项
  5. Exception的妙用
  6. 信号与槽QVariant传递结构体指针
  7. POJ 2187 凸包旋转卡壳
  8. React 中setState更新state何时同步何时异步?
  9. 零基础学pythonpdf老男孩_零基础可以选择学习Python吗?老男孩Python脱产班
  10. 26.1-2 知识产权与标准规范(标准规范)
  11. DateFormat的使用
  12. python下载kivy_下载、目录-『Python Kivy』Kivy and PyDev on Eclipse -by小雨
  13. CSS3 1 CSS3 响应式布局 1.1 媒体查询
  14. 路由器自动连接服务器无响应,路由器服务器无响应怎么办
  15. Linux-Kali——安装软件_添加桌面快捷方式启动器_添加到应用程序菜单_Kali安装Typora
  16. 《蜥蜴脑法则》读后感
  17. 学历学籍系统-Web服务开发实验(REST API)
  18. 如何用python请求接口
  19. 政采法规 | 中小企业划型标准规定
  20. python批量处理PDF文档,输出自定义关键词的出现次数

热门文章

  1. 命令行提示: DNS 服务器对区域没有权威
  2. max蒙皮动画+动作
  3. EAGLE 基本介绍
  4. electron 实现文件下载管理器
  5. 【曾贤志】Power Map For Excel地图图表视频教程-曾贤志-专题视频课程
  6. 程序员用搞笑个性签名
  7. 高德拉特:约束理论(TOC)和最优生产技术(OPT)相关
  8. 线性规划简单理解(LP问题)
  9. 如何使用c#对用友U8API的插件进行注册使用开发
  10. 贴片按键开关_【干货】SMT贴片加工之贴片点数计算标准(2019精华版),你值得拥有!...