***8.20(游戏:四子连)两人玩游戏,轮流将有颜色的棋子放在一个六行七列的垂直悬挂网格中。谁先实现一行、一列或者一对角线上有4个相同颜色的棋子

  • 题目
    • 题目描述与运行示例
    • 破题
  • 代码

题目

题目描述与运行示例

***8.20(游戏:四子连)两人玩游戏,轮流将有颜色的棋子放在一个六行七列的垂直悬挂网格中。谁先实现一行、一列或者一对角线上有4个相同颜色的棋子。
程序提示两个玩家交替下红子Red或黄子Yellow。R表示红子、Y表示黄子。当放下一子时,程序在控制台重新显示这个棋盘,然后确定游戏状态(赢、平局还是继续)
下面是一个运行示例:

| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
Drop a red disk at column (0-6): 0
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
|R| | | | | | |
Drop a yellow disk at column (0-6): 3
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
|R| | |Y| | | |
Drop a red disk at column (0-6): 2
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
|R| |R|Y| | | |
Drop a yellow disk at column (0-6): 3
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | |Y| | | |
|R| |R|Y| | | |
Drop a red disk at column (0-6): 3
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | |R| | | |
| | | |Y| | | |
|R| |R|Y| | | |
Drop a yellow disk at column (0-6): 4
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | |R| | | |
| | | |Y| | | |
|R| |R|Y|Y| | |
Drop a red disk at column (0-6): 5
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | |R| | | |
| | | |Y| | | |
|R| |R|Y|Y|R| |
Drop a yellow disk at column (0-6): 2
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | |R| | | |
| | |Y|Y| | | |
|R| |R|Y|Y|R| |
Drop a red disk at column (0-6): 4
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | |R| | | |
| | |Y|Y|R| | |
|R| |R|Y|Y|R| |
Drop a yellow disk at column (0-6): 1
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | |R| | | |
| | |Y|Y|R| | |
|R|Y|R|Y|Y|R| |
Drop a red disk at column (0-6): 1
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | |R| | | |
| |R|Y|Y|R| | |
|R|Y|R|Y|Y|R| |
Drop a yellow disk at column (0-6): 1
| | | | | | | |
| | | | | | | |
| | | | | | | |
| |Y| |R| | | |
| |R|Y|Y|R| | |
|R|Y|R|Y|Y|R| |
Drop a red disk at column (0-6): 0
| | | | | | | |
| | | | | | | |
| | | | | | | |
| |Y| |R| | | |
|R|R|Y|Y|R| | |
|R|Y|R|Y|Y|R| |
Drop a yellow disk at column (0-6): 0
| | | | | | | |
| | | | | | | |
| | | | | | | |
|Y|Y| |R| | | |
|R|R|Y|Y|R| | |
|R|Y|R|Y|Y|R| |
Drop a red disk at column (0-6): 1
| | | | | | | |
| | | | | | | |
| |R| | | | | |
|Y|Y| |R| | | |
|R|R|Y|Y|R| | |
|R|Y|R|Y|Y|R| |
Drop a yellow disk at column (0-6): 0
| | | | | | | |
| | | | | | | |
|Y|R| | | | | |
|Y|Y| |R| | | |
|R|R|Y|Y|R| | |
|R|Y|R|Y|Y|R| |
The yellow player won

