Java编写实现九宫格应用

 更新时间:2022年05月05日 08:05:55   作者:shihao9895  
这篇文章主要为大家详细介绍了Java编写实现九宫格应用,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Java编写实现九宫格应用的具体代码,供大家参考,具体内容如下

在九宫格里面轮流画圈或叉,哪一方先在水平、竖直、或对角线上有三个子则胜出。

可在窗体中安排9个按钮对应每个格子

计算机和人轮流下子。

代码如下:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.lang.*;
class ChessDemo extends Panel implements ActionListener{
    char whoTurn = 'O';  //人—O,计算机--X
    Button b[] = new Button[9];  //9个按钮
    StringBuffer chess = new StringBuffer("KKKKKKKKK");
     //将九宫格用一位数组来表示,用K字符表示空位置
     
public ChessDemo(){
      setLayout(new GridLayout(3,3,3,3));
      for (int i=0;i<9;i++) {
          b[i] = new Button("");
          add(b[i]);
          b[i].setActionCommand(String.valueOf(i));
          b[i].addActionListener(this);
      }
}
 
public void actionPerformed(ActionEvent e) {
       Button me = (Button)(e.getSource());//自己
       if (!me.getLabel().equals("")) //不允许在已有棋子位置下棋 
            return;
       me.setLabel("" + whoTurn); //标记下棋
       int row = Integer.parseInt(me.getActionCommand()); //求位置
       chess.setCharAt(row,whoTurn); //记录下棋     
       gameOver();  //判游戏是否结束
       whoTurn = (whoTurn=='O') ? 'X' : 'O'; //轮换玩家
       computerTake();  //计算机下
} 
 
public  int  findplace() { //计算机找下棋位置
       for (int r=0;r<9;r++) 
          if (chess.charAt(r)=='K') {    //找个空位置
             chess.setCharAt(r,whoTurn);     //先填上棋子
             if (isWin(whoTurn))  { //看自己下此位置是否能赢 
                 chess.setCharAt(r,'K');  // 恢复原状
                    return r;
             }
             else
                 chess.setCharAt(r,'K');   // 恢复原状
         }
     // 没自己能直接赢得位置再看对方能赢的地方
      char  whoTurn2 = (whoTurn=='O') ? 'X' : 'O'; //换成对方思考
      for (int r=0;r<9;r++) 
            if (chess.charAt(r)=='K') {
             chess.setCharAt(r,whoTurn2);   //在空白处填上对方棋子
             if (isWin(whoTurn2)) {  //看填上棋子后能赢否
                 chess.setCharAt(r,'K');  // 恢复原状
                    return r;
             }
             else
                  chess.setCharAt(r,'K');   //恢复原状
         }
            if (chess.charAt(4)=='K') {   //优先看中央位置
            return 4;      //占据中央,返回4
        }
            else  {
                for (int d=1;d<5;d++) {   // 随机找个空位置
                    int rand= (int)(Math.random() * 9);
                    if (chess.charAt(rand)=='K')
                    return rand;
                }
        }
       return -1;  //特殊返回
}
 
public void computerTake(){
     int x = findplace();  //根据策略找位置
     chess.setCharAt(x,whoTurn);
     b[x].setLabel(String.valueOf(whoTurn));
     gameOver();    
     whoTurn = (whoTurn=='O') ? 'X' : 'O';
}
 
public void gameOver() {
   if (isWin(whoTurn)) { //判是否取胜
       JOptionPane.showMessageDialog(null, whoTurn+" win!");
       System.exit(0);
    } else if (isFull()) { //判是否下满格子
       JOptionPane.showMessageDialog(null, "game is over!");
       System.exit(0);
    }
 }
 
public boolean isWin(char who){   
   String s3 = "" + who + who + who;
   String sum;   
   String sum1;
   String sum2;//用来拼接一个方向的棋子标识
   for(int k=0;k<3;k++)
   {
       sum1=""+chess.charAt(k)+chess.charAt(k+3)+chess.charAt(k+6);//垂直方向
       sum2=""+chess.charAt(k*3+0)+chess.charAt(k*3+1)+chess.charAt(k*3+2);//水平方向
       if(sum1.equals(s3)||sum2.equals(s3))
       {
           return true;
       }
       else
       {
           sum1="";
           continue;
       }
    }
   sum=""+chess.charAt(0)+chess.charAt(4)+chess.charAt(8); //正对角线
   if (sum.equals(s3)) return true;
   sum=""+chess.charAt(2)+chess.charAt(4)+chess.charAt(6); //反对角线
   if (sum.equals(s3)) return true;
   return false;
}
 
public boolean isFull() {  //判是否棋盘下满了
   return chess.toString().indexOf("K")== -1;
}
 
public static void main(String args[]) {
    Frame f = new Frame();
    f.add(new ChessDemo());
    f.setSize(300,300);
    f.setVisible(true); 
}
}

