五子棋的分析解题思路

引言

本系列是我自己关于遇到过的编程题目进行的分析思路总结,希望能够帮助到需要帮助的那些需要帮助的编程小白,同时也欢迎各位前辈予以指正和批评指导,谢谢。

题目:

五子棋是全国智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类 游戏。通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上, 先形成五子连线者获胜。

个人初步分析

  1. 构建一个16*16的二维数组 一维从0到15排列,二维数组的第一行和第一列从0到15排列,其余列用0排列
  2. 采用循环来进行下棋
  3. 定义两个用户输入变量 第一个人输入一个两个从1到15的下标值,来改变指定数组下标数据的值
  4. 第二个人同第一个人一样
  5. 胜负判定同行或同列或斜线连续五个数据经过改变数值且相同(5个1或5个2)时,判胜利
  6. 胜负采用条件结构

个人解题思路

第一步

构建一个15X15的棋盘(实际数组长度应为16),,并打印初始棋盘

int[][] checkerboard = new int[16][16];for(int i=0;i<checkerboard.length;i++) {for(int j=0;j<checkerboard.length;j++) {checkerboard[i][j] = 0;}}for(int i=0;i<checkerboard.length;i++) {checkerboard[i][0] = i;checkerboard[0][i] = i;}for(int i=0;i<checkerboard.length;i++) {for(int j=0;j<checkerboard.length;j++) {if(i<10 && i>0 ) {System.out.print(checkerboard[i][j]+"  ");}else if(i<16 && i>=10 && j==0) {System.out.print(checkerboard[i][j]+" ");}else if(i<16 && i>=10 && j>0){System.out.print(checkerboard[i][j]+"  ");}else if(i==0 && j>=10) {System.out.print(checkerboard[i][j]+" ");}else if(i==0 && j<10) {System.out.print(checkerboard[i][j]+"  ");}}System.out.print("\n");}

第二步

定义各种需要的变量

 boolean bool = true;int time = 0 ;// 定义回合数int zero = 225;int countPlay1 = 0;int countPlay2 = 0;// 玩家的落子数Scanner inputLineplay11 = new Scanner(System.in);Scanner inputRowplay12 = new Scanner(System.in);Scanner inputLineplay21 = new Scanner(System.in);Scanner inputRowplay22 = new Scanner(System.in);// 定义用户输入变量

第三步

使用while循环结构,开始下棋,一开始由玩家1(player1)开始下子,下子时要判定落子位置是否已经有棋子,成功落子后打印棋盘

