欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

五子棋

最编程 2024-06-26 12:24:16
...
【直播预告】大模型会取代程序员吗?”


  五子棋的编写

  分析:
    构成元素:
        欢迎界面 下棋界面  结束界面
        棋子---黑+白两种棋子
        棋盘--动态棋盘--15X15  32X32
        下棋--两个用户切换
              已经下过的地方不能重复下
        判断五子相连规则
            横向  纵向  斜向[左右]
     业务流程分析:
         1.创建一个类
         2.主函数--程序入口
         3.欢迎界面
         4.菜单选择
           新手入门
             选择菜单
                开始游戏
                  生成棋盘
                  提示用户操作
                  形成五子相连--新手指导结束
                  返回菜单
                退出新手入门模块
                  结束当前模块回到主菜单
           玩家对抗
              模块欢迎界面
              选择菜单
                 开始游戏
                    生成棋盘
                    切换用户
                    开始下棋
                    判断是否连城五子
                       如果是--结束游戏
                       如果不是继续游戏
                 结束此模块
                 人机对战【类似玩家对抗】
              

 
import java.util.Scanner;
public class WZQ{
 public static void main(String[] args){
    //获取对象
    Scanner scan=new Scanner(System.in);

     //欢迎界面
     System.out.println("##########################################");
     System.out.println("#######==========================#########");
     System.out.println("#######==欢迎来到小王五子棋游戏==#########");
     System.out.println("#######==========================#########");
     System.out.println("##########################################");
     //控制程序一直执行
     while(true){
       //编写菜单
       System.out.println("##########################################");
       System.out.println("####    A 新手入门     B 玩家对抗    #####");
       System.out.println("####    C 人机对战     其他 退出游戏 #####");
       System.out.println("##########################################");
       //提示用户输入信息
       System.out.println("请输入菜单前面的字符进入对应模块:");
       //键盘接收
       String zmenu=scan.next();
       //================菜单判断开始=============
       //进行判断
       if("A".equals(zmenu)){
         //模块菜单
         System.out.println("************欢迎进入新手入门***************");

       }else if("B".equals(zmenu)){
         //模块菜单
         System.out.println("************欢迎进入玩家对抗***************");
         //循环控制游戏的运行
         while(true){
           //菜单
           System.out.println("******  Y 开始游戏     其他 回到主页 ******");
           //提示用户输入
           System.out.println("请输入您的操作选择:");
           //接收输入的信息
           String wmenu=scan.next();


           //判断
           if("Y".equals(wmenu)){
              //定义变量
              boolean kg=true;//开关状态
              String name="王妍";
              String qz="@";

              //定义变量存储坐标
              int x=0;
              int y=0;
         
              //控制器游戏结束
              boolean gameover=false;

             //=========显示棋盘===========
             //动态输入一个数组确定棋盘的大小
             //提示
             System.out.println("请输入一个数字确定棋盘大小:");
             //键盘接收
             int qpsize=scan.nextInt();

             //定义数组存储棋盘的信息
             String[][] qipan=new String[qpsize][qpsize];
            
             //添加一行标号
             System.out.print("  ");
             for(int shb=0;shb<qpsize;shb++){
                //输出
                System.out.print((char)('A'+shb)+" ");
 
             } 
             //换行
             System.out.println();           

             //使用+表示棋盘节点打印棋盘
             for(int h=0;h<qpsize;h++){
                 //添加标号
                 System.out.print((char)('A'+h)+" ");
                 for(int l=0;l<qpsize;l++){//每一行数据
                   System.out.print("+"+" ");
                  //存入数组
                   qipan[h][l]="+";

                 }
                 //添加标号
                 System.out.print((char)('A'+h)+" ");

                 //换行
                 System.out.println();

              }

               //添加一行标号
              System.out.print("  ");
              for(int xib=0;xib<qpsize;xib++){
                //输出
                System.out.print((char)('A'+xib)+" ");
  
             }  
              //换行
             System.out.println(); 


             while(true){//一直下棋 直到结束
               //=======切换用户=========
               //判断
               if(kg){
                  name="小胖胖";
                  qz="@";
                  //切换开关
                  kg=false;

               }else{
                 name="王悦";
                 qz="#"; 
                 //切换开关
                 kg=true; 
 
               } 

              //提示下棋
              System.out.println("请示用户【"+name+"】输入坐标下棋:(例如:AB A-行号 B列号)");
             while(true){//坐标输入
                  //接收用户下棋的坐标
                  String zb=scan.next();

                   //=======棋盘落子========
                  //判断
                   if(zb!=null&&zb!=""&&zb.length()==2){
                       //获取坐标
                       char[] zbs=zb.toCharArray();
                       //打印
                       y=zbs[0]-65;
                       x=zbs[1]-65;
                       //判断坐标是不在范围
                       if(x>=0&&x<qpsize&&y>=0&&y<qpsize){

                            //判断此位置是否有棋子
                            if("+".equals(qipan[y][x])){
                                //下棋:
                                qipan[y][x]=qz;
                                //结束下棋的循环
                                 break;
                             
                             }else{
                                //此处已经下了棋子
                                System.out.println("你输入的坐标处已经下过棋,请【"+name+"】重新输入:");
                              
                             }

                       }else{
                           //不在范围
                           System.out.println("你输入的坐标超出棋盘范围,请【"+name+"】重新输入:");
                           
                        }


                    }else{
                        //不合法
                         System.out.println("您输入的坐标不合法,请【"+name+"】重新输入:");
                    }

                }//坐标输入的while
                //===========================显示棋盘=================
                //添加一行标号
                System.out.print("  ");
                for(int shb=0;shb<qpsize;shb++){
                    //输出
                    System.out.print((char)('A'+shb)+" ");
   
               } 
               //换行
               System.out.println();           

                //使用+表示棋盘节点打印棋盘
                for(int h=0;h<qpsize;h++){
                   //添加标号
                    System.out.print((char)('A'+h)+" ");
                    for(int l=0;l<qpsize;l++){//每一行数据
                      //显示内容
                      System.out.print(qipan[h][l]+" ");
         

                    }
                    //添加标号
                    System.out.print((char)('A'+h)+" ");

                    //换行
                    System.out.println();

                 }

                   //添加一行标号
                  System.out.print("  ");
                  for(int xib=0;xib<qpsize;xib++){
                     //输出
                       System.out.print((char)('A'+xib)+" ");
  
                 }  
                 //换行
                 System.out.println(); 

              //========================显示棋盘结束=======================
      
               //===================判断是否结束游戏====================
                 //赢了
                 //横向五子相连
                  //获取最大最小横坐标
                  int minx1=0;//一行形成五子最小可能坐标
                  int maxx1=0;//一行形成五子最大可能坐标
                  int my1=y;//行
                  int count1=0; //计数

                   //判断
                   if(x-4<0){
                     minx1=0;
                   }else{
                     minx1=x-4;
                    }
                    if(x+4<qpsize){
                     maxx1=x+4;
                    }else{
                      maxx1=qpsize-1;
                    }
                  

                    //遍历最大和最小极限范围内是否有五个一样的棋子
                    for(int m=minx1;m<=maxx1;m++){
                      //判断是否有五个棋子相连
                      if(qipan[my1][m].equals(qz)){
                         //计数器++
                         count1++;
                      }else{
                         //重新统计
                         count1=0;
                      }
                      //判断计数器
                      if(count1==5){
                        gameover=true;
                        //结束循环
                        break;
                      }

                      

                    }

                  //纵向五子相连

                   //获取最大最小纵坐标
                  int miny1=0;//形成五子最小可能坐标
                  int maxy1=0;//形成五子最大可能坐标
                  int mx1=x;//列
                  int count2=0; //计数

                   //判断
                   if(y-4<0){
                     miny1=0;
                   }else{
                     miny1=y-4;
                    }
                    if(y+4<qpsize){
                     maxy1=y+4;
                    }else{
                      maxy1=qpsize-1;
                    }
                  

                    //遍历最大和最小极限范围内是否有五个一样的棋子
                    for(int m=miny1;m<=maxy1;m++){
                      //判断是否有五个棋子相连
                      if(qipan[mx1][m].equals(qz)){
                         //计数器++
                         count2++;
                      }else{
                         //重新统计
                         count2=0;
                      }
                      //判断计数器
                      if(count2==5){
                        gameover=true;
                        //结束循环
                        break;
                      }

                      

                    }


          
                  //斜向五子相连【四种】
                  //定义坐标
                  int minxx1=0;//斜向x最小值
                  int minxy1=0;//斜向Y最小值
                  int maxxx1=0;//斜向x最大值
                  int maxxy1=0;//斜向Y最大值
                  int count3=0;//计数器
     

                  //判断最小坐标
                  if(x-4>=0&&y-4>=0){
                    //最小
                    minxx1=x-4;
                    minxy1=y-4;   

                   }else if(x-4>=0&&y-4<0){
                    minxy1=0;
                    minxx1=x-y;


                    }else if(x-4<0&&y-4>=0){
                          minxx1=0;
                          minxy1=y-x;
                    }else{
                       if(x>=y){
                         minxx1=x-y;
                         minxy1=0;
                       
                        }else{
                         minxx1=0;
                         minxy1=y-x;
                       }
                    }
                   //最大可能坐标
                   if(x+4<qpsize&&y+4<qpsize){
                        maxxx1=x+4;
                        maxxy1=y+4;

                    }else if(x+4<qpsize&&y+4>=qpsize){
                        maxxx1=x+(qpsize-1-y);
                        maxxy1=qpsize-1;

                    }else if(x+4>=qpsize&&y+4<qpsize){
                        maxxy1=y+(qpsize-1-x);
                        maxxx1=qpsize-1;


                    }else{
                       if(x>=y){
                        maxxx1=x+(qpsize-1-y);
                        maxxy1=qpsize-1;
                        }else{
                        maxxy1=y+(qpsize-1-x);
                        maxxx1=qpsize-1;
                      }

                     }
                      //遍历判定
                      for(int m=0; m<=maxx1-minxx1;m++){
                      //判断棋子
                      if(qipan[minxy1+m][minxx1+m].equals(qz)){
                      //计数

                      count3++;
                      }else{
                          count3=0;

                        }
                       //判断是否五子相连
                       if(count3==5){
                          gameover=true;
                          //结束
                          break;

                       }


                     }

                 //定义五子相连斜向【二】
                  int minxx2=0;//斜向x最小值
                  int minxy2=0;//斜向Y最小值
                  int maxxx2=0;//斜向x最大值
                  int maxxy2=0;//斜向Y最大值
                  int count4=0;//计数器

                 //判断最小坐标
                 
     
                   

           
                 //平局---棋盘满了---且不形成五子相连---遍历棋盘如果没有+号

                  

                 //======游戏结束======
                 if(gameover){
                    //输出
                    System.out.println("==========游戏结束==========");
                    System.out.println("==恭喜【"+name+"】赢了此局游戏==");
                    //结束循环
                    break;
                 }
              


              

             
            }//控制下棋的while结束         
             
     

   
           }else{
             //结束此模块回到主页
             System.out.println("您退出了玩家对抗模块!!!!返回主页!!!!");
             //结束当前循环
             break;
           }


         }//玩家对象菜单while的结束
         
         
          

       }else if("C".equals(zmenu)){
         //模块菜单
         System.out.println("************欢迎进入人机对战***************");


        
       }else{
          //提示结束游戏
          System.out.println("【【【【【您是否需要离开五子棋游戏?如果是输入y,不是输入其他】】】】】");
          //接盘接收
           String gover=scan.next();
           //判断
           if("y".equals(gover)){
             //输出
             System.out.println("【】【】您已经退出游戏,欢迎下次再来!!【】【】");
             //结束循环
             break;
           }
       }
       //================菜单判断结束=============
     }//主菜单while循环结束
     

  }
}