`

单机版五子棋游戏项目的实现

阅读更多

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


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) {}
	
	
}

 
 

  • 大小: 9.6 KB
3
2
分享到:
评论
1 楼 WH_LPWH 2015-12-18  
菜鸟参观学习一下,哈哈哈,很期待你更新呢!

相关推荐

    JAVA 实现《五子棋单机版》游戏-全部源码

    1、由于是单机的游戏,启动游戏后,可直接开始游戏。 2、游戏规则: 对局双方各执一色棋子。 空棋盘开局。 黑先、红后,交替下子,每次只能下一子。 棋子下在棋盘的空白点上,棋子下定后,不得向其它点移动,不得...

    javascript的五子棋小项目

    javascript语言实现的网页版离线单机五子棋小游戏,在学习javascript语法的同时,锻炼逻辑算法等基础知识,简小精悍,一举多得。

    使用java编写简易版五子棋小游戏

    该项目使用Java实现了简易版的五子棋小游戏。只适合单机双人对战。关键代码为五子棋胜利算法。

    JAVA 实现《五子棋》游戏-全部源码

    1、由于是两人的游戏,非单机版,所以要有多个客户端相互通信,这时就要用到socket 技术 2、设计socket服务端,用来维护socket客户端连接 3、设计socket客户端,用来实现五子棋逻辑和效果 4、客户端要能设置连接...

    JAVA上百实例源码以及开源项目源代码

    Java编写的网页版魔方游戏 内容索引:JAVA源码,游戏娱乐,魔方,网页游戏  Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现...

    Java项目开发与毕业设计指导

    Ch06:人机对战五子棋游戏的实现 安装JDK,配置环境变量,双击compile.bat 批处理文件编译项目,双击runFive.bat批处理文件可启动项目。 Ch07:蚁群算法的模拟实现 安装JDK,配置环境变量,导入ch07项目,一般...

    JAVA上百实例源码以及开源项目

    Java编写的网页版魔方游戏 内容索引:JAVA源码,游戏娱乐,魔方,网页游戏  Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java编写的网页版魔方游戏 内容索引:JAVA源码,游戏娱乐,魔方,网页游戏 Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现部分...

    java源码包JSP实例源码JAVA开发源码65个合集.zip

    单机版java五子棋V1.1.rar 在Servlet中连接数据库的Java代码.rar 备份数据源.rar 学生成绩系统(图形界面).rar 学生课程管理系统.rar 宾馆管理系统.rar 手机游戏J2ME毕业设计.rar 打地鼠游戏.rar 数据持久层框架 ...

    java源码包---java 源码 大量 实例

    Java编写的网页版魔方游戏 内容索引:JAVA源码,游戏娱乐,魔方,网页游戏  Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现...

    java源码包2

    Java编写的网页版魔方游戏 内容索引:JAVA源码,游戏娱乐,魔方,网页游戏  Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java编写的网页版魔方游戏 内容索引:JAVA源码,游戏娱乐,魔方,网页游戏 Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现部分...

    java源码包3

    Java编写的网页版魔方游戏 内容索引:JAVA源码,游戏娱乐,魔方,网页游戏  Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现...

    java源码包4

    Java编写的网页版魔方游戏 内容索引:JAVA源码,游戏娱乐,魔方,网页游戏  Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现...

Global site tag (gtag.js) - Google Analytics