Java Swing井字游戏

大家好! 哇,自从我在这里发布了东西以来已经有一段时间了! 我必须说我真的很想写东西,而且我保证我不会再陷入“作家的障碍”。 希望 :) ..最近两个月发生了很多事情,我有很多话要说。 但是在这篇文章中,我只是要发布我之前写的一个小应用程序。 它是一个TicTacToe游戏应用程序。 从这个特定的程序中学到的东西不多,但是我真的想摆脱这种僵局,因此我今天就发布这个。

我实际上写了这段代码是为了向我的一位朋友展示Java的一些非常酷的功能,这些朋友也以“ C ++”风格编写了相同的应用程序。 而且我的那个朋友甚至为计算机播放器开发了代码。 但是在完成他的代码后,他可悲地意识到了一个基本事实,即如果你玩的很好,你将无法在井字游戏中获胜! 呵呵 :D 所以我没有冒险进入那个领域。 老实说,我对编写AI应用程序并不感兴趣。 但由于我喜欢网络编程,因此我想到了向该应用程序添加网络多人游戏功能。 但是很遗憾,我还没有时间这样做。
Anywaiz应用程序的工作方式如下-游戏启动后即自动启动,状态栏指示现在轮到哪个玩家,剩下的只是简单的玩法! 在游戏结束时,该应用程序将自动重置。 进入代码。