while(bool) {time++;System.out.println("第"+time+"回合");System.out.println("请1号玩家下子");while(bool){int linePlay1 = inputLineplay11.nextInt();int rowPlay1 = inputRowplay12.nextInt();if(checkerboard[linePlay1][rowPlay1] != 0) {System.out.println("输入位置已有棋子,请重新落子");inputLineplay11 = new Scanner(System.in);inputRowplay12 = new Scanner(System.in);}else {checkerboard[linePlay1][rowPlay1] = 1;bool = false;}}bool = true;// 输入位置已有棋子,重新输入zero--;// 第一个人下子for(int i=0;i<checkerboard.length;i++) {for(int j=0;j<checkerboard.length;j++) {if(i<10 && i>0 ) {System.out.print(checkerboard[i][j]+"  ");}else if(i<16 && i>=10 && j==0) {System.out.print(checkerboard[i][j]+" ");}else if(i<16 && i>=10 && j>0){System.out.print(checkerboard[i][j]+"  ");}else if(i==0 && j>=10) {System.out.print(checkerboard[i][j]+" ");}else if(i==0 && j<10) {System.out.print(checkerboard[i][j]+"  ");}}System.out.print("\n");}countPlay1++;// 打印1号玩家落子后的棋盘

第四步

判定1号胜负,从1号玩家第5颗棋子落子后就应该开始判定胜负,且这个棋盘总可落子数为15X15=225,即最后一颗子仍由1号玩家下子,所以同时也应该判断是否平局。

 if(countPlay1>4) {for(int i=1;i<checkerboard.length-4;i++) {for(int j=1;j<checkerboard.length-4;j++) {if(checkerboard[j][i] == 1 && checkerboard[j][i] == checkerboard[j][i+1] && checkerboard[j][i] == checkerboard[j][i+2] && checkerboard[j][i] == checkerboard[j][i+3] && checkerboard[j][i] == checkerboard[j][i+4]){System.out.print("1号玩家已达成五子相连,胜利!");bool = false;break;}else if(checkerboard[j][i] == 1 && checkerboard[j][i] == checkerboard[j+1][i] && checkerboard[j][i] == checkerboard[j+2][i] && checkerboard[j][i] == checkerboard[j+3][i] && checkerboard[j][i] == checkerboard[j+4][i]){System.out.print("1号玩家已达成五子相连,胜利!");bool = false;break;}else if(checkerboard[j][i] == 1 && checkerboard[j][i] == checkerboard[j+1][i+1] && checkerboard[j][i] == checkerboard[j+2][i+2] && checkerboard[j][i] == checkerboard[j+3][i+3] && checkerboard[j][i] == checkerboard[j+4][i+4]){System.out.print("1号玩家已达成五子相连,胜利!");bool = false;break;}else if(checkerboard[j][i] == 1 && checkerboard[j][i] == checkerboard[j+1][i-1] && checkerboard[j][i] == checkerboard[j+2][i-2] && checkerboard[j][i] == checkerboard[j+3][i-3] && checkerboard[j][i] == checkerboard[j+4][i-4]){System.out.print("1号玩家已达成五子相连,胜利!");bool = false;break;}}}  // 1号玩家的胜负判定}else {// 若1号玩家没胜出,则游戏继续if(zero == 0){System.out.print("平局!游戏结束!");bool = false;break; }

第五步

2号玩家下子方式同1号一样,成功落子后打印棋盘

System.out.println("请2号玩家下子");while(bool){int linePlay2 = inputLineplay21.nextInt();int rowPlay2 = inputRowplay22.nextInt();if(checkerboard[linePlay2][rowPlay2] != 0) {System.out.println("输入位置已有棋子,请重新落子");inputLineplay11 = new Scanner(System.in);inputRowplay12 = new Scanner(System.in);}else {checkerboard[linePlay2][rowPlay2] = 2;bool = false;}}// 输入位置已有棋子,重新输入bool = true;zero--;// 第二个人下子for(int i=0;i<checkerboard.length;i++) {for(int j=0;j<checkerboard.length;j++) {if(i<10 && i>0 ) {System.out.print(checkerboard[i][j]+"  ");}else if(i<16 && i>=10 && j==0) {System.out.print(checkerboard[i][j]+" ");}else if(i<16 && i>=10 && j>0){System.out.print(checkerboard[i][j]+"  ");}else if(i==0 && j>=10) {System.out.print(checkerboard[i][j]+" ");}else if(i==0 && j<10) {System.out.print(checkerboard[i][j]+"  ");}}System.out.print("\n");}countPlay2++;// 打印2号玩家落子后的棋盘

第六步

2号玩家判断胜负,同1号玩家一样

if(countPlay2>4) {for(int i=1;i<checkerboard.length-4;i++) {for(int j=1;j<checkerboard.length-4;j++) {if(checkerboard[j][i] == 2 && checkerboard[j][i] == checkerboard[j][i+1] && checkerboard[j][i] == checkerboard[j][i+2] && checkerboard[j][i] == checkerboard[j][i+3] && checkerboard[j][i] == checkerboard[j][i+4]){System.out.print("2号玩家已达成五子相连,胜利!");bool = false;break;}else if(checkerboard[j][i] == 2 && checkerboard[j][i] == checkerboard[j+1][i] && checkerboard[j][i] == checkerboard[j+2][i] && checkerboard[j][i] == checkerboard[j+3][i] && checkerboard[j][i] == checkerboard[j+4][i]){System.out.print("2号玩家已达成五子相连,胜利!");bool = false;break;}else if(checkerboard[j][i] == 2 && checkerboard[j][i] == checkerboard[j+1][i+1] && checkerboard[j][i] == checkerboard[j+2][i+2] && checkerboard[j][i] == checkerboard[j+3][i+3] && checkerboard[j][i] == checkerboard[j+4][i+4]){System.out.print("2号玩家已达成五子相连,胜利!");bool = false;break;}else if(checkerboard[j][i] == 2 && checkerboard[j][i] == checkerboard[j+1][i-1] && checkerboard[j][i] == checkerboard[j+2][i-2] && checkerboard[j][i] == checkerboard[j+3][i-3] && checkerboard[j][i] == checkerboard[j+4][i-4]){System.out.print("2号玩家已达成五子相连,胜利!");bool = false;break;}}}  }// 2号玩家的胜负判定

第七步

每一次循环结束,末尾应该重置用户输入值内容

 inputLineplay11 = new Scanner(System.in);inputRowplay12 = new Scanner(System.in);inputLineplay21 = new Scanner(System.in);inputRowplay22 = new Scanner(System.in);

实际运行效果图:

这里因为运行图过长,因此只放上结果图

(个人解题思路系列)五子棋相关推荐

  1. (个人解题思路系列)猜拳游戏

    猜拳游戏的分析解题思路 前言 本系列是我自己关于遇到过的编程题目进行的分析思路总结,希望能够帮助到需要帮助的那些需要帮助的编程小白,同时也欢迎各位前辈予以指正和批评指导,谢谢. 题目: 通过控制台方式 ...

  2. [网络安全自学篇] 八十一.WHUCTF之WEB类解题思路WP(文件上传漏洞、冰蝎蚁剑、反序列化phar)

    这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您喜欢,一起进步.前文分享了WHUCTF部分题目,包括代码审计.文件包含.过滤绕过.SQL注入.这篇文 ...

  3. 上周并发题的解题思路以及介绍Go语言调度器

    上周的文章<Go并发编程里的数据竞争以及解决之道>最后留下了一个用并发解决的思考题,期间有几位同学留言说了自己的实现思路,也有两位直接私信发代码让我看的,非常感谢几位的积极参与.今天的文章 ...

  4. 高分选手讲解:如何突破思维圈限,从NLP角度挖掘新的解题思路

    稳居排行榜前三,成绩高达1.453292的他,究竟是位怎样的神级选手?今天,我们就邀请到这位实力强劲的神秘大咖,为大家揭晓他的上分思路. 实力选手在线指导,火速报名与他PK一下吧!5月31日算法大赛报 ...

  5. C#的解题思路(1):不重复随机数的产生问题

    说明:写作本文的出发点是最近和一个有3年开发经验的.NET开发人员聊天,他跟我说经常没有思路,在实际开发中我也见过一个具有4.5年开发经验的开发人员几乎没有灵活变通的能力,所以打算写一系列文章,在这个 ...

  6. Python百日百行代码挑战-day8,day9,day10,游戏实战系列-五子棋

    Python百日百行代码挑战-day8,day9,day10,游戏实战系列-五子棋 写在前面 需要用到的工具包和参考 游戏设定 初始化 切换下棋方 判断五子连珠(核心) 鼠标点击流程事件 成品展示 打 ...

  7. CTF学习-密码学解题思路

    CTF学习-密码学解题思路 密码学持续更新 密码学概述 密码学的发展 第一个阶段是从古代到19世纪末-古典密码 (classical cryptography) 第二个阶段从20世纪初到1949年-近 ...

  8. 【剑指offer】解题思路汇总

    文章目录 总结备忘 第二章 面试需要的基础知识 2.3 数据结构 面试题3:数组中重复的数字 题目一:找出数组中重复的数字 题目二:不修改数组找出重复的数字 面试题4:二维数组中的查找 面试题5:替换 ...

  9. CTF学习-逆向解题思路

    CTF学习-逆向解题思路 持续更新 一.通用过程 通过file命令查看文件类型,判断是ELF还是PE,32位还是64位. 通过strings并重定向标准输出,然后搜索大括号 { ,看看是否能直接得到f ...

最新文章

  1. godaddy 管理mysql_在godaddy上使用MySQL和Entity Framework的安全例...
  2. 阿里云免费申请免费SSL证书
  3. Mongodb 笔记04 特殊索引和集合、聚合、应用程序设计
  4. mysql主从安装配置_mysql主从安装配置
  5. Ubuntu中Lamp的一些配置
  6. 双目估计方法_双目深度估计中的自监督学习概览
  7. 【数学建模】2017年B题
  8. mysql数据加表头导出_mysql导出数据到表格讲解大全(导出数据带表头,导出数据中文乱码问题解决)...
  9. S2. 口腔CT工作原理-数据采集
  10. 阿里首席架构师讲解“双十一”亿级流量高并发的系统架构搭建方法
  11. ESAYUI filebox 隐藏
  12. 哈曼收购混合现实领域领先公司Apostera
  13. 腾讯 AI Lab 2021 年度回顾
  14. MATLAB人工神经网络的手写数字识别系统
  15. 数值运算pythonmopn_数的解释|数的意思|汉典“数”字的基本解释
  16. 使用PicGo+阿里云OSS实现md文档图片上传
  17. 数据结构题集(c语言版)第1章:绪论
  18. Java IDE推荐
  19. MT8788 android 9.0 gsensor导致预览与拍出来的照片方向不一致
  20. 搜狗浏览器收藏夹转换IE PHP SimpleXmlIterator

热门文章

  1. 洛谷P2678 Java解法
  2. termux—手机远程连接服务器教程
  3. 2007第一天上班想哭
  4. 时间在线验证 java代码_timetest.java 源代码在线查看 - Java获取各种常用时间方法 资源下载 虫虫电子下载站...
  5. Pandas合并之Concat合并
  6. 考拉海购成重构互联网版图的最大“变量”
  7. 【凝水成冰】记学生事务系统的结构化
  8. 计算机切屏的三种快捷键,小技巧:笔记本切换屏幕快捷键_计算机的基本知识_IT /计算机_信息...
  9. css实现图片翘边阴影
  10. 在线网页如何免费excel转pdf