Java版TicTacToe
MainFrame.java
package com.bu_ish; import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel; public class MainFrame extends JFrame { private Cell[][] cells;
private JLabel statusLabel;
private JButton startButton;
private char whoseTurn;
private boolean isStarted; private MainFrame(String title) {
super(title);
setSize(360, 360);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
JPanel mainPanel = new JPanel(new GridLayout(3, 3));
cells = new Cell[3][3];
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j) {
cells[i][j] = new Cell();
mainPanel.add(cells[i][j]);
}
}
mainPanel.setVisible(true);
add(mainPanel);
JPanel statusPanel = new JPanel(new BorderLayout());
statusLabel = new JLabel();
statusLabel.setHorizontalAlignment(JLabel.CENTER);
statusPanel.add(statusLabel);
startButton = new JButton("开始");
statusPanel.add(startButton, BorderLayout.EAST);
add(statusPanel, BorderLayout.SOUTH);
startButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
String text = startButton.getText();
if (text.equals("开始") || text.equals("重新开始")) {
startButton.setText("已开始");
startButton.setEnabled(false);
statusLabel.setText("O先行");
whoseTurn = 'O';
isStarted = true;
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j) {
cells[i][j].clear();
}
}
}
}
});
} private boolean isWon() {
for (int i = 0; i < 3; ++i) {
if (cells[i][0].getToken() == whoseTurn && cells[i][1].getToken() == whoseTurn && cells[i][2].getToken() == whoseTurn) {
return true;
}
}
for (int j = 0; j < 3; ++j) {
if (cells[0][j].getToken() == whoseTurn && cells[1][j].getToken() == whoseTurn && cells[2][j].getToken() == whoseTurn) {
return true;
}
}
if (cells[0][0].getToken() == whoseTurn && cells[1][1].getToken() == whoseTurn && cells[2][2].getToken() == whoseTurn) {
return true;
}
if (cells[2][0].getToken() == whoseTurn && cells[1][1].getToken() == whoseTurn && cells[0][2].getToken() == whoseTurn) {
return true;
}
return false;
} private boolean isFull() {
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j) {
if (cells[i][j].getToken() == ' ') {
return false;
}
}
}
return true;
} private class Cell extends JPanel { private char token = ' ';
private boolean isTokenSet; private Cell() {
setBackground(Color.BLACK);
setBorder(BorderFactory.createLineBorder(Color.WHITE));
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
if (isStarted) {
setToken(whoseTurn);
if (isWon()) {
statusLabel.setText(whoseTurn + "胜利!游戏结束^_^");
isStarted = false;
startButton.setText("重新开始");
startButton.setEnabled(true);
} else {
if (isFull()) {
statusLabel.setText("平局!游戏结束^_^");
isStarted = false;
startButton.setText("重新开始");
startButton.setEnabled(true);
} else {
whoseTurn = whoseTurn == 'O' ? 'X' : 'O';
statusLabel.setText("轮到" + whoseTurn + "行");
}
}
}
}
});
} @Override
public void paint(Graphics g) {
super.paint(g);
if (isTokenSet) {
g.setColor(Color.WHITE);
if (token == 'O') {
g.drawOval(10, 10, getWidth() - 20, getHeight() - 20);
} else {
int x = getWidth() - 10;
int y = getHeight() - 10;
g.drawLine(10, 10, x, y);
g.drawLine(x, 10, 10, y);
}
}
} private void setToken(char token) {
repaint();
this.token = token;
isTokenSet = true;
} private char getToken() {
return token;
} private void clear() {
isTokenSet = false;
token = ' ';
repaint();
}
} public static void main(String[] args) {
new MainFrame("TicTacToe").setVisible(true);
}
}
Java版TicTacToe的更多相关文章
- ArcGIS Server 10 Java 版的Rest服务手动配置方法
Java版的Manager中发布的服务默认只发布了该服务的SOAP接口,而REST接口需要用户在信息服务器,如Tomcat. Apache.WebLogic等中手工配置.由于在Java版的Server ...
- PetaPojo —— JAVA版的PetaPoco
背景 由于工作的一些原因,需要从C#转成JAVA.之前PetaPoco用得真是非常舒服,在学习JAVA的过程中熟悉了一下JAVA的数据组件: MyBatis 非常流行,代码生成也很成熟,性能也很好.但 ...
- 【转载】java版打字练习软件
网上找到一个java版的打字的游戏 import java.applet.Applet; import java.applet.AudioClip; import java.awt.Dimension ...
- 微博地址url(id)与mid的相互转换 Java版
原理: 新浪微博的URL都是如:http://weibo.com/2480531040/z8ElgBLeQ这样三部分. 第一部分(绿色部分)为新浪微博的域名,第二部分(红色部分)为博主Uid,第三部分 ...
- JCEF3——谷歌浏览器内核Java版实现(一):使用jawt获取窗体句柄
前言 最近一段时间研究谷歌浏览器内核.谷歌浏览器内核一直开源,并维护更新,它的开源项目中内核更新速度和Chrome浏览器版本更新进度一样!而且它不同于WebKit(值得一题的是谷歌浏览器已不使用Web ...
- Selenium关键字驱动测试框架Demo(Java版)
Selenium关键字驱动测试框架Demo(Java版)http://www.docin.com/p-803493675.html
- 第九篇 :微信公众平台开发实战Java版之如何实现自定义分享内容
第一部分:微信JS-SDK介绍 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统 ...
- 第八篇 :微信公众平台开发实战Java版之如何网页授权获取用户基本信息
第一部分:微信授权获取基本信息的介绍 我们首先来看看官方的文档怎么说: 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域 ...
- 第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息
在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同). 公众号可通过本接口来根据O ...
随机推荐
- Device Tree Usage 【转】
转自:http://blog.chinaunix.net/uid-20522771-id-3457184.html 原文链接:http://devicetree.org/Device_Tree_Usa ...
- 致命错误:ext/standard/php_smart_str.h:没有那个文件或目录
致命错误:ext/standard/php_smart_str.h:没有那个文件或目录 参考文章:https://blog.csdn.net/jartins/article/details/80371 ...
- js-(19,999,999.00)
function price(n, precision) { let s = String(n), int = parseInt(n).toString(), pre = s.split('.')[1 ...
- ML | k-means
what's xxx k-means clustering aims to partition n observations into k clusters in which each observa ...
- make makefile cmake qmake都是什么,有什么区别
原文:https://www.zhihu.com/question/27455963 作者:玟清链接:https://www.zhihu.com/question/27455963/answer/36 ...
- Please configure Spring facet or use 'Create Default Context' to add one including all unmapped files.
有时候我们刚进入 Intellij IDEA时会出现这样一个情况,原因是IDEA没有找到spring的配置文件,我们需要添加spring文件给idea管理 参考: 1.https://www.jetb ...
- Ubuntu切换至root错误:su:Authentication failure解决
当前用户切换到root出现这个错误的原因是没有创建root用户,解决如下: 1.打开终端,输入命令sudo passwd root 会提示输入新的用户密码,输入后会再确认一次,成功后会显示:passw ...
- Redis Sentinel 情况下bind地址设置
Redis Sentinel 情况下bind地址设置 1个master,2个slave,3个sentinel的情况下,注意bind地址的时候不要写0.0.0.0,会导致绑定多个地址, 然后sentin ...
- 如何使用Medieval CUE Splitter分割ape,合并ape,制作cue
1 下载并运行这个软件,点击打开CUE文件,然后找到需要打开的CUE文件. 2 软件会立即弹出一个再次要求打开APE文件的对话框.打开之后会发现APE音乐已经被分割成了一小段一小段. 3 点击 ...
- Git命令学习总结(-)
入职的第一天,让git命令直接给难住了,汗!使用习惯可视化的工具对于命令行早就忘记的一干二净.还好,回家自己练习一下,总会没有错的.git就不做简介了,版本管理除了svn就是git了,其他的都无所谓了 ...