热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaSwing井字游戏

大家好!哇,自从我在这里发布了东西以来已经有一段时间了!我必须说我真的很想写东西,而且我保证我不会再陷入“作家的障碍”。希望
大家好! 哇,自从我在这里发布了东西以来已经有一段时间了! 我必须说我真的很想写东西,而且我保证我不会再陷入“作家的障碍”。 希望 :) ..最近两个月发生了很多事情,我有很多话要说。 但是在这篇文章中,我只是要发布我之前写的一个小应用程序。 它是一个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&#61; new JButton[3][3];JTextField statusBar;GamePanel panel;Integer turn;GameListener listener&#61;new GameListener();Integer count;public TicTacToeFrame(){setLayout(new BorderLayout());panel&#61;new GamePanel();add(panel,BorderLayout.CENTER);statusBar&#61;new JTextField("Player1&#39;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 &#61;1;count&#61;0;for(int i&#61;0;i<3;i&#43;&#43;)for(int j&#61;0;j<3;j&#43;&#43;) {buttons[i][j]&#61;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&#43;&#43;;JButton b&#61;(JButton)e.getSource();Integer[]index&#61;(Integer[]) b.getClientProperty("INDEX");//System.out.println(turn); //turn // //System.out.println("["&#43;index[0]&#43;"]"&#43;"["&#43;index[1]&#43;"]"); //b.putClientProperty("OWNER", turn);Icon ico&#61;new ImageIcon(turn.toString()&#43;".gif");b.setIcon(ico);b.setEnabled(false);boolean result&#61;checkVictoryCondition(index);if(result){JOptionPane.showMessageDialog(null, "Player "&#43;turn.toString()&#43;" Wins");initComponents();}else{if(turn&#61;&#61;1){turn&#61;2;statusBar.setText("Player2&#39;s Turn");}else{turn&#61;1;statusBar.setText("Player1&#39;s Turn");}}if(count&#61;&#61;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&#61;0;i for(int j&#61;0;j System.out.print(bMap[i][j]&#43;" ");System.out.println("");}}boolean checkVictoryCondition(Integer [] index){/*Integer[][]buttonMap&#61;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&#61;index[0];Integer b&#61;index[1];int i;//check rowfor(i&#61;0;i<3;i&#43;&#43;) {if(getOwner(buttons[a][i])!&#61;getOwner(buttons[a][b]))break;}if(i&#61;&#61;3)return true;//check columnfor(i&#61;0;i<3;i&#43;&#43;) {if(getOwner(buttons[i][b])!&#61;getOwner(buttons[a][b]))break;}if(i&#61;&#61;3)return true;//check diagonalif((a&#61;&#61;2&&b&#61;&#61;2)||(a&#61;&#61;0&&b&#61;&#61;0)||(a&#61;&#61;1&&b&#61;&#61;1)||(a&#61;&#61;0&&b&#61;&#61;2)||(a&#61;&#61;2&&b&#61;&#61;0)){//left diagonalfor(i&#61;0;i if(getOwner(buttons[i][i])!&#61;getOwner(buttons[a][b]))break;if(i&#61;&#61;3)return true;//right diagonalif((getOwner(buttons[0][2])&#61;&#61;getOwner(buttons[a][b]))&&(getOwner(buttons[1][1])&#61;&#61;getOwner(buttons[a][b]))&&(getOwner(buttons[2][0])&#61;&#61;getOwner(buttons[a][b])))return true;}return false;}}void initComponents(){for(int i&#61;0;i<3;i&#43;&#43;) for(int j&#61;0;j<3;j&#43;&#43;) {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&#61;1;count&#61;0;statusBar.setText("Player1&#39;s Turn");}}}class TicTacToe {public static void main(String[] args) {EventQueue.invokeLater(new Runnable(){public void run(){TicTacToeFrame frame&#61;new TicTacToeFrame();}});}}

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

干杯&#xff0c;

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

参考&#xff1a;来自我们JCG合作伙伴的 Java TicTacToe   Footy&#39;n&#39;Tech博客上的Steve Robinson。


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



推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 移动端常用单位——rem的使用方法和注意事项
    本文介绍了移动端常用的单位rem的使用方法和注意事项,包括px、%、em、vw、vh等其他常用单位的比较。同时还介绍了如何通过JS获取视口宽度并动态调整rem的值,以适应不同设备的屏幕大小。此外,还提到了rem目前在移动端的主流地位。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 基于移动平台的会展导游系统APP设计与实现的技术介绍与需求分析
    本文介绍了基于移动平台的会展导游系统APP的设计与实现过程。首先,对会展经济和移动互联网的概念进行了简要介绍,并阐述了将会展引入移动互联网的意义。接着,对基础技术进行了介绍,包括百度云开发环境、安卓系统和近场通讯技术。然后,进行了用户需求分析和系统需求分析,并提出了系统界面运行流畅和第三方授权等需求。最后,对系统的概要设计进行了详细阐述,包括系统前端设计和交互与原型设计。本文对基于移动平台的会展导游系统APP的设计与实现提供了技术支持和需求分析。 ... [详细]
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
  • Java图形化计算器设计与实现
    本文介绍了使用Java编程语言设计和实现图形化计算器的方法。通过使用swing包和awt包中的组件,作者创建了一个具有按钮监听器和自定义界面尺寸和布局的计算器。文章还分享了在图形化界面设计中的一些心得体会。 ... [详细]
  • 今天就跟大家聊聊有关怎么在Android应用中实现一个换肤功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根 ... [详细]
  • 第一步:PyQt4Designer设计程序界面该部分设计类同VisvalStudio内的设计,改下各部件的objectName!设计 ... [详细]
author-avatar
漂漂雪飘飘业_348
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有