井字棋(applet实例)

package applet;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.*;
import javax.swing.border.LineBorder;


public class TicTacToe extends JApplet{
	
	private char whoseTurn ='X';                              //x第一个开始
	private Cell[][] cells=new Cell[3][3];                            //3*3棋盘
	private JLabel jlblStatus=new JLabel(" X's trun to play");             //label显示字
	
	public TicTacToe() {                                          //构造方法初始化布局
		JPanel p=new JPanel (new GridLayout(3,3,0,0));
		for(int i=0;i<3;i++)
			for(int j=0;j<3;j++)
				p.add(cells[i][j]=new Cell());
		
		p.setBorder(new LineBorder(Color.red,1));
		jlblStatus.setBorder(new LineBorder(Color.yellow,1));
		
		add(p,BorderLayout.CENTER);
		add(jlblStatus,BorderLayout.SOUTH);
		
	}
	
	public 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;
	}
	
	public boolean isWon (char token) {                 //赢的情况判断,同行、同列、同对角线、同反对角线
		
		for(int i=0;i<3;i++)
			if((cells[i][0].getToken()==token)
					&&(cells[i][1].getToken()==token)
					&&(cells[i][2].getToken()==token)){
				return true;
				
			}
		
		for(int j=0;j<3;j++)
			if((cells[0][j].getToken()==token)
					&&(cells[1][j].getToken()==token)
					&&(cells[2][j].getToken()==token)){
				return true;
			}
		
		if(   (cells[0][0].getToken()==token)
				&&(cells[1][1].getToken()==token)
				&&(cells[2][2].getToken()==token)){
			return true;
		}
		
		
		if(   (cells[0][2].getToken()==token)
				&&(cells[1][1].getToken()==token)
				&&(cells[2][0].getToken()==token)){
			return true;
		}
		return false;                    //remember add this sentence
	}
	
	public class Cell extends JPanel{           //单元格的属性token(),监听鼠标行为,在单元格内绘制棋子
		private char token=' ';               //token用于获取单元格的状态,空,x,o三种状态
		
		public Cell() {
			setBorder(new LineBorder(Color.black,1));
			addMouseListener(new MyMouseListener());
		}
		public char getToken() {
			return token;
		}
		public void setToken(char c) {        //获取绘制哪种形状,x,o
			token=c;
			repaint();
		}
		protected void paintComponent(Graphics g) {            //这个paint是基于单元格来画的
			super.paintComponent(g);
			
			if(token=='X')
			{
				g.drawLine(10,10,getWidth()-10,getHeight()-10);
				g.drawLine(getWidth()-10,10,10,getHeight()-10);
			}
			else if(token=='O')
				g.drawOval(10,10,getWidth()-20,getHeight()-20);
		}	
	
	
	private class MyMouseListener extends MouseAdapter {         //游戏进行的控制吗,并判断最终结果
		public void mouseClicked(MouseEvent e) {
			if(token==' '&& whoseTurn!=' ') {
				setToken(whoseTurn);
				
				if(isWon(whoseTurn)) {
					jlblStatus.setText(whoseTurn +" won! the game is over");
					whoseTurn =' ';
				}
				else if (isFull()) {
					jlblStatus.setText("Draw ! the game is over");
					whoseTurn=' ';
				}
				else {
					whoseTurn = (whoseTurn=='X')?'O':'X';   //find who is the next player
					jlblStatus.setText(whoseTurn+"'s turn" );
				}			
			}
		}	
	}
	}
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值