Java小项目(井字棋游戏),采用Java Swing

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 胜利");
	}

} 

三、运行结果

在这里插入图片描述

在这里插入图片描述

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
井字棋是一款经典的二人对战游戏,我构思的Java游戏井字棋的设计图如下: 1. 游戏界面设计:游戏界面分为一个3x3的棋盘和一些控制按钮。棋盘可以用网格状的9个方格表示,控制按钮包括开始游戏、重新开始、悔棋等。 2. 游戏逻辑实现: - 初始化棋盘:开始游戏时,清空棋盘,并对每个方格初始化为空。 - 轮流下子:两个玩家轮流下子,一方执X,另一方执O。点击棋盘上的方格,根据当前玩家的标识(X或O),在该方格上绘制相应的棋子。 - 判断胜负:每当一个玩家下子时,判断是否出现了胜利的情况。如果出现了连续的三颗相同棋子(横、竖或斜),则该玩家胜利,游戏结束。 - 判断平局:如果棋盘填满且没有出现胜利的情况,则判定为平局,游戏结束。 - 重新开始和悔棋:游戏结束后,玩家可以选择重新开始游戏或者悔棋。 3. 进一步的改进: - 添加人机对战功能:目前的设计是两人对战,可以进一步扩展为与电脑对战模式。设定电脑AI算法,让电脑自动选择最佳下子位置。 - 添加游戏模式选择:除了人机对战,还可以增加玩家之间的网络对战模式,让玩家可以与其他玩家进行实时对战。 - 美化界面:可以增加游戏界面的背景音乐和动画效果,提升用户体验。 - 添加游戏记录功能:记录每一局对战的胜负情况,包括玩家的名字和得分,以便可以进行对比和查看历史记录。 通过以上的构思,Java游戏井字棋可以实现玩家之间的多人对战,并且可以扩展为与电脑进行对战。同时,游戏还可以不断改进和完善,增加更多的功能,提升用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值