结果如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • FastJson踩坑:@JsonField在反序列化时失效的解决

    FastJson踩坑:@JsonField在反序列化时失效的解决

    这篇文章主要介绍了FastJson踩坑:@JsonField在反序列化时失效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 封装了一个Java数据库访问管理类

    封装了一个Java数据库访问管理类

    刚刚试着用JDBC,仿着原来C#的写法写了这段代码,自己觉得还是挺粗糙的,还烦请路过的朋友推荐一个写得较好较完整的相关例程以便学习。谢谢!
    2009-02-02
  • SpringMVC架构的项目 js,css等静态文件导入有问题的解决方法

    SpringMVC架构的项目 js,css等静态文件导入有问题的解决方法

    下面小编就为大家带来一篇SpringMVC架构的项目 js,css等静态文件导入有问题的解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Java ArrayList 实现实例讲解

    Java ArrayList 实现实例讲解

    ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存。这篇文章主要介绍了java ArrayList 实现的相关资料,需要的朋友可以参考下
    2016-11-11
  • Java实现选择排序算法的实例教程

    Java实现选择排序算法的实例教程

    这篇文章主要介绍了Java实现选择排序算法的实例教程,选择排序的时间复杂度为О(n&sup2;),需要的朋友可以参考下
    2016-05-05
  • Netty框架实现TCP/IP通信的完美过程

    Netty框架实现TCP/IP通信的完美过程

    这篇文章主要介绍了Netty框架实现TCP/IP通信,这里使用的是Springboot+Netty框架,使用maven搭建项目,需要的朋友可以参考下
    2021-07-07
  • Java如何高效使用OpenCV图像处理库

    Java如何高效使用OpenCV图像处理库

    OpenCV是一个开源的计算机视觉库,它提供了一系列丰富的图像处理和计算机视觉算法,包括图像读取、显示、滤波、特征检测、目标跟踪等功能,这篇文章主要给大家介绍了关于Java如何高效使用OpenCV图像处理库的相关资料,需要的朋友可以参考下
    2024-03-03
  • Java如何实现通过证书访问Https请求

    Java如何实现通过证书访问Https请求

    这篇文章主要介绍了Java如何实现通过证书访问Https请求,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java 在PDF中添加页面跳转按钮功能(代码演示)

    Java 在PDF中添加页面跳转按钮功能(代码演示)

    这篇文章主要介绍了Java 在PDF中添加页面跳转按钮功能,本文给大家提供了多种功能的按钮,需要的朋友可以参考下
    2019-11-11
  • 使用Jackson来实现Java对象与JSON的相互转换的教程

    使用Jackson来实现Java对象与JSON的相互转换的教程

    这篇文章主要介绍了使用Jackson来实现Java对象与JSON的互相转换的教程,文中罗列了3中Jackson的使用方式,需要的朋友可以参考下
    2016-01-01

最新评论