java-----五子棋小游戏(五)-----按钮功能设置(The End)

本文档详细介绍了如何在Java中为五子棋小游戏设置按钮功能,涵盖了相关代码的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、代码实现

package org.like.game.frame;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class FiveChessFrame extends JFrame implements MouseListener,Runnable//实现Runnable接口
{
	int width = Toolkit.getDefaultToolkit().getScreenSize().width;
	int height = Toolkit.getDefaultToolkit().getScreenSize().height;
    BufferedImage bgImage = null;
    int x = 0;
    int y = 0;
    
    int[][] allChess = new int[19][19];
    boolean isBlack = true;
    boolean canPlay = true;
    String message = "黑方先行";
    int maxTime = 0;
    Thread td= new Thread(this);//创建线程用来显示计时
    int blackTime = 0;//黑方剩余时间
    int whiteTime = 0;//白方剩余时间
    String blackMessage = "无限制";//计时区间所显示的内容
    String whiteMessage = "无限制";//如果没有设置时间或是设置时间为0,则显示"无限制",否则,通过线程显示剩余时间
    
	public FiveChessFrame()
	{
		this.setTitle("五子棋");
		this.setSize(500,500);
		this.setLocation((width-500)/2,(height-500)/2);
		this.setResizable(false);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
		td.start();//启动线程
		td.suspend();//线程挂起
		this.repaint();//刷新一遍界面,防止刚开始运行程序时出现黑窗口现象
		this.addMouseListener(this);
		try
		{
			bgImage = ImageIO.read(new File("F:/mypicture/java/background.jpg"));
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
	}
	
	public void paint(Graphics g)
	{
		BufferedImage bi = new BufferedImage(500, 500, BufferedImage.TYPE_INT_RGB);
		Graphics g2 = bi.createGraphics();
		g2.setColor(Color.BLACK);
		g2.drawImage(bgImage,3,20,this);
		g2.setFont(new Font("黑体",Font.BOLD,20));
		g2.drawString("游戏信息:"+message, 150, 50);
		g2.setFont(new Font("宋体",0,14));
		g2.drawString("黑方时间:"+blackMessage, 45, 470);
		g2.drawString("白方时间:"+whiteMessage, 260, 470);
		for(int i=0;i<19;i++)
		{
		   g2.drawLine(13, 70+20*i, 372, 70+20*i);
		   g2.drawLine(13+20*i,70,13+20*i,430);
		}	
		g2.fillOval(71, 128, 4, 4);
		g2.fillOval(311, 128, 4, 4);
		g2.fillOval(311, 368, 4, 4);
		g2.fillOval(71, 368, 4, 4);
		g2.fillOval(311, 248, 4, 4);
		g2.fillOval(191, 128, 4, 4);
		g2.fillOval(71, 248, 4, 4);
		g2.fillOval(191, 368, 4, 4);
		g2.fillOval(191, 248, 4, 4);

		for(int i=0;i<19;i++)
		{
			for(int j=0;j<19;j++)
			{
				if(allChess[i][j] == 1)
				{
					x = i * 20 + 13;
					y = j * 20 + 70;
					g2.fillOval(x-7, y-7, 14, 14);
				}
				if(allChess[i][j] == 2)
				{
					x = i * 20 + 13;
					y = j * 20 + 70;
					g2.setColor(Color.WHITE);
					g2.fillOval(x-7, y-7, 14, 14);
					g2.setColor(Color.BLACK);
					g2.drawOval(x-7, y-7, 14, 14);
				}
			}
		}
		g.drawImage(bi, 0, 0, this);
	}
	
	@Override
	public void mouseClicked(MouseEvent e)
	{
	

	}

	@Override
	public void mousePressed(MouseEvent e)
	{
		if(canPlay == true)
		{
    	    x = e.getX();
    	    y = e.getY();
    	    if(x >= 13 && x <= 380 && y >= 70 && y <= 440)//在原来基础上将x,y的上限扩大了一点,使得最右边和最下边也能下棋子
    	    {
    	    	x = (x - 13) / 20;
    	    	y = (y - 70) / 20;
    	    	if(allChess[x][y] == 0)
    	    	{
        	    	if(isBlack)
        	    	{
        	    		allChess[x][y] = 1;
        	    		isBlack = false;
        	    		message = "轮到白方下棋";
        	    	}
        	    	else
        	    	{
        	    		allChess[x][y] = 2;
        	    		isBlack = true;
        	    		message = "轮到黑方下棋";
        	    	}
        	    	this.repaint();
        	    	boolean winFlag = this.checkWin();
        	    	if(winFlag == true)
        	    	{
        	    		JOptionPane.showMessageDialog(this, "游戏结束"+(allChess[x][y] == 1?"黑方":"白棋")+"获胜!");
        	    	    canPlay = false;
        	    	}
    	        }
    	    	else
    	    	{
    	    		JOptionPane.showMessageDialog(this, "当前位置已经有棋子了,请重新落子!");
    	    	}
    	    }
		}//重新开始按钮功能实现
    	    if(e.getX() >= 404 && e.getX() <= 473 && e.getY() >= 72 && e.getY() <= 99)
    	    {
                td.suspend();暂停计时
    	    	if(JOptionPane.showConfirmDialog(this, "是否重新开始游戏?") == 0)
    	    	{//弹出确认消息对话框,若选择“是”,就初始化allChess中的值
    	    		for(int i=0;i<19;i++)
    	    		{
    	    			for(int j=0;j<19;j++)
    	    			{
    	    				allChess[i][j] = 0;
    	    			}
    	    		}
    	    		this.message = "黑方先行";//并初始化一些显示和标记
    	    		isBlack = true;
    	    		canPlay = true;
    	    		blackTime = maxTime;
    	    		whiteTime = maxTime;
    	    		this.repaint();//刷新
    	    		td.resume();//唤醒线程,比如哪一方用时完毕结束时会挂起线程,而点开始按钮又重新唤醒线程
    	    	}
    	    }
    	    
    	    if(e.getX() >= 404 && e.getX() <= 473 && e.getY() >= 121 && e.getY() <= 151)
    	    {
    	    	String input = JOptionPane.showInputDialog("请输入游戏的最大时间(分钟),如果输入0,表示没有时间限制");
    	    	try
				{  	    		
    	    		maxTime = Integer.parseInt(input) * 60;
    	    		if(maxTime < 0)
    	    		{
    	    			JOptionPane.showMessageDialog(this, "输入有误,不允许输入负数");
    	    		}
    	    		if(maxTime == 0)
    	    		{
    	    			if(JOptionPane.showConfirmDialog(this, "设置完成,是否重新开始游戏?") == 0)
    	    			{
    	    	    		for(int i=0;i<19;i++)
    	    	    		{
    	    	    			for(int j=0;j<19;j++)
    	    	    			{
    	    	    				allChess[i][j] = 0;
    	    	    			}
    	    	    		}
    	    	    		this.message = "黑方先行";
    	    	    		isBlack = true;
    	    	    		canPlay = true;
    	    	    		blackTime = maxTime;
    	    	    		whiteTime = maxTime;
    	    	    		blackMessage = "无限制";
    	    	    		whiteMessage = "无限制";
    	    	    		this.repaint();//repaint别忘了

    	    	    	}//maxTime为0时,时间无限制,所以也不用唤醒线程
    	    			
    	    		}
    	    		if(maxTime > 0)
    	    		{
    	    			if(JOptionPane.showConfirmDialog(this, "设置完成,是否重新开始游戏?") == 0)
    	    			{
    	    	    		for(int i=0;i<19;i++)
    	    	    		{
    	    	    			for(int j=0;j<19;j++)
    	    	    			{
    	    	    				allChess[i][j] = 0;
    	    	    			}
    	    	    		}
    	    	    		this.message = "黑方先行";
    	    	    		isBlack = true;
    	    	    		canPlay = true;
    	    	    		blackTime = maxTime;
    	    	    		whiteTime = maxTime;
    	    	    		blackMessage = maxTime/3600 + ":" + (maxTime/60-maxTime/3600*60) + ":" + (maxTime-maxTime/60*60);
    	    	    		whiteMessage = maxTime/3600 + ":" + (maxTime/60-maxTime/3600*60) + ":" + (maxTime-maxTime/60*60);
    	    	    		this.repaint();//repaint别忘了

    	    	    		td.resume();
    	    	    	}
    	    			
    	    		}
				}
				catch (Exception e2)
				{
					JOptionPane.showMessageDialog(this, "输入有误,请正确输入信息");
				}
    	    	
    	    }
    	    //说明按钮功能实现
    	    if(e.getX() >= 404 && e.getX() <= 473 && e.getY() >= 171 && e.getY() <= 199)
    	    {
    	    	JOptionPane.showMessageDialog(this, "这是一个五子棋程序,黑白方轮流下棋,当某一方连到五子时,游戏结束。");
    	    }
    	    //认输按钮功能实现
    	    if(e.getX() >= 404 && e.getX() <= 473 && e.getY() >= 271 && e.getY() <= 299)
    	    {
    	    	if(JOptionPane.showConfirmDialog(this, "是否确认认输?") == 0)
    	    	{
    	    		if(isBlack)
    	    		{
    	    			JOptionPane.showMessageDialog(this, "黑方已经认输,游戏结束!");
                                td.suspend();//挂起线程,防止继续计时
    	    		}
    	    		else
    	    		{
    	    			JOptionPane.showMessageDialog(this, "白方已经认输,游戏结束!");
                                td.suspend();
    	    		}
    	    		canPlay = false;//设置不能再落子了
    	    	}
    	    }
    	    //关于按钮功能实现
    	    if(e.getX() >= 404 && e.getX() <= 473 && e.getY() >= 322 && e.getY() <= 348)
    	    {
    	    	JOptionPane.showMessageDialog(this, "本游戏由周子新制作\nblog.csdn.net/zhouzixin053");
    	    }
    	    //退出按钮功能实现
    	    if(e.getX() >= 404 && e.getX() <= 473 && e.getY() >= 371 && e.getY() <= 398)
    	    {
    	    	if(JOptionPane.showConfirmDialog(this, "确认退出吗?", "退出", JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE) == 0)
    	    	{
    	    		System.exit(0);
    	    	}
    	    	
    	    }
	   
 
	}

	@Override
	public void mouseReleased(MouseEvent e)
	{
	

	}

	@Override
	public void mouseEntered(MouseEvent e)
	{
	
	}

	@Override
	public void mouseExited(MouseEvent e)
	{
		

	}

	public static void main(String[] args)
	{
		FiveChessFrame ff = new FiveChessFrame(); 

	}
	
	private boolean checkWin()
	{
		boolean flag = false;
		int count = 1;
		int color = allChess[x][y];
		count = this.checkCount(1, 0, color);
		if (count >= 5) 
		{
			flag = true;
		} 
		else 
		{
			// 判断纵向
			count = this.checkCount(0, 1, color);
			if (count >= 5) 
			{
				flag = true;
			} 
			else 
			{
				// 判断右上、左下
				count = this.checkCount(1, -1, color);
				if (count >= 5) 
				{
					flag = true;
				} 
				else 
				{
					// 判断右下、左上
					count = this.checkCount(1, 1, color);
					if (count >= 5) 
					{
						flag = true;
					}
				}
			}
		}

		return flag;
	}
	
	private int checkCount(int xChange, int yChange, int color) 
	{
		int count = 1;
		int tempX = xChange;
		int tempY = yChange;
		while (x + xChange >= 0 && x + xChange <= 18 && y + yChange >= 0&& y + yChange <= 18
				&& color == allChess[x + xChange][y + yChange]) 
		{
			count++;
			if (xChange != 0)
				xChange++;
			if (yChange != 0) {
				if (yChange > 0)
					yChange++;
				else {
					yChange--;
				}
			}
		}
		xChange = tempX;
		yChange = tempY;
		while (x - xChange >= 0 && x - xChange <= 18 && y - yChange >= 0&& y - yChange <= 18
				&& color == allChess[x - xChange][y - yChange]) 
		{
			count++;
			if (xChange != 0)
				xChange++;
			if (yChange != 0) {
				if (yChange > 0)
					yChange++;
				else {
					yChange--;
				}
			}
		}
		return count;
	}

	@Override
	public void run()
	{
		while(true)
		{
                        this.repaint();
			if(maxTime > 0)
			{
				if(isBlack)
				{
					blackTime--;	
					if(blackTime == 0)//时间为0就弹出窗口提示游戏结束
					{
						JOptionPane.showMessageDialog(this, "黑方超时,游戏结束!");
						canPlay = false;//设置不能再落子
						td.suspend();//线程挂起,不然就会在计时区域继续显示,并且显示负数
					}
				}
				else
				{
					whiteTime--;
					if(whiteTime == 0)
					{
						JOptionPane.showMessageDialog(this, "白方超时,游戏结束!");
						canPlay = false;
						td.suspend();
					}
				}
				try
				{
					Thread.sleep(1000);//使计时以1秒为单位
				}
				catch (InterruptedException e)
				{
					e.printStackTrace();
				}
				blackMessage = blackTime/3600 + ":" + (blackTime/60-blackTime/3600*60) + ":" + (blackTime-blackTime/60*60);
				whiteMessage = whiteTime/3600 + ":" + (whiteTime/60-whiteTime/3600*60) + ":" + (whiteTime-whiteTime/60*60);
				this.repaint();//每次计时完毕就刷新一遍
			}
		}
	}
}


二、 效果展示











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值