破题

  1. 主方法:先声明一个数组array,长度为6*7,类型为int(0表没有子,1表Y黄子,2表R红子)
  2. 主方法:创建一个boolean对象bool,初始值为true
  3. 主方法:创建一个int型对象temp(用于临时存储变量)1个int型对象result,存储结果
  4. 主方法:创建一个计数变量count,int类型(初始值为0)
  5. 主方法:接收用户输入语句
  6. 主方法:循环体:调用打印棋盘状态方法,传入数组array
  7. 主方法:使用循环运行这个游戏,继续运行条件为bool
  8. 主方法:循环体:计数变量count+1
  9. 主方法:循环体:接收用户的输入,使用temp接收
  10. 主方法:循环体:调用棋盘状态改变方法,传入array、temp与count(对棋盘状态进行改变),使用array接收
  11. 主方法:循环体:再调用打印棋盘状态的方法,传入数组array
  12. 主方法:循环体:调用结果判断方法,传入数组array,result接收;返回值为1则将bool改为false并输出黄色玩家赢,返回值2将bool改为false并输出红色玩家赢,返回值为0则继续
  13. 打印棋盘状态方法:传入数组array,无返回值
  14. 打印棋盘状态方法:对数组array进行遍历,0则输出|+" “,1则输出| + “Y”,2则输出| + " R”,每行结尾打印一个|并换行
  15. 棋盘状态改变方法:传入int型二维数组array、表示新元素所在列的temp和计数变量count,返回int型二维数组
  16. 棋盘状态改变方法:对temp列从下到上遍历,找到元素值为0的地方并替换为(count % 2 + 1)
  17. 棋盘状态改变方法:返回新数组
  18. 结果判断方法:接收二维数组,返回int型值
  19. 结果判断方法:对数组进行行遍历、列遍历、对角线遍历,当有连续四个值相同且均为1或2时,如果值均为1则返回1、值均为2则返回2
  20. 结果判断方法:如果上面情况都没有执行到返回0

代码