import javax.swing.*;import java.awt.*;
import java.awt.event.*;
import java.util.logging.Logger;/**
* TicTacToe Application
* @author Steve Robinson
* @version 1.0
*/class TicTacToeFrame extends JFrame
{JButton [][] buttons= new JButton[3][3];JTextField statusBar;GamePanel panel;Integer turn;GameListener listener=new GameListener();Integer count;public TicTacToeFrame(){setLayout(new BorderLayout());panel=new GamePanel();add(panel,BorderLayout.CENTER);statusBar=new JTextField("Player1's Turn");statusBar.setEditable(false);add(statusBar,BorderLayout.SOUTH);setTitle("Tic Tac Toe!");setVisible(true);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(400,400,300,300);}class GamePanel extends JPanel{public GamePanel(){setLayout(new GridLayout(3,3));turn =1;count=0;for(int i=0;i<3;i++)for(int j=0;j<3;j++)   {buttons[i][j]=new JButton();buttons[i][j].putClientProperty("INDEX", new Integer[]{i,j});buttons[i][j].putClientProperty("OWNER", null);buttons[i][j].addActionListener(listener);add(buttons[i][j]);}}}class GameListener implements ActionListener{public void actionPerformed(ActionEvent e){count++;JButton b=(JButton)e.getSource();Integer[]index=(Integer[]) b.getClientProperty("INDEX");//System.out.println(turn); //turn                  //   //System.out.println("["+index[0]+"]"+"["+index[1]+"]");         //b.putClientProperty("OWNER", turn);Icon ico=new ImageIcon(turn.toString()+".gif");b.setIcon(ico);b.setEnabled(false);boolean result=checkVictoryCondition(index);if(result){JOptionPane.showMessageDialog(null, "Player "+turn.toString()+" Wins");initComponents();}else{if(turn==1){turn=2;statusBar.setText("Player2's Turn");}else{turn=1;statusBar.setText("Player1's Turn");}}if(count==9){JOptionPane.showMessageDialog(null, "Match is a draw!");initComponents();}}Integer getOwner(JButton b){return (Integer)b.getClientProperty("OWNER");}//PrintButtonMap for Diagnosticsvoid printbuttonMap(Integer [][]bMap){for(int i=0;i    for(int j=0;j     System.out.print(bMap[i][j]+" ");System.out.println("");}}boolean checkVictoryCondition(Integer [] index){/*Integer[][]buttonMap=new Integer[][] {{ getOwner(buttons[0][0]),getOwner(buttons[0][1]),getOwner(buttons[0][2])},{ getOwner(buttons[1][0]),getOwner(buttons[1][1]),getOwner(buttons[1][2])},{ getOwner(buttons[2][0]),getOwner(buttons[2][1]),getOwner(buttons[2][2])}};printbuttonMap(buttonMap); */Integer a=index[0];Integer b=index[1];int i;//check rowfor(i=0;i<3;i++)  {if(getOwner(buttons[a][i])!=getOwner(buttons[a][b]))break;}if(i==3)return true;//check columnfor(i=0;i<3;i++)  {if(getOwner(buttons[i][b])!=getOwner(buttons[a][b]))break;}if(i==3)return true;//check diagonalif((a==2&&b==2)||(a==0&&b==0)||(a==1&&b==1)||(a==0&&b==2)||(a==2&&b==0)){//left diagonalfor(i=0;i     if(getOwner(buttons[i][i])!=getOwner(buttons[a][b]))break;if(i==3)return true;//right diagonalif((getOwner(buttons[0][2])==getOwner(buttons[a][b]))&&(getOwner(buttons[1][1])==getOwner(buttons[a][b]))&&(getOwner(buttons[2][0])==getOwner(buttons[a][b])))return true;}return false;}}void initComponents(){for(int i=0;i<3;i++)   for(int j=0;j<3;j++)  {buttons[i][j].putClientProperty("INDEX", new Integer[]{i,j});buttons[i][j].putClientProperty("OWNER",null);buttons[i][j].setIcon(null);buttons[i][j].setEnabled(true);turn=1;count=0;statusBar.setText("Player1's Turn");}}}class TicTacToe {public static void main(String[] args) {EventQueue.invokeLater(new Runnable(){public void run(){TicTacToeFrame frame=new TicTacToeFrame();}});}}

该代码非常简单。 香港专业教育学院在按钮中使用两个属性来存储一些信息,用于检查获胜条件。 一个是“ OWNER”属性,它指示哪个用户当前拥有该正方形,而“ INDEX”属性则指示该正方形在网格中的索引(即[1,1],[1,2]…等)一个正方形,将更新OWNER属性,并使用所有按钮的OWNER属性检查victoryCondition。 其余代码不言自明。
为第二个播放器添加键盘支持是一件非常容易的事。 正如他们所说的…“我把它留作练习”! 哈哈哈 :D 好吧,我真的希望我能花些时间,以便可以为该应用程序添加网络功能。

干杯,

史蒂夫。
-
我忘记附加将由应用程序使用的图像图标文件。 你可以在这里下载 http://www.mediafire.com/?d7d93v2342dxind 只需将内容提取到包含代码的文件夹中即可。 感谢我的朋友“ Gur Png”告诉我这件事。

参考:来自我们JCG合作伙伴的 Java TicTacToe   Footy'n'Tech博客上的Steve Robinson。


翻译自: https://www.javacodegeeks.com/2012/02/java-swing-tic-tac-toe.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373275.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java小青蛙跳台街,算法-青蛙跳台阶详解

/*[跳台阶][题目]一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。[解析]与斐波那契数列的求解过程类似。典型的动态规划问题。对于第 n 级台阶&#xff0c;我们可以从第 n-1 级台阶一步到达&#xff0c;也可以从第 n-2 级…

apache服务器配置Net的实践

前置&#xff1a; 在xp系统中&#xff0c;打补丁之类或啥子操作引起或多或少的问题&#xff0c;最终导致iis不能使用&#xff1b; 不想装系统...忍着... 最近突发事件导致&#xff0c;需要摸一下apache服务器处理&#xff0c;好吧&#xff0c;那就搜索下吧..... 目标&#xff1…

TestNG或JUnit

多年以来&#xff0c;无论何时使用Java代码进行单元测试&#xff0c;我始终会回到TestNG。 每当我拿起TestNG时&#xff0c;人们都问我为什么要继续使用TestNG&#xff0c;尤其是默认开发环境&#xff08;例如Eclipse或Maven&#xff09;提供的JUnit时。 继续进行同样的战斗&am…

event php,PHP event 事件机制

/** PHP 事件机制*/class baseClass{private $_e;public function __set($name,$value){if( strncasecmp($name,"on",2) 0 ){if(!isset($this->_e[$name]))$this->_e[$name] array();return array_push($this->_e[$name] , $value);}}public function __g…

Android JNI编程(五)——C语言的静态内存分配、动态内存分配、动态创建数组...

版权声明&#xff1a;本文出自阿钟的博客&#xff0c;转载请注明出处:http://blog.csdn.net/a_zhon/。 目录(?)[] 一&#xff1a;什么是静态内存什么又是动态内存呢&#xff1f; 静态内存&#xff1a;是指在程序开始运行时由编译器分配的内存&#xff0c;它的分配是在程序开始…

Visual Studio-C#-20160411

函数的四个要素包括&#xff1a;名称&#xff0c;输入&#xff0c;输出&#xff0c;加工 注释的方式&#xff1a;//只注释一行&#xff1b;/**/注释一段区域&#xff1b; namespace ConsoleApplication6 ---------//命名空间{ class Program ---------------------------//类…

配置MyBatis 3

MyBatis是一个非常流行且也是最有效的SQL映射框架。 MyBatis可用于Java和.net语言。 MyBatis并不是Hibernate的真正替代品&#xff0c;但是我们可以使用该框架来减少MyBatis提供的高效和高性能的数据库相关代码。 本教程将向您展示使用数据库配置MyBatis 3的步骤。 MyBatis 3支…

php获取src,PHP读取文件

本文概述PHP提供了各种功能来从文件读取数据。有多种功能允许你读取所有文件数据, 逐行读取数据以及逐字符读取数据。下面提供了可用的PHP文件读取功能。fread()fgets()fgetc()PHP读取文件-fread()PHP fread()函数用于读取文件的数据。它需要两个参数&#xff1a;文件资源和文件…

HDOJ(HDU) 1406 完数

Problem Description 完数的定义&#xff1a;如果一个大于1的正整数的所有因子之和等于它的本身&#xff0c;则称这个数是完数&#xff0c;比如6&#xff0c;28都是完数&#xff1a;6123&#xff1b;28124714。 本题的任务是判断两个正整数之间完数的个数。 Input 输入数据包…

Allegro padstack

在ALLEGRO中&#xff0c;建立PCB封装是一件挺复杂的事&#xff0c;而要建立FOOTPRINT&#xff0c;首先要有一个PAD&#xff0c;所以就要新建PADSTACK。 焊盘可以分两种&#xff0c;表贴焊盘和通孔焊盘&#xff0c;表贴焊盘结构相对简单&#xff0c;下面首先分析表贴焊盘的成分&…

java中datetime类型转换,Java中日期格式和其他类型转换详解

涉及的核心类&#xff1a;Date类、SimpleDateFormat类、Calendar类一、Date型与long型Date型转换为long型Date date new Date();//取得当前时间Date类型long date2long date.getTime();//Date转longlong型转换为Date型long cur System.currentTimeMills();//取得当前时间lon…

GWT MVP变得简单

GWT Model-View-Presenter是用于大规模应用程序开发的设计模式。 它源于MVC&#xff0c;它在视图和逻辑之间进行划分&#xff0c;并有助于创建结构良好&#xff0c;易于测试的代码。 为了帮助像我这样的懒惰开发人员&#xff0c;我研究了如何减少使用声明式UI时要编写的类和接口…

php如何编写通信协议,定制通讯协议

## 如何定制协议实际上制定自己的协议是比较简单的事情。简单的协议一般包含两部分:* 区分数据边界的标识* 数据格式定义## 一个例子### 协议定义这里假设区分数据边界的标识为换行符"\n"(注意请求数据本身内部不能包含换行符)&#xff0c;数据格式为Json&#xff0c…

今年计划要看的书全部备齐

上个月购买的书《今年计划看的书其中几本》 http://www.cnblogs.com/insus/p/5325513.html 昨天购买的书回来了&#xff0c;今年计划要看的书全部备齐。《MongoDB》&#xff0c;《深入理解Bootstarp》和《ASP.NETSignalR编程实践》…… 转载于:https://www.cnblogs.com/in…

Codevs 2756 树上的路径

2756 树上的路径 时间限制: 3 s    空间限制: 128000 KB    题目等级 : 大师 Master题目描述 Description给出一棵树&#xff0c;求出最小的k&#xff0c;使得&#xff0c;且在树中存在路径P&#xff0c;使得k> S 且 k <E. &#xff08;k为路径P上的边的权值和&a…

图形教程

众所周知&#xff0c;我们可以借助Java库制作游戏&#xff0c;这些库为我们提供制作游戏所需的图形。 因此&#xff0c;今天我将开始一个关于Java图形的非常新的部分。 我之前曾发表过有关如何制作所得税计算器的文章 。 首先要满足一些先决条件&#xff1a; -您应该对Java语法…

文件上传预览

<fieldset><legend>使用readAsDataUrl()方法预览图片</legend><input type"file" name"fileUpload" id"fileUpload" onchange"filePrevImg(this.files);" multiple"true" /><ul id"prevUpl…

c++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast

一、介绍 dynamic_cast: 通常在基类和派生类之间转换时使用const_cast: 主要针对const和volatile的转换static_cast: 一般的转换(no run-time check)通常&#xff0c;如果你不知道该用哪个&#xff0c;就用这个。 reinterpret_cast: 用于进行没有任何关联之间的转换&…

K8S Pod Terminating/Unknown故障排查

一、pod异常出现现象 优雅终止周期(Graceful termination period): 当pod被删除时&#xff0c;会进入"Terminating"状态&#xff0c;等待容器优雅关闭。如果容器关闭所需时间超过默认期限(默认30秒)&#xff0c;则pod将保持在"Terminating"状态。 Finalize…

矩阵指数 matlab,矩阵指数 - MATLAB Simulink Example - MathWorks 中国

方法 1&#xff1a;加权平方expmdemo1 是以下著作中算法 11.3.1 的实现&#xff1a;Golub, Gene H. and Charles Van Loan.Matrix Computations, 3rd edition.Baltimore, MD:Johns Hopkins University Press, 1996.% Scale A by power of 2 so that its norm is < 1/2 .[f,e…