爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      [笔记] 疯狂JAVA讲义(第3版)第4章 流程控制与数组

      首页 知识中心 其他 文章详情页

      [笔记] 疯狂JAVA讲义(第3版)第4章 流程控制与数组

      2023-03-02 09:38:54 阅读次数:495

      数组,初始化,java

      第4章 流程控制与数组

      4.1 顺序结构

      从上往下执行。没有流程控制的情况下,代码从第一行一直往下执行到最后一行,

      4.2 分支结构

      Java提供两种常见的分支结构:if语句和switch语句。

      4.2.1 if条件语句

      if语句使用布尔表达式或布尔值作为分支条件进行分支控制。if语句有3中形式:

      if( expression){ //如果条件成立,则执行语句
      statement...
      }
      
      if(expression){ //如果条件成立,则执行语句
      statement...
      }
      else{ //否则,执行else中语句
      statement...
      }
      

      3

      if(expression){ //如果条件成立,则执行语句
      statement...
      }
      else if(expression){ //否则,如果下一个if成立执行else if中语句
      statement...
      }
      //...可以有0个或多个else if语句
      else{ //最后的else也可以省略
      statement...
      }
      

      花括号括起来的部分作为代码块,将多行代码构成整体。

      为了可读性和减少错误,建议if else语句中使用花括号,即使代码块只有一行。

      @if else 的逻辑错误

      public class IfErrorTest
      
      {
      
        public static void main(String[] args){
        int age = 45;
        if(age>20){
        System.out.println("青年");
        }
        else if(age>40){
        System.out.println("中年");
        }
        else if(age>60){
        System.out.println("老年");  
        }
        }  
      }
      

      表面上没有问题,但是案例的45岁经过if(age>20)时会输出青年。

      应该修改顺序,

      if(age>60) //老年

      else if(age>40)//中年

      else if(age>20)//青年

      在使用if else 时,有一条基本规则,应该优先处理包含范围小的条件。比如age>60和age>20,应该先处理范围较小的age>60。

      4.2.2 Java 7 增强后的switch语句

      switch语句由一个控制表达式和多个case标签组成。

      switch的控制表达式只能是byte,short,char,int四个整数型,枚举、String类型(Java7开始允许)

      switch语法:

      switch(expression)
      {
      case condition1:
      statemet;
      break;
      }
      case condition2:
      {
      statemet;
      break;
      }
      ...
      default:
      {
      statemet;
      }
      

      执行先对expression求值,然后依次匹配condition1、condition2、…遇到匹配的就执行对应的执行体。如果都不匹配,则执行default。

      由于case标签使代码块非常清晰,可以省略花括号。

      @注意不要漏写break,不然一遇到相等的值,程序就会一直执行完标签后面的所有语句。例如下面的例子,如果去掉break,程序输出夏天 秋天 冬天 季节输入错误。

      例:

      public class StringSwitchTest
      {
      public static void main(String\[\] args)
      {
      String season = "夏天";
      switch(season)
      {
        case "春天":
        System.out.println("春天");
        break;
        case "夏天":
        System.out.println("夏天");
        break;
        case "秋天":
        System.out.println("秋天");
        break;
        case "冬天":
        System.out.println("冬天");
        break;
        default"
        System.out.println("季节输入错误");
      

      4.3 循环结构

      在满足条件时,反复执行一段代码(循环体)。

      在执行循环体时,需要在某些时候将条件改为假,否则就会一直执行循环体,形成死循环。

      循环语句可能包含4个部分:

      初始化,循环条件,循环体,迭代语句。

      4.3.1 while循环

      while语句语法

      [init_statement]
      while(expression)
      {
      statement;
      [iteration_statement];
      }
      

      例:

      public class WhileTest
      {
      public static void main(String[] args)
      {
      int count =0;
      while(count<10)
      {
      System,out.println(count);
      }
      System.out.println("循环结束!");
      }
      }
      

      @while陷阱 while后面紧跟一个;时,while后面的代码块和while没有关系。

      4.3.2 do while

      do while和while的区别是do while是先do,在判断

      [init]
      do{
      statement;
      [iteration_statement];
      }while(expression);
      

      do while的循环条件后面必须有一个分号,表明循环结束。

      4.3.3 for循环

      for循环是更加简洁的循环语句,大部分情况下,都可以使用for循环。

      for([init_statemnet]; [test_expression;[iteration_stetement])
      {
      statement
      }
      

      在执行循环前,先执行初始化语句init_stetement;

      每次循环前,先计算test_expression的值,如果true,则执行循环体,然后执行循环迭代语句。

      @for循环的循环迭代语句没有和循环体放在一起,因此即使循环体遇到continue结束本次循环,循环迭代语句也会执行。这是while、do while语句不能做到的。

      例:for循环

      public static void main(String[] args){
      for(int count =0;count<10;count++){
      System.out.println(count);
      }
      System.out.println("循环结束!");
      }
      

      4.3.4 循环嵌套

      把一个循环放入另一个循环体内,就可以形成循环嵌套。

      for(int i=0;i<5;i++){
      for(int j=0;j<3;j++){
      System.out.println("i="+i+"j="+j);
      }
      

      4.4 控制循环结构

      4.4.1 break结束循环

      break用于完全结束一个循环,跳出循环体。

      @break不仅可以结束其所在的循环,还可以直接结束外层循环,此时需要break后面跟一个标签,这个标签用于标识外层循环。

      outer:
      for(int i=0;i<5;i++){
      for(int j=0;j<3;j++){
      Suytem.out.println("i="+i+"j="+j);
      if(j==1){
      break outer;
      }
      }
      

      4.4.2 使用continue忽略本次循环剩下语句

      @与break类似,continue也可以跟一个标签,忽略标识循环的剩下语句,重新开始下一次循环。

      4.4.3 使用return结束方法

      return的功能是结束一个方法,如果循环在一个方法中,使用return结束方法,循环也随之结束。

      4.5 数组类型

      4.5.1 理解数组:数组也是一种类型

      Java要求数组的数组元素具有相同的数据类型。

      int[] 也是一种类型。

      4.5.2 定义数组

      type[] arrayName;

      type arrayName[];

      推荐第一种格式。

      数组是一种引用类型的变量,定义时仅仅定义了一个引用变量,(也就是定义了一个指针),还没有指向有效内存。

      只有初始化时后才能使用。

      4.5.3 数组的初始化

      1.静态初始化

      arrayName = new type[] {element1,element2,…};

      简化的格式

      type[] arrayName = {element1,element2,…};

      2.动态初始化

      只指定数组长度,由系统指定初始值。

      arrayName = new type[length];

      @不要同时静态初始化和动态初始化。不要即指定长度,又同时指定初始值。

      4.5.4 使用数组

      访问元素arrayName[index]

      索引是从0开始的。

      数组提供了length属性,表示数组长度。可以利用length遍历数组

      for(int i=0;i<prices.length;i++){
      System.out.println(prices[i]);
      }
      

      4.5.5 foreach循环

      用于遍历数组和集合。

      for(type variableName : array|collection)
      {
      //varivableName自动迭代访问每个元素
      }
      

      例子:

      //
      
      String[] books = {"Bo1","Bo2"};
      for(String book : books)
      {
      System.out,println(book);
      }
      

      @for each循环不能改变数组元素的值,因此不要用foreach进行赋值。

      4.6 深入数组

      4.6.1 内存中的数组

      数组引用变量是一个引用,这个引用变量可以指向任何有效内存,然后访问数组元素。

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LVPO4uLo-1588335970117)(media/image1.png)]{width=“5.433566272965879in” height=“3.0264884076990377in”}

      只要类型兼容,可以让一个数组变量指向另一个实际的数组,这种操作会让人产生数组长度可变的错觉,但其实数组没变,只是引用变量指向另一个数组。

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d38TXVTh-1588335970119)(media/image2.png)]{width=“4.286713692038496in” height=“4.588170384951881in”}

      4.6.2 基本类型数组的初始化

      int [] iArr;
      iArr = new int[5];
      for(int i=0;i<iArr.length; i++){
      iArr[i] = i+10;
      }
      

      4.6.3 引用类型数组的初始化

      数组元素是引用时,情况变得复杂。

      //Person类
      //定义Person数组
      Person[] students;
      students = new Person[2];
      //创建Person实例zhang
      Person zhang = new Person();
      zhang,age = 15;zhang,height = 158;
      //创建Person实例Lee
      Person lee = = new Person();
      lee.age = 16;lee.height = 160;
      //赋值给数组元素
      student[0] = zhang;
      student[1] = lee;
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sLpVP9qC-1588335970123)(media/image3.png)]{width=“4.083916229221347in” height=“2.094316491688539in”}

      4.6.4 “没有多维数组”

      Java提供了支持多维数组的语法,但从数组底层来说,只有一维数组。

      int[][] arrName; //二维数组的定义

      它的本质还是一维数组,数组元素也是引用,元素保存的引用指向一维数组。

      接着对二维数组进行初始化:

      arrName = new type[length][];

      同样可以当成是一维数组的初始化,这个一维数组的元素是引用类型(数组类型)的。

      4.6.5 Java8增强的工具类 Arrays

      Arrays类包含一些static方法可以直接操作数组。

      二分查找binarySearch

      复制数组 copyOf

      判断相等equals

      填充数组fill

      排序 sort

      转换字符串 toString

      int binarySearch(type[] a, type key): 二分查找key在a数组出现的索引,如果不包含key,则返回负数。要求数组元素已经升序排列。

      int binarySearch(type[] a,int fromIndex, int toIndex, type key) 只搜索从fromIndex到 toIndex的元素

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hx3uaxsu-1588335970128)(media/image4.png)]{width=“8.139860017497814in” height=“4.137016622922134in”}

      @Arrays类 ,使用需要import java.util.Arrays类。

      java8 为Arrays类增加的工具方法:

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-61ThhsbZ-1588335970129)(media/image5.png)]{width=“7.311807742782152in” height=“4.916083770778653in”}

      @parallel代表并行

      Arrays类使用举例:

      import java.util.Arrays;
      public class ArraysTest
      {
      public static void main(String[] args){
      int [] a = new int[]{3,4,5,6};
      int [] a2 = new int[]{3,4,5,6};
      System.out.println("a和a2是否相等:"+Arrays.equals(a,a2));
      int []b = Arrays.copyOf(a,6);
      System.out.println("a和b是否相等:"+Arrays.equals(a,b));
      System.out.println("b数组元素:"+Arrays.toString(b));
      Arrays.fill(b,2,4,1);
      System.out.println("b数组元素:"+Arrays.toString(b));
      Arrays.sort(b);
      System.out.println("b数组元素:"+Arrays.toString(b));
      }
      }
      

      Arrays类新增方法举例:

      import java.util.*;
      import java.util.function.IntBinaryOperator;
      import java.util.function.IntUnaryOperator;
      public class ArraysTest2 {
      public static void main(String[] args) {
      int[] arr1 = new int[] { 3, -4, 25, 16, 30, 18 };
      Arrays.parallelSort(arr1);
      System.out.println(Arrays.toString(arr1));
      int[] arr2 = new int[] { 3, -4, 25, 16, 30, 18 };
      Arrays.parallelPrefix(arr2, new IntBinaryOperator() {
      public int applyAsInt(int left, int right) {
      return left * right;
      }
      });
      System.out.println(Arrays.toString(arr2));
      int[] arr3 = new int[5];
      Arrays.parallelSetAll(arr3,new IntUnaryOperator(){
      @Override
      public int applyAsInt(int operand) {
      return operand*5;
      }
      });
      System.out.println(Arrays.toString(arr3));
      }
      }
      

      4.6.6 数组的应用举例

      如果程序中有多个类型相同的变量,且它们具有逻辑的整体性,则可以将它们定义成一个数组。

      例如,开发一个工具函数:将一个浮点数转换成人民币读法字符串,这个程序就很需要使用数组,

      思路是将浮点数分成整数和小数部分,整数部分使用整数强制转换,小数部分用浮点数-整数部分即可。

      整数部分需要考虑中国的数字习惯,4位一节,1个4位数字可以转换成几千几百几十几。

      除此之外,还可以利用二维数组实现五子棋,连连看,俄罗斯方块等小游戏。

      //五子棋,仅实现棋盘,胜负判定未实现

      import java.io.BufferedReader;
      import java.io.InputStreamReader;
      import java.io.*;
      public class Gobang
      {
      //棋盘大小
      private static int BOARD_SIZE = 15;
      //二维数组当棋盘
      private String[][] board;
      //初始化棋盘
      public void initBoard(){
      board = new String[BOARD_SIZE][BOARD_SIZE];
      for(int i=0;i<BOARD_SIZE;i++){
      for(int j=0;j<BOARD_SIZE;j++){
      board[i][j] = "+";
      }
      }
      }
      //控制台输出棋盘
      
      public void printBoard(){
      for(int i=0;i<BOARD_SIZE;i++){
      for(int j=0;j<BOARD_SIZE;j++){
      System.out.print(board[i][j]);
      }
      System.out.print(\"\n");
      }
      }
      
      public static void main(String[] args) throws Exception{
      Gobang gb = new Gobang();
      gb.initBoard();
      gb.printBoard();
      //获取键盘输入
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      String inputStr = null;
      while(( inputStr=br.readLine())!=null){
      String[] posStrArr = inputStr.split(",");
      int xPos = Integer.parseInt(posStrArr[0]);
      int yPos = Integer.parseInt(posStrArr[1]);
      gb.board[yPos-1][xPos-1] = "#";
      gb.printBoard();
      System.out.println("请输入下棋的坐标: x,y");
      }
      }
      }
      

      附录 本章练习

      1.使用循环打印九九乘法表

      //九九乘法表
      package ch4;
      
      public class Test1 {
        public static void main(String[] args) {
          for(int i=1;i<=9;i++) {
            for(int j=1;j<=i;j++) {              System.out.print(i+"*"+j+"="+i*j+" ");
            }
            System.out.print("\n");
          }
        }  
      }
      

      2.使用循环输出等腰三角形。

      //打印rows行的等腰三角形
      package ch4;
      
      public class Test2 {
        public static void main(String[] args) {
          final int rows = 4;
          for(int i=1;i<=rows;i++) {
            for(int j=0;j<rows-i;j++) {
              System.out.print(" ");
            }
            for(int j=0;j<2*i-1;j++) {
              System.out.print("*");
            }
            System.out.print("\n");
          }
        }
      }
      

      3.打印近似圆

      //画圆
      package ch4;
      
      public class Test3 {
        public static void main(String[] args) {
          int r = 10 ;//半径
          for(int y=0;y<=2*r;y+=2) { //y+=2,如果是y++的话就会(因为精度)很难看
            int x1 = r-getX(r,y);
            int x2 = r+getX(r,y);
            for(int j=0-r;j<x1;j++) {
              System.out.print(" ");
            }
            System.out.print("*");
            for(int j=x1;j<x2;j++) {
              System.out.print(" ");
            }
            System.out.print("*");
            System.out.print("\n");
      
          }
      
        }
        public static int getX(int r,int y) {
          double tempX;
          tempX = Math.sqrt(r*r - (y-r)*(y-r));
          return (int)Math.round(tempX); 
      
        }
      }
      

      4.按字节截取字符串的子串。类似String类的substring()。

      感觉这个题目有问题,略过

      5.编写一个程序,将浮点数转换成人民币读法字符串,精确到分且不超过12位。例如。将1006.333转换为壹仟零陆元叁角叁分

      重点是转换规律是每4位一转,然后根据位置加上元/万/亿。

      另一个易错点是零的处理,连续零和末尾零以及全零数。

      package ch4;
      public class Test5 {
        public static String[] hanArr= {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
        public static String[] unitArr= {"十","百","千"};
        public static  String divide(double num) {
          long zheng = (long )num;//整数部分
          long xiao = Math.round((num-zheng)*100); //保留两位小数
          return new String(zheng+"#"+xiao);
        }
        //将4位及4位以内数字字符串转换成人民币读法
        public static String trans4(String s) {
          int len = s.length();
          if(len>4&&len<1) {
            System.out.println("传入参数错入,应该传入1-4位的数字字符串");
            return "";
          }
          String tmp = s;
          String result = "";
          if("0000".equals(tmp)||"000".equals(tmp)||"00".equals(tmp)||
              "0".equals(tmp)){
            return result = hanArr[0];
          }
          //去除前面的0
          while(tmp.charAt(0)=='0'&&len>1) {
            tmp = tmp.substring(1,len);
            len = len-1;
          }
          //转换...
          for(int i=0;i<len;i++) {
            int n = tmp.charAt(i)-48;
            //不为0且不是最后一位,直接转为数字+单位
            if( n !=0 && (i!=len-1)) {
              result+= hanArr[n]+unitArr[len-2-i];
            }else if(n==0) {
              //判断连续0,前面不是0时加'零',有连续的0过就跳过,末尾的0也跳过
              if((tmp.charAt(i-1)-48)!=0 && i!=len-1) {
                result+=hanArr[0];
              }  
            }else if(n!=0&&(i==len-1)) {
              result+=hanArr[n];
            }  
          }
          //末尾零,去掉
          if(result.charAt(result.length()-1)=='零') {
            result = result.substring(0,result.length()-1);
          }
          return result;
        }
        public static String transAll(String s) {
          String result = "";  
          //4位数以内
          if(s.length()<=4) {
            result = trans4(s);
          }
          //4位数以上8位数以内
          else if(s.length()<=8)
          {
            String s1 = trans4(s.substring(0,s.length()-4));//高位
            String s2 = trans4(s.substring(s.length()-4));//低位
            if("零".equals(s2)) {
              s2="";
            }  
            result = s1 +"万"+ s2;
          }
          else if(s.length()<=12) 
          {
            String s1 = trans4(s.substring(0,s.length()-8));//高位
            String s2 = trans4(s.substring(s.length()-8,s.length()-4)) ;//低位
            String s3 = trans4(s.substring(s.length()-4));    //最低位
            result += s1 +"亿";
            if(!"零".equals(s2)) {
              result += s2+"万";
            }
            if(!"零".equals(s3)) {
              result += s3;
            }
          }
          return result;
        }  
        public static void main(String[] args) {
          double num = 12301234000.11;
          String snum = divide(num);
          String zheng = snum.substring(0, snum.indexOf("#"));
          String xiao = snum.substring(snum.indexOf("#")+1);  
          //小数部分简单, 直接写在这里了
          String han_xiao ="";
          if(xiao.length()==1) {
            char c=xiao.charAt(0);
            han_xiao = hanArr[(c-48)]+"角";  
          }else if(xiao.length()==2) {
            char c=xiao.charAt(0);
            han_xiao += hanArr[(c-48)]+"角";  
            c = xiao.charAt(1);
            han_xiao += hanArr[(c-48)]+"分";  
          }
          System.out.println(transAll(zheng)+" "+han_xiao);
        }
      }
      

      6.控制台五子棋

      /*实现了双人对战,未处理非法输入,
      因为没找到合适的字符棋盘有点难看
      */
      package ch4;
      
      import java.io.BufferedReader;
      import java.io.InputStreamReader;
      import java.io.*;
      
      public class Gobang
      {
          private static int BOARD_SIZE = 15;        //棋盘大小
          private String[][] board;                //二维数组当棋盘
          //初始化棋盘
          public void initBoard(){
              board = new String[BOARD_SIZE][BOARD_SIZE];
              for(int i=0;i<BOARD_SIZE;i++){
                  for(int j=0;j<BOARD_SIZE;j++){
                      board[i][j] = "十";
                  }
              }
          }
          //控制台输出棋盘
          public void printBoard(){
              for(int i=0;i<BOARD_SIZE;i++){
                  for(int j=0;j<BOARD_SIZE;j++){
                      System.out.print(board[i][j]);
                  }
                  System.out.print("\n");
              }
          }
          public boolean judge(int y,int x,String s) {
              int left  = (x-4>=0)?(x-4):0;
              int right = (x+4<BOARD_SIZE)?x+4:BOARD_SIZE;
              int up      = (y-4>=0)?(y-4):0;
              int down  = (y+4<BOARD_SIZE)?y+4:BOARD_SIZE;
              int tmpx = x;
              int tmpy = y;
              int zx = x;
              int zx2 = x;
              int zy = y;
              int zy2 = y;
              while(s.equals(board[y][tmpx])&&tmpx>left) {
                  tmpx--;
              }
              while(s.equals(board[tmpy][x])&&tmpy>up){
                  tmpy--;
              }
              while(s.equals(board[zy][zx])&&zx>left&&zy>up) {//左上
                  zy--;
                  zx--;
              }
              while(s.equals(board[zy2][zx2])&&zx>left&&zy<down) {//左下
                  zy2++;
                  zx2--;
              }
              int countx=0;
              int county=0;
              int countz1 = 0;
              int countz2 = 0;
              //x轴y轴判断
              for(int i=tmpx;i<=right;i++) {
                  if(s.equals(board[y][i])) {
                      countx++;
                  }
              }
              for(int j=tmpy;j<=down ;j++) {
                  if(s.equals(board[j][x])) {
                      county++;
                  }
              }  
              //斜线判断
              for(int j=zy,i=zx;j<=down&&i<=right;j++,i++) {
                  if(s.equals(board[j][i])) {
                      countz1++;
                  }
              }
              for(int j=zy2,i=zx2;j>=up&&i<=right;j--,i++) {
                  if(s.equals(board[j][i])) {
                      countz2++;
                  }
              }
      
              if(countx>=5||county>=5||countz1>=5||countz2>=5) {
                  return true;
              }
      
              return false;
          }
      
          public static void main(String[] args) throws Exception{
              Gobang gb = new Gobang();
              gb.initBoard();
              gb.printBoard();
              //获取键盘输入
              BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
              String inputStr = null;
              System.out.println("请输入下棋的坐标: x,y");
              boolean meWin = false;
              boolean youWin = false;
              boolean myTurn = true;
              while(( inputStr=br.readLine())!=null ){
                  String[] posStrArr = inputStr.split(",");
                  int xPos = Integer.parseInt(posStrArr[0]);
                  int yPos = Integer.parseInt(posStrArr[1]);
                  if(myTurn) {
                      gb.board[yPos-1][xPos-1] = "●";
                      meWin = gb.judge(yPos-1,xPos-1,"●");
                  }
                  else {
                       gb.board[yPos-1][xPos-1] = "○";
                       youWin = gb.judge(yPos-1,xPos-1,"○");
                  }
                  gb.printBoard();
                  if(meWin) {
                      System.out.println("meWin!");
                      break;
                  }else if(youWin) {
                      System.out.println("youWin!");
                      break;
                  }
                  myTurn = !myTurn;
                  System.out.println("请输入下棋的坐标: x,y");
              }
      
          }
      
      }
      
      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.51cto.com/pigeon/5451582,作者:一只大鸽子,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:8、Mybatis-Plus 分页插件、自定义分页

      下一篇:Metasploit训练基础-漏洞分析CVE-2017-11882

      相关文章

      2025-05-19 09:04:22

      外设驱动库开发笔记54:外设库驱动设计改进的思考

      外设驱动库开发笔记54:外设库驱动设计改进的思考

      2025-05-19 09:04:22
      使用 , 函数 , 初始化 , 定义 , 对象
      2025-05-19 09:04:14

      复杂度的OJ练习

      复杂度的OJ练习

      2025-05-19 09:04:14
      代码 , 复杂度 , 思路 , 数组 , 算法
      2025-05-16 09:15:24

      如何将一串数字用函数的方法倒过来(C语言)

      如何将一串数字用函数的方法倒过来(C语言)

      2025-05-16 09:15:24
      函数 , 数字 , 数组
      2025-05-16 09:15:24

      jQuery遍历对象、数组、集合

      jQuery遍历对象、数组、集合

      2025-05-16 09:15:24
      jQuery , 对象 , 数组 , 遍历 , 集合
      2025-05-16 09:15:17

      递归,搜索,回溯算法(3)之穷举,暴搜,深搜,回溯,剪枝

      递归,搜索,回溯算法(3)之穷举,暴搜,深搜,回溯,剪枝

      2025-05-16 09:15:17
      回溯 , 子集 , 数组 , 算法 , 递归
      2025-05-14 10:33:31

      计算机小白的成长历程——习题演练(函数篇)

      计算机小白的成长历程——习题演练(函数篇)

      2025-05-14 10:33:31
      函数 , 字符串 , 数组 , 知识点 , 编写 , 迭代 , 递归
      2025-05-14 10:33:31

      计算机小白的成长历程——数组(1)

      计算机小白的成长历程——数组(1)

      2025-05-14 10:33:31
      strlen , 个数 , 元素 , 内存 , 十六进制 , 地址 , 数组
      2025-05-14 10:33:16

      C++ 11新特性之tuple

      在C++编程语言的发展历程中,C++ 11标准引入了许多开创性的新特性,极大地提升了开发效率与代码质量。其中,tuple(元组)作为一种强大的容器类型,为处理多个不同类型的值提供了便捷的手段。

      2025-05-14 10:33:16
      std , 元素 , 函数 , 初始化 , 模板 , 类型
      2025-05-14 10:03:05

      C++ 11新特性之语法甜点2

      C++ 11新特性之语法甜点2

      2025-05-14 10:03:05
      函数 , 初始化 , 基类 , 构造函数 , 编译器 , 语法
      2025-05-14 10:03:05

      C++ 11新特性之语法甜点1

      C++ 11新特性之语法甜点1

      2025-05-14 10:03:05
      函数 , 初始化 , 序列 , 引入 , 构造函数 , 语法
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5265250

      查看更多

      最新文章

      jQuery遍历对象、数组、集合

      2025-05-16 09:15:24

      java休眠到指定时间怎么写

      2025-05-14 10:02:58

      typescript 将数组清空

      2025-05-14 10:02:48

      java 深搜

      2025-05-13 09:50:17

      java实现167. 两数之和 II - 输入有序数组

      2025-05-13 09:50:17

      移动零,11. 盛最多水的容器,15. 三数之和

      2025-05-12 09:10:14

      查看更多

      热门文章

      在java正则表达式中为什么要对 . 进行两次的转义操作 (\\.)才表示真正的 .

      2023-05-15 10:01:56

      GC是什么? 为什么要有GC?

      2023-05-10 06:02:16

      axios&spring前后端分离传参规范总结

      2023-05-22 08:09:06

      Jsp Ajax之模拟用户注册

      2022-11-17 12:37:24

      定义一个函数,接收三个参数返回一元二次方程

      2023-02-13 07:59:59

      ArrayList动态数组对象 c# 1231

      2023-03-28 03:29:30

      查看更多

      热门标签

      linux java python javascript 数组 前端 docker Linux vue 函数 shell git 节点 容器 示例
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      表单选择器+基本过滤器

      leetcode-dp-hard-最小距离

      JSP原理深度刨析

      java基础之final关键字

      数组指针

      相应内容格式 gzip

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号