news 2026/5/7 4:15:30

对Java基础算法与五子棋的小理解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
对Java基础算法与五子棋的小理解
一.计算最大公约数
  • 首先,先要明白最大公约数是什么,就是可以同时整除a,b的数里面最大的
  • 然后我们需要在数学上理通这个概念
    首先设a,b两者的最大公约数是d,其中a比较大,余数是r,整数n,m
    那么我们可以得出a=bd+r,r=a-bd,b=nd,a=md,将后两式带入,md=ndd+r,r=md-ndd=d(m-nd),因为(m-nd)结果肯定是整数,所以r的因数是d,b的因数同样是d,所以a,b的公约数一定是b,r的公约数
  • 随后,就可以重复此操作,由于我们设的是最大公约数,并且在上述操作过程中最大公约数不变,那么操作后的最后一个无法约分数即为所求
  • 代码实现
while(b!=0){ int temp = b; b = a % b; a = temp; }
二.斐波那契数列
  • 递归的(数字太大会卡死)
if(k==1||k==2){ return 1; } return function(k-1)+function(k-2);
  • 循环的
    需要不断的一轮一轮的更新a,b,因为永远是a,b在相加
int a=1; int b=1; for(int i=3;i<=k;i++){ int c=a+b; a=b; b=c; }
三.冒泡排序
  • 首先其实就是两两对比,大的向前像泡泡一样向上浮动
  • 他要进行n-1轮,并不是第一轮最大的就上1位了,而是最小的到最后一位了
