一、代码实现
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
{
int width = Toolkit.getDefaultToolkit().getScreenSize().width;
int height = Toolkit.getDefaultToolkit().getScreenSize().height;
BufferedImage bgImage = null;
int x = 0;//存放鼠标点击位置的x坐标
int y = 0;//存放鼠标点击位置的y坐标
int[][] allChess = new int[19][19];//一个19*19的二维数组,0代表无棋子,1代表黑棋,2代表白旗,这样能保存之前的落子,避免repaint后,只有一个棋子显示,默认数组所有值都为0
boolean isBlack = true;//用来判断下一步是否下黑棋
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);
this.addMouseListener(this);
try
{
bgImage = ImageIO.read(new File("F:/mypicture/java/background.jpg"));
}
catch (IOException e)
{
e.printStackTrace();
}
}
public void paint(Graphics g)
{
g.drawImage(bgImage,3,20,this);
g.setFont(new Font("黑体",Font.BOLD,20));
g.drawString("游戏信息:", 150, 50);
g.setFont(new Font("宋体",0,14));
g.drawString("黑方时间:无限制", 45, 470);
g.drawString("白方时间:无限制", 260, 470);
for(int i=0;i<19;i++)
{
g.drawLine(13, 70+20*i, 372, 70+20*i);
g.drawLine(13+20*i,70,13+20*i,430);
}
g.fillOval(71, 128, 4, 4);
g.fillOval(311, 128, 4, 4);
g.fillOval(311, 368, 4, 4);
g.fillOval(71, 368, 4, 4);
g.fillOval(311, 248, 4, 4);
g.fillOval(191, 128, 4, 4);
g.fillOval(71, 248, 4, 4);
g.fillOval(191, 368, 4, 4);
g.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;//各个相邻横线和各个相邻竖线的距离是20,棋盘距离边界13
y = j * 20 + 70;
g.fillOval(x-7, y-7, 14, 14);//画大小为14的圆,x,y都减7使圆心在交叉线处
}
if(allChess[i][j] == 2)
{
x = i * 20 + 13;
y = j * 20 + 70;
g.setColor(Color.WHITE);//设置颜色为白色,默认是黑色
g.fillOval(x-7, y-7, 14, 14);
g.setColor(Color.BLACK);
g.drawOval(x-7, y-7, 14, 14);//在实心白圆的外边画一个空心黑圈
}
}
}
@Override
public void mouseClicked(MouseEvent e)
{
}
@Override
public void mousePressed(MouseEvent e)
{
x = e.getX();
y = e.getY();
if(x >= 13 && x <= 372 && y >= 70 && y <= 430)//判断鼠标点击位置是否在棋盘内部
{
x = (x - 13) / 20;//使坐标与二位数组坐标对应起来
y = (y - 70) / 20;
if(allChess[x][y] == 0)//判断那个地方是否有棋子,如果有,就弹出窗口提示
{
if(isBlack)
{
allChess[x][y] = 1;//存储棋盘上这个地方的棋子信息
isBlack = false;//使得下次落子显示白棋
}
else
{
allChess[x][y] = 2;
isBlack = true;//使得下次落子显示黑棋
}
this.repaint();//重新调用paint()绘制一遍
}
else
{
JOptionPane.showMessageDialog(this, "当前位置已经有旗子了,请重新落子!");
}
}
}
@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();
}
}