好久没更新博客了,最近花了一周时间,做了个单机版五子棋游戏,已经实现了棋盘界面的绘制,棋子下落等功能,就差加上判断输赢的规则了,暂且就贴上这部分代码以及效果图,以后陆续会添上后续代码,并升级为网络版五子棋,写的不好,还望各位大侠不吝赐教

package wzq1;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class StartFrame extends JFrame {
private JPanel toolbar;
private JMenuBar menuBar;
private JMenu sysMenu;
private JMenuItem startMenuItem;
private JMenuItem exitMenuItem;
private JMenuItem backMenuItem;
private JButton btnStart;
private JButton btnBack;
private JButton btnExit;
public StartFrame(){
//设置标题
setTitle("单机版五子棋");
//创建菜单栏
menuBar=new JMenuBar();
//创建和添加菜单
sysMenu=new JMenu("系统");
startMenuItem =new JMenuItem("重新开始");
exitMenuItem =new JMenuItem("退出");
backMenuItem =new JMenuItem("悔棋");
sysMenu.add(startMenuItem);
sysMenu.add(backMenuItem);
sysMenu.add(exitMenuItem);
MyItemListener lis=new MyItemListener();
//将3个菜单项添加到菜单上
startMenuItem.addActionListener(lis);
backMenuItem.addActionListener(lis);
exitMenuItem.addActionListener(lis);
//将“系统”菜单加到菜单栏上
menuBar.add(sysMenu);
//设置此窗体的菜单栏
setJMenuBar(menuBar);
//工具栏面板实例化
toolbar=new JPanel();
//初始化3个按钮
btnStart=new JButton("重新开始");
btnBack=new JButton("悔棋");
btnExit=new JButton("退出");
//将工具栏面板按钮设置为FlowLayout布局
toolbar.setLayout(new FlowLayout(FlowLayout.LEFT));
//将3个按钮添加到工具面板上
toolbar.add(btnStart);
toolbar.add(btnBack);
toolbar.add(btnExit);
//将工具面板布局到界面“南”方
add(toolbar,BorderLayout.SOUTH);
//将3个按钮注册到事件监听器上
btnStart.addActionListener(lis);
btnBack.addActionListener(lis);
btnExit.addActionListener(lis);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(500,550);
//pack();
ChessBoard chessBoard=new ChessBoard();
add(chessBoard,BorderLayout.CENTER);
}
//内部类
public class MyItemListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
//获取事件源
Object obj=e.getSource();
if(obj==StartFrame.this.startMenuItem||obj==btnStart){
System.out.println("重新开始");
}else if(obj==backMenuItem||obj==btnBack){
System.out.println("悔棋");
}else if(obj==exitMenuItem||obj==btnExit){
System.out.println("退出");
}
}
}
public static void main(String[] args) {
new StartFrame().setVisible(true);
}
}
package wzq1;
import java.awt.Color;
public class Point {
private int x;
private int y;
private Color color;
//直径
public static final int DIMETER=30;
public Point(int x,int y,Color color){
this.x=x;
this.y=y;
this.color=color;
}
//拿到棋盘中的x索引
public int getX() {
return x;
}
//拿到棋盘中的Y索引
public int getY() {
return y;
}
//得到颜色
public Color getColor() {
return color;
}
}
package wzq1;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JPanel;
/**
*
* 设计棋盘
* 棋盘是画在一个JPanel上,然后添加到一个JFrame上
* 棋盘的坐标原点在JPanel上,所有坐标都在JPanel上,不包括JFrame没有放置JFrame的边框部分
* @author zhang
*
*/
public class ChessBoard extends JPanel implements MouseListener{
public static final int MARGIN=30;//边距
public static final int GRID_SPAN=40;//网格距
public static final int ROWS=10;//棋盘行数
public static final int COLS=10;//棋盘列数
int chessCount;
Point[] chessList =new Point[(ROWS+1)*(COLS+1)];
int xIndex,yIndex;//当前所下棋子的索引
boolean isBlack=true;//默认开始是黑棋先下
public ChessBoard() {
setBackground(Color.ORANGE);
addMouseListener(this);//this指代调用addMouseListener方法的ChessBoard类的对象自身
addMouseMotionListener(new MouseMotionListener() {//匿名内部类,且该类实现了 MouseMotionListener接口
@Override
public void mouseMoved(MouseEvent e) {
// 将鼠标单击的坐标位置转换成网格索引
// int x1=(e.getX()-MARGIN+GRID_SPAN/2)/GRID_SPAN;
// int y1=(e.getY()-MARGIN+GRID_SPAN/2)/GRID_SPAN;
setCursor(new Cursor(Cursor.HAND_CURSOR));//设置成手型,也可以设置为其他类型如CROSSHAIR_CURSOR十字架形,请自行查API
}
//监听鼠标移动的区域从而决定它显示的形状
@Override
public void mouseDragged(MouseEvent e) {
// 鼠标按键在组件上按下并拖动时需要实现此方法,此处用不上,所以采用空实现
}
});
}
// public Dimension getPreferredSize(){
// return new Dimension(MARGIN*2+GRID_SPAN*COLS,MARGIN*2+GRID_SPAN*ROWS);
// }
public void paintComponent(Graphics g){
super.paintComponent(g);
//画横线(每条线的Y坐标不变y1=y2,x坐标变化,不同线的终点X坐标X2都相同)
for(int i=0;i<=ROWS;i++){
g.drawLine(MARGIN, MARGIN+i*GRID_SPAN, MARGIN+COLS*GRID_SPAN, MARGIN+i*GRID_SPAN);
}
//画竖线(每条线的X坐标不变x1=x2,y坐标变化不同线的终点Y坐标y2都相同)
for(int i=0;i<=COLS;i++){
g.drawLine(MARGIN+i*GRID_SPAN,MARGIN, MARGIN+i*GRID_SPAN, MARGIN+ROWS*GRID_SPAN );
//g.drawLine(x1, y1, x2, y2);
}
for(int i=0;i<chessCount;i++){
int xPos=chessList[i].getX()*GRID_SPAN+MARGIN;//网格交叉点x坐标
int yPos=chessList[i].getY()*GRID_SPAN+MARGIN;//网格交叉点y坐标
g.setColor(chessList[i].getColor());//设置颜色
g.fillOval(xPos-Point.DIMETER/2, yPos-Point.DIMETER/2, Point.DIMETER, Point.DIMETER);
//System.out.println(xPos+" "+yPos);
if(i==chessCount-1){
//最后一个棋子
g.setColor(Color.red);
g.drawRect(xPos-Point.DIMETER/2, yPos-Point.DIMETER/2, Point.DIMETER, Point.DIMETER);
}
}
}
@Override
public void mouseClicked(MouseEvent e) {}
@Override
public void mousePressed(MouseEvent e) {
//String colorName= isBlack?"黑棋":"白棋";
//将鼠标单击的坐标位置转换成网格索引0-10
xIndex=(e.getX()-MARGIN+GRID_SPAN/2)/GRID_SPAN;
yIndex=(e.getY()-MARGIN+GRID_SPAN/2)/GRID_SPAN;
//落在棋盘外,不能下
//System.out.println(xIndex+" a"+yIndex);
//System.out.println(e.getX()+" b "+e.getY());
if(xIndex<0||xIndex>ROWS||yIndex<0||yIndex>COLS){
return;
}
Point ch=new Point(xIndex,yIndex,isBlack?Color.black:Color.white);
chessList[chessCount++]=ch;
//System.out.println(chessCount);
repaint();//通知系统重新绘制
isBlack=!isBlack;
}
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
}

本文分享了一个单机版五子棋游戏的开发过程,实现了棋盘界面绘制及棋子下落等功能,介绍了游戏界面设计及交互逻辑,后续计划加入胜负判断规则,并升级为网络版。
240

被折叠的 条评论
为什么被折叠?



