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的更多相关文章

  1. ArcGIS Server 10 Java 版的Rest服务手动配置方法

    Java版的Manager中发布的服务默认只发布了该服务的SOAP接口,而REST接口需要用户在信息服务器,如Tomcat. Apache.WebLogic等中手工配置.由于在Java版的Server ...

  2. PetaPojo —— JAVA版的PetaPoco

    背景 由于工作的一些原因,需要从C#转成JAVA.之前PetaPoco用得真是非常舒服,在学习JAVA的过程中熟悉了一下JAVA的数据组件: MyBatis 非常流行,代码生成也很成熟,性能也很好.但 ...

  3. 【转载】java版打字练习软件

    网上找到一个java版的打字的游戏 import java.applet.Applet; import java.applet.AudioClip; import java.awt.Dimension ...

  4. 微博地址url(id)与mid的相互转换 Java版

    原理: 新浪微博的URL都是如:http://weibo.com/2480531040/z8ElgBLeQ这样三部分. 第一部分(绿色部分)为新浪微博的域名,第二部分(红色部分)为博主Uid,第三部分 ...

  5. JCEF3——谷歌浏览器内核Java版实现(一):使用jawt获取窗体句柄

    前言 最近一段时间研究谷歌浏览器内核.谷歌浏览器内核一直开源,并维护更新,它的开源项目中内核更新速度和Chrome浏览器版本更新进度一样!而且它不同于WebKit(值得一题的是谷歌浏览器已不使用Web ...

  6. Selenium关键字驱动测试框架Demo(Java版)

    Selenium关键字驱动测试框架Demo(Java版)http://www.docin.com/p-803493675.html

  7. 第九篇 :微信公众平台开发实战Java版之如何实现自定义分享内容

    第一部分:微信JS-SDK介绍 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统 ...

  8. 第八篇 :微信公众平台开发实战Java版之如何网页授权获取用户基本信息

    第一部分:微信授权获取基本信息的介绍 我们首先来看看官方的文档怎么说: 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域 ...

  9. 第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息

    在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同). 公众号可通过本接口来根据O ...

随机推荐

  1. 数据结构自己实现——Tree and Forest

    //中D序??遍???历???二t叉?树??? //先??序??遍???历???二t叉?树??? //后??序??遍???历???二t叉?树??? #include <iostream> ...

  2. 彻底删除node_modules文件

    npm install rimraf -g rimraf node_modules

  3. 证书锁定Certificate Pinning技术

    证书锁定Certificate Pinning技术   在中间人攻击中,攻击主机通常截断客户端和服务器的加密通信.攻击机以自己的证书替代服务器发给客户端的证书.通常,客户端不会验证该证书,直接接受该证 ...

  4. OpenLDAP给我的启发

    首先这篇文章没什么技术性,但亮点是:我会给广大运维同行提一点建议,这个一点仅仅是一点,而不是很多点. 年前计划深度掌握一些诸如:Jenkins.Gitlab.ELK.k8s等的软件,但学着学着总是想学 ...

  5. Loj #125. 除数函数求和(2)

    link : https://loj.ac/problem/125 分块calc即可. #include<bits/stdc++.h> #define ll long long using ...

  6. K&R——第五章 指针与数组

    #include <stdio.h> #define maxsize 5000 char buf[maxsize]; char *head = buf; char *new(int siz ...

  7. JDK/Java SE官方文档汇总

    JDK一般是指Java SE. 1.5:https://docs.oracle.com/javase/1.5.0/docs/ 6:https://docs.oracle.com/javase/6/do ...

  8. Android view 数据缓存

    Android中经常需要用到view数据的缓存,比如我们希望EditText 在被切到别的界面的时候,输入的数据要仍保持不变. 参考代码: /* 缓存textview */ public class ...

  9. UITableViewCell -- 动画

    -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath: ...

  10. EasyMvc入门教程-基本控件说明(9)引言导航

    休息片刻后,继续开工... 这次我们继续学习引言导航,引言导航主要用于知识点的开始,起到知识点导航的作用.直接例子: 实现代码如下: @Html.Q().BlockRef().Title(" ...