for(int i=0;i<size-1;i++){ for(int j=0;j<size-1-i;j++){ if(arr[j]<arr[j+1]){ int temp =arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } }
  • 当然,还可以选择Arrays.sort(arr),但他是从小到大,所以最后返回的时候他返回的是size-k
四.五子棋
1.判断落子后的输赢

要点:赢就是在一个方向上连5个,其大体思路就是遍历一个棋子的8个方向(有重复,只用写4个),找到同值的棋子就将找到的这个方向记录并延申.比较有意思的是方向的存储,首先在二维空间中想让描述关于坐标就必然要x,y也就是需要一个二维数组来存储x,y,通过加减就可以动起来,其实这个二维数组就可以说是存储了方向,由于加减,质押存储4个方向够了(五子棋中只有8个方向),注意x,y分别是行与列,

public static int isWin(int x, int y) { int color = board[x][y]; int[][] dir = {{0, 1}, {1, 0}, {1, 1}, {1, -1}}; for (int[] d : dir) { int count = 1; for (int i = 1; ; i++) { int nx = x + d[0] * i; int ny = y + d[1] * i; if (nx >= 0 && nx < 19 && ny >= 0 && ny < 19 && board[nx][ny] == color) { count++; } else { break; } } for (int i = 1; ; i++) { int nx = x - d[0] * i; int ny = y - d[1] * i; if (nx >= 0 && nx < 19 && ny >= 0 && ny < 19 && board[nx][ny] == color) { count++; } else { break; } } if (count >= 5) { return color; } } return 0; }

2.在合法的情况下给棋子附颜色的值(是有2个0,失败0与空地0(棋子的))
还是先进行一次合法的判断,随后还需要检查棋子本身是否是空白,随后再根据步数来赋值,在有两个if是可以用三元运算符来一步到位

public static int playerMove(int x, int y) { if (x < 0 || x >= 19 || y < 0 || y >= 19) { return 0; } board[x][y] = flag % 2 == 0 ? 1 : 2; return 1; }

3.初始菜单
普通的调用,1就直接调用封装好的gameview

while (true) { System.out.println("===== 五子棋 ====="); System.out.println("1. 开始游戏"); System.out.println("2. 设置"); System.out.println("3. 退出"); System.out.print("请选择:"); int choose = scan.nextInt(); if (choose == 1) { gameView(); } else if (choose == 2) { System.out.println("敬请期待"); } else if (choose == 3) { System.out.println("退出"); System.exit(0); } }

4.打印棋盘
第一行数字直接打印,但要注意对齐,由于左上角是空的,所以要提前打印空格,同时%3d来保持两两数字间的空格

public static void gameView_ShowBoard() { System.out.print(" "); for (int i = 0; i < 19; i++) { System.out.printf("%3d", i); } System.out.println(); for (int i = 0; i < 19; i++) { System.out.printf("%3d", i); for (int j = 0; j < 19; j++) { if (board[i][j] == 0) { System.out.print(" x"); } else if (board[i][j] == 1) { System.out.print(" ●"); } else if (board[i][j] == 2) { System.out.print(" o"); } } System.out.println(); System.out.println(); } }

5.打印胜利界面,并且可以回到初始菜单(执行完会自动返回调用函数)(第一个scan处理垃圾,第二个让程序停下来)
还是通过步数来判断什么棋子后再订谁赢

System.out.println("=================="); if (flag % 2 == 0) { System.out.println(" 黑棋胜利!"); } else { System.out.println(" 白棋胜利!"); } System.out.println("=================="); System.out.println("按回车返回主菜单"); scan.nextLine(); scan.nextLine();

6.将所有功能集合到一个函数,再通过初始菜单一键调用
首先还是初始化,然后死循环中首先打印棋盘,然后三元运算符来表示该黑出还是白出,得到坐标先给顶坐标的,然后步数增加,棋盘也会相应的更新,直到第8手后才需要判断输赢,哦,当落子失败的时候对返回的0也要有一个判断,判赢后首先打印棋盘后在打印胜利截图(符合上面的排版)

public static void gameView() { init(); while (true) { gameView_ShowBoard(); String now = flag % 2 == 0 ? "黑棋" : "白棋"; System.out.println("当前:" + now); System.out.print("输入x y:"); int x = scan.nextInt(); int y = scan.nextInt(); int res = playerMove(x, y); if (res == 0) { System.out.println("落子失败!"); continue; } int win = isWin(x, y); if (win != 0) { gameView_ShowBoard(); winView(); break; } flag++; } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/7 4:11:40

Yum下载不了问题

前提是样本源配置成果&#xff0c;因为之前安装包下载失败&#xff0c;后台一直运行无法重新按照时&#xff0c;可以尝试一下步骤&#xff1a;第一步&#xff1a;强制清理所有锁文件rm -f /var/lib/rpm/__db*第二步&#xff1a;直接重建数据库&#xff08;核心步骤&#xff09;…

作者头像 李华
网站建设 2026/5/7 4:10:36

使用bluesky队列服务器

启动与停止运行引擎管理器队列服务器的核心组件是 Run Engine 管理器&#xff0c;它可以作为应用程序或服务来启动。以应用程序运行RE管理器较为简单&#xff0c;建议用于评估、测试和演示环境。生产系统则更倾向于将 RE Manager 作为服务来运行。以应用程序方式运行RE管理器教…

作者头像 李华
网站建设 2026/5/7 4:10:27

基于AI视觉与SOP-AI软件的电机装配顺序与漏装智能防错方案

项目背景与核心痛点在电机制造行业&#xff0c;装配环节是决定产品最终性能与可靠性的关键。我们近期在某电机生产企业的精益化改造项目中&#xff0c;遇到了一个极具代表性的工程挑战&#xff1a;多层组件的叠装顺序与漏装问题。该客户的生产线上&#xff0c;一个关键工位需要…

作者头像 李华
网站建设 2026/5/7 4:09:29

Python实现本地网络摄像头服务器:MJPEG流原理与Flask部署实战

1. 项目概述&#xff1a;从“玩具”到“利器”的本地网络摄像头如果你手头有一台闲置的旧手机、一个吃灰的USB摄像头&#xff0c;或者只是想用电脑自带的摄像头搭建一个简单的监控、直播或视频会议服务器&#xff0c;那么mehmetkahya0/local-web-camera这个项目绝对值得你花时间…

作者头像 李华
网站建设 2026/5/7 4:08:30

三步轻松备份QQ空间说说历史记录:GetQzonehistory完整指南

三步轻松备份QQ空间说说历史记录&#xff1a;GetQzonehistory完整指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否担心QQ空间里的青春记忆会随着时间流逝而消失&#xff1f;那…

作者头像 李华