实现功能
1.在窗体中绘制一个五子棋盘
2.添加按钮,实现开始、结束功能
3.利用chessflag=0/1/2实现棋子黑白颜色交替
4.在棋盘上点击,将黑白棋子画入对应位置
5.记录已画棋子位置,并在窗体刷新时将棋子重新画入棋盘
第一步:创建窗体
import javax.swing.*;
import java.awt.*;
public class NewGo extends JFrame {
GoListener gol=new GoListener();
public void showUI(){
setTitle("五子棋对战");
setSize(1050,850);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(null);
JButton btn=new JButton("开始游戏");
btn.setBounds(850,75,100,35);
add(btn);
btn.addActionListener(gol);
setVisible(true);
addMouseListener(gol);
gol.g=getGraphics();
}
public void paint(Graphics g) {
super.paint(g);
int X=50,Y=75,SIZE=50,ROWS=15,COLS=15;
System.out.println("my paint");
g.setColor(Color.orange);//颜色为橙色
g.fillRect(X-SIZE/2, Y-SIZE/2, SIZE*ROWS+SIZE,SIZE*COLS+SIZE);//将窗体背景填充为橙色
//画黑色的线格
g.setColor(Color.black);
for (int i =0; i <16 ; i++) {
g.drawLine(X,Y+i*SIZE,X+SIZE*ROWS,Y+i*SIZE);
g.drawLine(X+i*SIZE,Y,X+i*SIZE,Y+SIZE*COLS);
}
}
public static void main(String[] args) {
NewGo ui2=new NewGo();
ui2.showUI();
}
}
运行结果
第二步:实现按钮功能
要求:
1.点击按钮实现按钮文本在“开始游戏”、“结束游戏”转换
2.chessflag0/1交换
代码
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class GoListener implements MouseListener, ActionListener {
Graphics g;
int chessflag=0;
int X=50,Y=75,SIZE=50,ROWS=15,COLS=15;
public void actionPerformed(ActionEvent e){
String btnText=e.getActionCommand();//获取按钮上的文本
JButton btn=(JButton) e.getSource();//获取按钮对象
if(btnText.equals("开始游戏")){
chessflag=1;
btn.setText("结束游戏");
} else if (btnText.equals("结束游戏")){
chessflag=0;
btn.setText("开始游戏");
}
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
第三步:画棋子
要求:
1.每次点击时chessflag 1/2互换,实现间隔下黑/白棋
2.将每次下棋结果保存在二维数组中
3.鼠标点击在一定范围内要求将棋子下在线的交汇处
4.刷新时将二维数组中的记录画入棋盘
代码
补充mousePressed代码(实现点击画棋)
@Override
public void mousePressed(MouseEvent e) {
//未开始提醒
if(chessflag==0){
JOptionPane.showMessageDialog (null, "请点击开始游戏", "提示", JOptionPane.ERROR_MESSAGE);
return;
}
int x=e.getX();
int y=e.getY();
int c=(x-X+SIZE/2)/SIZE;//计算所在列,0,1...
int r=(y-Y+SIZE/2)/SIZE;//计算所在行,0,1...
//超出棋盘范围提醒
if(x<X-SIZE/2||y<Y+SIZE/2||c>COLS||r>ROWS){
JOptionPane.showMessageDialog (null, "超出棋盘范围", "提示", JOptionPane.ERROR_MESSAGE);
return;
}
//此处已有棋子提醒
if(chessArr[r][c]!=0){
JOptionPane.showMessageDialog (null, "此处已经有棋子", "提示", JOptionPane.ERROR_MESSAGE);
return;
}
//条件符合将棋子位置记录
chessArr[r][c]=chessflag;
for(int i=0;i<chessArr.length;i++){
for(int j=0;j<chessArr[i].length;j++){
System.out.print(chessArr[i][j]+" ");
}
System.out.println();
}
//将棋子画入棋盘中
if(chessflag==1){
g.setColor(Color.black);
chessflag=2;
} else if (chessflag==2) {
g.setColor(Color.white);
chessflag=1;
}
int chessx=X+c*SIZE-SIZE/2;
int chessy=Y+r*SIZE-SIZE/2;
g.fillOval(chessx,chessy,SIZE, SIZE);
}
补充mouseEntered代码(实现刷新后鼠标进入将棋子记录重新画到棋盘上)
public void mouseEntered(MouseEvent e) {
// 绘制已经下好的棋子
for(int i = 0; i < chessArr.length; i++){
for(int j = 0; j < chessArr[i].length; j++){
int n = chessArr[i][j];
if(n!=0){
if(n==1){
g.setColor (Color.BLACK);
}else{
g.setColor (Color.WHITE);
}
int chessX = j*SIZE+X-SIZE/2;
int chessY = i*SIZE+Y-SIZE/2;
g.fillOval (chessX, chessY, SIZE, SIZE);
}
}
}
}
完善按钮,实现结束游戏后刷新棋盘棋子清空
else if (btnText.equals("结束游戏")){
chessflag=0;
chessArr=new int[ROWS+1][COLS+1];//重置记录
btn.setText("开始游戏");
运行结果