Java编写实现九宫格应用
作者:shihao9895 时间:2021-12-22 21:01:06
本文实例为大家分享了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);?
}
}
结果如下:
来源:https://blog.csdn.net/shihao9895/article/details/84797809
标签:java,九宫格
0
投稿
猜你喜欢
使用maven profile指定配置文件打包适用多环境的方法
2022-06-30 03:49:11
Java 中HttpURLConnection附件上传的实例详解
2022-05-26 13:54:39
Unity排行榜优化滚动效果
2021-09-08 13:02:07
android Jsoup获取网站内容 android获取新闻标题实例
2021-09-24 22:56:03
java 内部类(匿名类,匿名对象,静态内部类)详解及实例
2022-09-25 11:20:16
SpringBoot之使用Redis实现分布式锁(秒杀系统)
2022-09-30 15:45:08
Mybatis selectKey 如何返回新增用户的id值
2022-07-14 05:10:38
android 将图片压缩到指定的大小的示例
2021-07-29 23:09:23
IISExpress 配置允许外部访问详细介绍
2023-08-02 02:18:10
Java线程同步Lock同步锁代码示例
2023-11-17 13:23:54
SpringMVC解析JSON请求数据问题解析
2023-06-02 21:41:32
C# TrieTree介绍及实现方法
2022-02-10 22:04:53
SpringSecurity+Redis认证过程小结
2021-07-21 11:38:11
C#操作进程的方法介绍
2022-10-27 10:10:18
Android使用httpPost向服务器发送请求的方法
2021-12-08 19:37:07
java 判断两个对象是否为同一个对象实例代码
2022-09-19 22:31:35
java 线程的生命周期详解
2023-05-28 08:32:25
Java手动实现Redis的LRU缓存机制
2023-07-31 12:51:30
IntelliJ IDEA 中使用jRebel进行 Java 热部署教程图解
2023-04-20 19:23:42
WPF的ListView控件自定义布局用法实例
2021-09-04 12:15:45