Java小项目(井字棋游戏)
一:概述
其中使用了一些简单的Java swing知识。若是不会Java swing的一些知识,那此代码看起来可能会有一些困难。主要就是点击按钮(9个),每次会切换成另外一个玩家。
思路:
首先我们要有一个井字棋的页面,采用的就是创建两个JPanel:一个为最上面的标题(用于提示该哪个用户点击),
一个为设置的9个面板,可以理解为棋盘吧。 O 和 X 获胜的情况都为8种,已经写在
check()
方法中,请自行查看。
二:代码
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
public class Main {
public static void main(String[] args) {
new TicTacToe();
}
}
class TicTacToe implements ActionListener{
// 产生伪随机数的流
Random random = new Random();
JFrame frame = new JFrame();
JPanel title_panel = new JPanel(); // 标题面板
JPanel button_panel = new JPanel(); // 按钮面板
JLabel textfield = new JLabel(); // 显示字的,要加在标题面板中
JButton[] button = new JButton[9]; // 9个按钮用于画9公格
Boolean player1_true;
int sum; // 用于判断是否平局
TicTacToe(){
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 设置宽高
frame.setSize(1000,1000);
frame.getContentPane().setBackground(new Color(50,50,50));
frame.setLayout(new BorderLayout()); // 使用的是边框布局
frame.setVisible(true); // 设置Jframe可见
// 设置字体
textfield.setBackground(new Color(25,25,25));
textfield.setForeground(new Color(0,255,0));
textfield.setFont(new Font("楷体",Font.BOLD,75)); // 字体的名称
textfield.setHorizontalAlignment(JLabel.CENTER);
textfield.setText("Tic-Tic");
textfield.setOpaque(true);// 透明处理
title_panel.setLayout(new BorderLayout());
title_panel.setBounds(0,0,800,100);
// 按钮面板,设置为3*3的表格布局
button_panel.setLayout(new GridLayout(3,3));
button_panel.setBackground(new Color(150,150,150));
// 按钮组处理
for(int i= 0;i<9;i++){
button[i] = new JButton();
button_panel.add(button[i]);
button[i].setFont(new Font("楷体",Font.BOLD,120));
// 可聚焦
button[i].setFocusable(false);
button[i].addActionListener(this);
}
title_panel.add(textfield); // JLabel 中显示字体的添加到面板中去
frame.add(title_panel,BorderLayout.NORTH); // 把标题面板添加到JFrame的北
frame.add(button_panel);
firstTurn();
}
// 按钮点击事件,玩家点击一次,给按钮设置文字(setText())
public void actionPerformed(ActionEvent e){
for(int i = 0;i<9;i++){
if(e.getSource() == button[i]){
if(player1_true){
if(button[i].getText() == ""){
button[i].setForeground(new Color(255,0,0)); // 前景颜色(X),红
button[i].setText("X");
player1_true = false;
textfield.setText("O 选手");
sum++;
// 平局
if(sum == 9){
textfield.setText("平局");
}
check(); // 测试
}
}else{
// 如果这个按钮是空的,则
if(button[i].getText() == ""){
button[i].setForeground(new Color(0,0,255)); // 前景颜色(O),蓝色
button[i].setText("O");
player1_true = true;
textfield.setText("X 选手");
sum++;
if(sum == 9){
textfield.setText("平局");
}
check();
}
}
}
}
}
public void firstTurn(){
// 使用线程,让程序休眠1S后,在开始让玩家开始操作
/*try{
Thread.sleep(1000);
}catch(Exception e){
System.out.println("睡眠这个有错误");
}*/
if(random.nextInt(2) == 0){
player1_true = true;
textfield.setText("X 选手");
}else{
player1_true = false;
textfield.setText("O 选手");
}
}
/**
点击按钮获取到按钮上的字是否和 s1 或者 s2相等,check()方法把 X Y 获胜的所有情况都给排列出来了。
X和Y个子获胜的8种情况
*/
public void check(){
// 如果X获胜,
String s1 = "X";
String s2 = "O";
if(
(button[0].getText().equals(s1)) &&
(button[1].getText().equals(s1)) &&
(button[2].getText().equals(s1))
){
xWins(0,1,2);
}
if(
(button[3].getText().equals(s1)) &&
(button[4].getText().equals(s1)) &&
(button[5].getText().equals(s1))
){
xWins(3,4,5);
}
if(
(button[6].getText().equals(s1)) &&
(button[7].getText().equals(s1)) &&
(button[8].getText().equals(s1))
){
xWins(6,7,8);
}
if(
(button[0].getText().equals(s1)) &&
(button[3].getText().equals(s1)) &&
(button[6].getText().equals(s1))
){
xWins(0,3,6);
}
if(
(button[1].getText().equals(s1)) &&
(button[4].getText().equals(s1)) &&
(button[7].getText().equals(s1))
){
xWins(1,4,7);
}
if(
(button[2].getText().equals(s1)) &&
(button[5].getText().equals(s1)) &&
(button[8].getText().equals(s1))
){
xWins(2,5,8);
}
if(
(button[0].getText().equals(s1)) &&
(button[4].getText().equals(s1)) &&
(button[8].getText().equals(s1))
){
xWins(0,4,8);
}
if(
(button[2].getText().equals(s1)) &&
(button[4].getText().equals(s1)) &&
(button[6].getText().equals(s1))
){
xWins(2,4,6);
}
// 如果是O获胜
if(
(button[0].getText().equals(s2)) &&
(button[1].getText().equals(s2)) &&
(button[2].getText().equals(s2))
){
oWins(0,1,2);
}
if(
(button[3].getText().equals(s2)) &&
(button[4].getText().equals(s2)) &&
(button[5].getText().equals(s2))
){
oWins(3,4,5);
}
if(
(button[6].getText().equals(s2)) &&
(button[7].getText().equals(s2)) &&
(button[8].getText().equals(s2))
){
oWins(6,7,8);
}
if(
(button[0].getText().equals(s2)) &&
(button[3].getText().equals(s2)) &&
(button[6].getText().equals(s2))
){
oWins(0,3,6);
}
if(
(button[1].getText().equals(s2)) &&
(button[4].getText().equals(s2)) &&
(button[7].getText().equals(s2))
){
oWins(1,4,7);
}
if(
(button[2].getText().equals(s2)) &&
(button[5].getText().equals(s2)) &&
(button[8].getText().equals(s2))
){
oWins(2,5,8);
}
if(
(button[0].getText().equals(s2)) &&
(button[4].getText().equals(s2)) &&
(button[8].getText().equals(s2))
){
oWins(0,4,8);
}
if(
(button[2].getText().equals(s2)) &&
(button[4].getText().equals(s2)) &&
(button[6].getText().equals(s2))
){
oWins(2,4,6);
}
}
/**
获胜后把获胜后的按钮给变成其他的颜色;
*/
public void xWins(int a,int b,int c){
button[a].setBackground(Color.GREEN);
button[b].setBackground(Color.GREEN);
button[c].setBackground(Color.GREEN);
// 获胜后其他的按钮不能按动
for(int i =0;i<9;i++){
button[i].setEnabled(false);
}
textfield.setText("恭喜X 胜利");
}
// O 获胜 ,一个画
public void oWins(int a,int b,int c){
button[a].setBackground(Color.GREEN);
button[b].setBackground(Color.GREEN);
button[c].setBackground(Color.GREEN);
// 获胜后其他的按钮不能按动
for(int i =0;i<9;i++){
button[i].setEnabled(false);
}
textfield.setText("恭喜O 胜利");
}
}