import java.util.Scanner;public class Test8_20 {public static void main(String[] args) {//1. 主方法:先声明一个数组array,长度为6*7,类型为int(0表没有子,1表Y黄子,2表R红子)int[][] array = new int[6][7];//2. 主方法:创建一个boolean对象bool,初始值为trueboolean bool = true;//3. 主方法:创建一个int型对象temp(用于临时存储变量)1个int型对象result,存储结果int temp = 0, result = 0;//4. 主方法:创建一个计数变量count,int类型(初始值为0)int count = 0;//5. 主方法:接收用户输入语句Scanner input = new Scanner(System.in);//6. 主方法:循环体:调用打印棋盘状态方法,传入数组arrayprint_array(array);//7. 主方法:使用循环运行这个游戏,继续运行条件为boolwhile (bool) {//8. 主方法:循环体:计数变量count+1++count;//9. 主方法:循环体:接收用户的输入,使用temp接收if (count % 2 == 1)System.out.print("Drop a red disk at column (0-6): ");elseSystem.out.print("Drop a yellow disk at column (0-6): ");//10. 主方法:循环体:调用棋盘状态改变方法,传入array、temp与count(对棋盘状态进行改变),使用array接收temp = input.nextInt();array = change_array(array, temp, count);//11. 主方法:循环体:再调用打印棋盘状态的方法,传入数组arrayprint_array(array);//12. 主方法:循环体:调用结果判断方法,传入数组array,result接收// 返回值为1则将bool改为false并输出黄色玩家赢,返回值2将bool改为false并输出红色玩家赢,返回值为0则继续result = judge_array(array);if (result == 1){System.out.print("The yellow player won");bool = false;} else if (result == 2) {System.out.print("The red player won");bool = false;}}}//13. 打印棋盘状态方法:传入数组array,无返回值public static void print_array(int[][] array){//14. 打印棋盘状态方法:对数组array进行遍历// 0则输出|+" ",1则输出| + "Y",2则输出| + " R",每行结尾打印一个|并换行for (int i = 0 ; i <array.length ; i++){for (int j = 0 ; j < array[i].length ;j++){if ( array[i][j] == 0 ){System.out.print("| ");} else if ( array[i][j] == 1 ){System.out.print("|Y");} else {System.out.print("|R");}}System.out.println("|");}}//15. 棋盘状态改变方法:传入int型二维数组array、表示新元素所在列的temp和计数变量count,返回int型二维数组public static int[][] change_array(int[][] array, int temp, int count){//16. 棋盘状态改变方法:对temp列从下到上遍历,找到元素值为0的地方并替换为(count % 2 + 1)for (int i = array.length - 1 ; i >= 0 ; i--){if ( array[i][temp] == 0 ){array[i][temp] = count % 2 + 1;return array;}}//17. 棋盘状态改变方法:返回新数组return array;}//18. 结果判断方法:接收二维数组,返回int型值public static int judge_array(int[][] array){//19. 结果判断方法:对数组进行行遍历、列遍历、对角线遍历// 当有连续四个值相同且均为1或2时,如果值均为1则返回1、值均为2则返回2// 行遍历部分for (int i = 0 ; i < array.length ; i++){for (int j = 0 ; j < array[i].length - 3 ; j++){if ( array[i][j] == array[i][j+1] && array[i][j+1] == array[i][j+2]&& array[i][j+2] == array[i][j+3] ){if (array[i][j] == 1){return 1;}if (array[i][j] == 2){return 2;}}}}// 列遍历for (int j = 0 ; j < array[0].length ; j++){for (int i = 0 ; i < array.length - 3 ; i++){if (array[i][j] == array[i+1][j] && array[i+1][j] == array[i+2][j]&& array[i+2][j] == array[i+3][j]){if (array[i][j] == 1){return 1;}if (array[i][j] == 2){return 2;}}}}// 对角线:左上到右下for (int i = 0 ; i < array.length - 3 ; i++){for (int j = 0 ; j < array[i].length - 3 ;j++){if (array[i][j] == array[i+1][j+1] && array[i+1][j+1] == array[i+2][j+2]&& array[i+2][j+2] == array[i+3][j+3]){if (array[i][j] == 1){return 1;}if (array[i][j] == 2){return 2;}}}}// 对角线:左下到右上for (int i = array.length - 1 ; i >= 3 ; i--){for (int j = 0 ; j < array[i].length - 3 ; j++){if (array[i][j] == array[i-1][j+1] && array[i-1][j+1] == array[i-2][j+2]&& array[i-2][j+2] == array[i-3][j+3]){if (array[i][j] == 1){return 1;}if (array[i][j] == 2){return 2;}}}}//20. 结果判断方法:如果上面情况都没有执行到返回0return 0;}
}

Java黑皮书课后题第8章:***8.20(游戏:四子连)两人玩游戏,轮流将有颜色的棋子放在一个六行七列的垂直悬挂网格中。谁先实现一行、一列或者一对角线上有4个相同颜色的棋子。相关推荐

  1. Java黑皮书课后题第6章:*6.39(几何:点的位置)编程练习题3.32显示如何测试一个点是否在一个有向直线的左侧、右侧或在直线上,编写一个程序,输入三个点p0p1p2,显示p2是否在直线p0p1

    6.39(几何:点的位置)编程练习题3.32显示如何测试一个点是否在一个有向直线的左侧.右侧或在直线上,编写一个程序,输入三个点p0p1p2,显示p2是否在直线p0p1 题目 题目描述 编程练习题3. ...

  2. Java黑皮书课后题第3章:**3.28(几何:两个矩形)编写一个程序,提示用户输入两个矩形中心的x坐标和y坐标以及矩形的宽度和高度,然后判断第二个矩形是在第一个矩形内,还是和第一个矩形重叠

    **3.28(几何:两个矩形)编写一个程序,提示用户输入两个矩形中心的x坐标和y坐标以及矩形的宽度和高度,然后判断第二个矩形是在第一个矩形内,还是和第一个矩形重叠 题目 题目概述 运行示例 破题 代码 ...

  3. Java黑皮书课后题第6章:**6.27(反素数)反素数(反转拼写的素数)是指一个非回文素数,将其反转之后也是一个素数。编写程序,显示前100个反素数,每行显示10个,并且数字间用空格隔开

    6.27(反素数)反素数(反转拼写的素数)是指一个非回文素数,将其反转之后也是一个素数.编写程序,显示前100个反素数,每行显示10个,并且数字间用空格隔开 题目 题目描述 破题 代码 题目 题目描述 ...

  4. Java黑皮书课后题第8章:**8.6(代数:两个矩阵相乘)编写两个矩阵相乘的方法。编写一个测试程序,提示用户输入两个3*3的矩阵,然后显示它们的乘积

    **8.6(代数:两个矩阵相乘)编写两个矩阵相乘的方法.编写一个测试程序,提示用户输入两个3*3的矩阵,然后显示它们的乘积 题目 题目描述与运行示例 破题 代码 题目 题目描述与运行示例 **8.6( ...

  5. Java黑皮书课后题第8章:*8.5(代数:两个矩阵相加)编写两个矩阵相加的方法,编写一个测试程序,提示用户输入两个3*3的矩阵,然后显示它们的和

    *8.5(代数:两个矩阵相加)编写两个矩阵相加的方法,编写一个测试程序,提示用户输入两个3*3的矩阵,然后显示它们的和 题目 题目描述与运行示例 破题 代码 题目 题目描述与运行示例 8.5(代数:两 ...

  6. Java黑皮书课后题第7章:7.10(找出最小元素的下标)使用下面的方法头编写一个方法,求出一个整数数组中的最小元素下标。编写测试程序,提示用户输入10个数字,调用这个方法返回最小值的下标(多个则最小

    7.10(找出最小元素的下标)使用下面的方法头编写一个方法,求出一个整数数组中的最小元素下标.编写测试程序,提示用户输入10个数字,调用这个方法返回最小值的下标(多个则返回最小的下标) 题目 题目描述 ...

  7. Java黑皮书课后题第3章:**3.29(几何:两个圆)编写程序,提示用户输入两个圆的中心坐标和各自的半径值,然后判断圆是在第一个圆内,还是和第一个圆重叠

    **3.29(几何:两个圆)编写程序,提示用户输入两个圆的中心坐标和各自的半径值,然后判断圆是在第一个圆内,还是和第一个圆重叠 题目 题目概述 运行示例 代码 题目 题目概述 **3.29(几何:两个 ...

  8. Java黑皮书课后题第1章:1.13(代数:求解2*2线性方程组)编写程序,求解以下方程组并显示x和y的值 3.4x+50.2y=44.5 2.1x+0.55y=5.9

    Java黑皮书课后题第1章:(代数:求解2*2线性方程组) 题目 题目描述 破题 代码块 方法评析 赘述 修改日志 题目 题目描述 求x和y值: 3.4x+50.2y=44.5 2.1x+0.55y= ...

  9. Java黑皮书课后题第11章:11.2(Person Student Employee Faculty Staff类)设计一个名为Person的类及其两个名为Student和Employee的子类

    Java黑皮书课后题第11章:11.2(Person Student Employee Faculty Staff类) 题目 缺陷 UML图 代码 Test02_MyDate.java:用于参考的My ...

最新文章

  1. 配合使用自制的PE3.0启动盘和Windows部署服务,实现Ghost网克
  2. java 字符串乱码_这份Java面试题含答案解析竟然真的让你不用在面试上“如履薄冰”...
  3. html设置字体整体放大,请教怎么样可以只放大或缩小内容层里的字体呢?我不想让整页都放大缩小。请指教!谢谢!_html/css_WEB-ITnose...
  4. linux端口监听命令
  5. 数学建模大赛赛题解析:Mathorcup高校数学建模挑战赛-环形穿梭车的设计与调度
  6. 网关和路由器的区别是什么?
  7. linux硬盘检测工具,CrazyDiskInfo 硬盘检测工具 Linux版 | 厘米天空
  8. 科技计划项目数据管理过程模型
  9. 编译安装android7.0,android7.0 源码编译问题总结
  10. 哪些趋势正在推动人工智能创新?
  11. 农业智慧物联卡火爆发展中存在的问题
  12. 拓端tecdat|matlab使用Copula仿真优化市场风险
  13. MySQL双主高可用架构之MMM实战
  14. matlab 全局变量(global)数据类型报错问题
  15. 如何修复金蝶专用版服务器,金蝶KIS专业版常见问题及解决方法
  16. word选择性粘贴没有HTML选项,Word选择性粘贴如何使用?Word选择性粘贴的快捷键是什么?...
  17. OCCT 建模,VTK显示
  18. Python笔记。超详细的基本语法
  19. python中localtime和gtime的区别及时区计算的代码
  20. 高德地图开发-- 自定义图标

热门文章

  1. markdown 公式_【建议收藏】数学公式如何用Markdown优雅地写出来
  2. mysql case函数吗_mySQL case函数
  3. 科幻画图片大全浇水机器人_从机器人到智能机器人,谭建荣院士为温肯师生揭秘新科技...
  4. 离散数学 逻辑判断系统 代码_入学派位查询系统现异常,北京西城区:网站代码逻辑错误,不影响派位结果...
  5. P1083 借教室(差分+二分)
  6. 基于Serverless的云原生转型实践
  7. 详解 Flink 容器化环境下的 OOM Killed
  8. 有艺术细胞,就一定能做个好的游戏美术吗?
  9. Unity超级角色控制器研究(四)——地形检测
  10. MySQLWorkbench链接MySQL数据库