`

五子棋总结

 
阅读更多

五子棋编程思路

一.创建主函数,构造窗体方法

	public static void main(String[] args){
		FiveChessUI ui=new FiveChessUI();

		ui.showframe();
	}
	
	public void showframe(){

		this.setTitle("五子棋");
		this.setSize(802,700);
		this.setResizable(false);
		this.setLayout(new FlowLayout(0,0,0));
		//菜单
		MenuBarPanel menubarpanel=new MenuBarPanel(g);
		menubarpanel.setBounds(0, 0, 800, 40);
		this.setJMenuBar(menubarpanel);
		
		//棋盘,功能菜单
		chesspanel=new ChessPanel();
		chesspanel.setPreferredSize(new Dimension(625,660));
		chesspanel.setBackground(new Color(233, 146, 68));
		MenuPanel menupanel=new MenuPanel(this,g);
		menupanel.setLayout(new FlowLayout(1,30,63));
		menupanel.setPreferredSize(new Dimension(161,660));
		menupanel.setBackground(Color.LIGHT_GRAY);
		this.add(chesspanel);
		this.add(menupanel);
		
		//窗体设置
		this.setDefaultCloseOperation(3);
		this.setVisible(true);
		
		//获取画布
		Graphics g=chesspanel.getGraphics();
		chesslistener=new ChessListener(g);
		
	
		
	}

 在窗体方法中添加了菜单,棋盘,功能菜单板块

在棋盘面板上获取画布

添加给棋盘加监听器的方法

添加给棋盘移除监听器的方法

public void addChessListener() {
		chesspanel.addMouseListener(chesslistener);
	}

	// 给棋盘移除监听器的方法
	public void removeChessListener() {
		chesspanel.removeMouseListener(chesslistener);
	}

 

二.另建菜单,棋盘。功能菜单类,将其添加在窗体上

 

package wenxiaodong.fivechess;

import java.awt.Graphics;

import javax.swing.JButton;
import javax.swing.JPanel;

public class MenuPanel extends JPanel implements Config{

	public MenuPanel(FiveChessUI ui,Graphics g){
		MenuListener menulistener=new MenuListener(ui,g);
		for(int i=0;i<MENUS.length;i++){
			JButton but=new JButton(MENUS[i]);
			but.addActionListener(menulistener);
			this.add(but);
		}
	}
	

}

 

package wenxiaodong.fivechess;

import java.awt.Graphics;
import java.awt.MenuItem;

import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public class MenuBarPanel extends JMenuBar implements Config {
	private Graphics g;
	public MenuBarPanel(Graphics g){
		this.g=g;
	for(int i=0;i<MENUBARS.length;i++){
		JMenu menu=new JMenu(MENUBARS[i],true);
		this.add(menu);
		//文件
		if(MENUBARS[i]==MENUBARS[0]){
			for(int j=0;j<FILES.length;j++){
				JMenuItem item=new JMenuItem(FILES[j]);
				menu.add(item);
			}
		}
			//游戏
			if(MENUBARS[i]==MENUBARS[1]){
				for(int j=0;j<GAMES.length;j++){
					JMenuItem item=new JMenuItem(GAMES[j]);
					menu.add(item);
				}	
		}
			
	}
	}
	

}

 

package wenxiaodong.fivechess;

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JPanel;

public class ChessPanel extends JPanel implements Config{
	
	public void paint(Graphics g){
		super.paint(g);
		drawTable(g);
		fillrect(g);
		drawChesses(g);
	}
	//重绘棋盘
	public void drawTable(Graphics g){
		// 绘制横线
		for (int i = 0; i < ROWS; i++) {
			g.drawLine(X0, Y0 + SIZE * i, X0 + SIZE * (COLUMNS - 1), Y0 + SIZE
					* i);
		}
		// 绘制竖线
		for (int i = 0; i < COLUMNS; i++) {
			g.drawLine(X0 + SIZE * i, Y0, X0 + SIZE * i, Y0 + SIZE * (ROWS - 1));
		}
	}
	
	//重绘标志
	public void fillrect(Graphics g){
		g.setColor(Color.BLACK);
		g.fillRect(X0+3*SIZE-4, Y0+3*SIZE-3,
				8, 6);
		g.fillRect(X0+3*SIZE-4,Y0+11*SIZE-3,
				8, 6);
		g.fillRect(X0+11*SIZE-4,Y0+3*SIZE-3,
				8, 6);
		g.fillRect(X0+11*SIZE-4,Y0+11*SIZE-3,
				8, 6);
		g.fillRect(X0+7*SIZE-4,Y0+ 7*SIZE-3,
				8, 6);

	}
	
	//重绘棋子
	public void drawChesses(Graphics g){
		for (int i = 0; i < ROWS; i++) {
			for (int j = 0; j < COLUMNS; j++) {
				if (CHESSES[i][j] != 0) {
					// 根据下标计算坐标
					// 得到交叉点的坐标
					int x = X0 + j * SIZE;
					int y = Y0 + i * SIZE;
					if (CHESSES[i][j] == 1) {
						g.setColor(Color.BLACK);
					} else {
						g.setColor(Color.WHITE);
					}
					// 以交叉点为圆心绘制棋子
					g.fillOval(x - CHESS_SIZE / 2, y - CHESS_SIZE / 2,
							CHESS_SIZE, CHESS_SIZE);

				}

			}

		}
		
	}

	

}

 其中,在棋盘类中添加重绘棋盘和棋子的方法

三,分别创建三个监听器,监听菜单,棋盘,功能菜单,实现各个功能

四,将各个参数值写在一个类中便于修改

package wenxiaodong.fivechess;

public interface Config {
	
	
	public static final int X0=30;
	public static final int Y0=30;
	public static final int SIZE=40;
	public static final int CHESS_SIZE=30;
	public static final int ROWS=15;	
	public static final int COLUMNS=15;
	public static final  String[] MENUBARS={"文件","游戏","帮助"};
	
	public static final String[] MENUS = { "开始", "悔棋", "重来", "认输", "结束","退出" };
	public static final int[][] CHESSES=new int[ROWS][COLUMNS];
	
	public static final String[] FILES={"单人游戏","双人游戏","多人游戏"};
	public static final String[] GAMES={"简单","一般","困难"};	
	
	public static final int[][] VALUES=new int[ROWS][COLUMNS];
	
	
}
	

 

五,算法

分四个方向查找相同棋子的数量

六,机器人

遍历棋盘,给各个空白点赋值,找到值最大的点,返回坐标

七,在棋盘监听器中创建绘棋子的方法,只需传入坐标即可,没放一次判断一次输赢

package wenxiaodong.fivechess;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class ChessListener extends MouseAdapter implements Config{
	private Graphics g;
	SuanFa sf=new SuanFa();
	ChessRobot robot=new ChessRobot();
	
	
	//构造函数
	public ChessListener(Graphics g) {
		this.g = g;
	}
	
	
	public void mouseReleased(MouseEvent e) {//
		int x1 = e.getX();
		int y1 = e.getY();
		for (int i= 0; i < ROWS; i++) {
			for (int j = 0; j < COLUMNS; j++) {
				int x = X0 + j * SIZE;
				int y = Y0 + i * SIZE;
				if (Math.abs(x - x1) <= SIZE / 3
						&& Math.abs(y - y1) <= SIZE / 3) {
					if(CHESSES[i][j]==0){
						//人放棋子
						putChess(i,j,1);
						
						//机器人放棋子
						int[] point=robot.getPoint();
						putChess(point[0],point[1],-1);	
						}	
					return;										
				}
			
			}
		}
		
		
	}

	
	//人机对战方法
	public void putChess(int r,int c,int flag){
		int x = X0 + c * SIZE;
		int y = Y0 + r * SIZE;
		
		//棋子颜色
		if(flag==1){
			g.setColor(Color.BLACK);
		}else if(flag==-1){
			g.setColor(Color.WHITE);
		}	
		CHESSES[r][c]=flag;
		g.fillOval(x - CHESS_SIZE / 2, y - CHESS_SIZE / 2,
				CHESS_SIZE, CHESS_SIZE);
		
		//判断输赢
		boolean br1 = sf.checkRow(r, c);
		boolean br2 = sf.checkColumns(r, c);
		boolean br3 = sf.checkXz(r, c);
		boolean br4 = sf.checkXy(r, c);
		if(br1||br2||br3||br4){
			String msg = "";
			if(CHESSES[r][c]==1){
				msg="黑方赢了!!!";
			}else{
				msg="白方赢了!!!";
			}
			javax.swing.JOptionPane.showMessageDialog(null,msg);
		}
	}
	
	
	
	

	
	
	
	
}
这样其他的就是优化和升级方面的问题了	

 

 

分享到:
评论

相关推荐

    五子棋社团工作计划总结总结.doc

    【五子棋社团工作计划与总结】文档主要涵盖了五子棋社团的工作计划和活动总结,旨在通过五子棋这项活动来提升学生的综合素质,包括智力、情操和团队合作能力等。 1. **指导思想**: 五子棋作为一门校本课程,旨在...

    【毕业设计】MATLAB实战应用案例小游戏(附MATLAB代码):围五子棋.zip

    《MATLAB实战应用案例:围五子棋游戏》 MATLAB,全称为“Matrix Laboratory”,是一种功能强大的数学计算软件,广泛应用于科学计算、数据分析、算法开发以及图形化界面设计等领域。在毕业设计中,MATLAB常常被学生...

    java_五子棋 实习报告

    【Java五子棋实习报告】主要探讨了使用Java编程语言设计和实现五子棋游戏的过程,包括人机对战和玩家间的联网对战功能。在报告中,作者详细阐述了五子棋游戏的背景和历史,以及选择Java作为开发语言的原因。Java因其...

    matlab-wuziqi.rar_matlab五子棋gui_五子棋_五子棋matlab_五子棋matlan_五子棋算法

    总结来说,这个项目提供了一个用MATLAB实现的五子棋游戏,其中的核心是五子棋的算法,包括棋盘状态的管理、合法落子的判断以及胜负的自动检测。通过GUI,用户可以直观地进行游戏,体验到与计算机或其他玩家的对弈。...

    Java五子棋设计报告.doc

    【Java五子棋游戏设计与实现】 五子棋游戏,源于中国古代,历史悠久,深受各年龄段玩家喜爱。在当今计算机普及的时代,将这种经典棋类游戏搬到电脑屏幕上,既能满足人们的娱乐需求,又能锻炼思维能力。本项目是晓庄...

    网络五子棋设计报告

    五子棋与其他三大棋类(围棋、中国象棋、国际象棋)的主要区别在于它没有“吃子”的概念,而是强调通过连续放置己方棋子以形成特定的排列来获胜,这种机制使得五子棋更加侧重于发展与限制的策略思想。 #### 算法...

    C语言五子棋实验报告.docx

    总结来说,这份实验报告详细阐述了一个C语言实现的五子棋游戏,涉及了图形界面开发、人机对战的AI算法实现,以及游戏设计的基本流程。通过这样的课程设计,学生不仅能深入理解C语言,还能接触到游戏编程领域的前沿...

    基于L inux的嵌入式五子棋游戏_ 6818开 发板五子棋,基于linux

    在本项目中,我们关注的是一个基于Linux的嵌入式五子棋游戏,它特别针对6818开发板设计。这个项目的核心是利用Linux操作系统的能力,在嵌入式硬件平台上实现一个可玩的五子棋游戏,允许玩家与计算机进行对弈。下面将...

    五子棋实训报告(c语言)

    本文档是关于大学本科课程实训的一个项目,是用c语言写的一个关于五子棋的实训报告,并且可视化

    MFC 五子棋 一个简单的五子棋游戏

    总结来说,这个基于MFC的五子棋游戏集成了基础的数据结构设计、高效的计算机对弈算法以及严谨的胜负判断机制,为玩家提供了一个良好的对战环境。通过深入理解这些核心内容,我们可以进一步改进游戏,例如引入更智能...

    模拟连五子棋游戏,五子棋经典算法

    总结,模拟五子棋游戏的开发涵盖了数据结构(如二维数组)、基础算法(如合法落子判断、Minimax和Alpha-Beta剪枝)、高级算法(如神经网络强化学习)以及用户界面设计等多个方面。通过这样的项目实践,开发者不仅能...

    五子棋grid布局五子棋

    总结来说,"五子棋grid布局五子棋"是一个结合HTML5、CSS和JavaScript技术的项目,通过HTML构建页面结构,CSS Grid实现棋盘布局,JavaScript处理游戏逻辑和用户交互。这种技术栈的运用展示了现代Web开发中静态页面的...

    python课程设计完整 五子棋

    在本项目中,"python课程设计完整 五子棋"是一个使用Python编程语言实现的五子棋游戏。这个课程设计旨在帮助学生掌握Python的基础知识,理解面向对象编程的概念,并通过实际项目来提升编程技巧和问题解决能力。以下...

    C#五子棋游戏示例

    总结来说,《C#五子棋游戏示例》展示了C#在游戏开发中的应用,涵盖了数据结构、算法、图形界面设计、用户交互和资源管理等多个重要领域。通过学习和分析这个项目,开发者可以加深对C#编程的理解,并提升在游戏开发...

    五子棋(网页版)

    总结,这个五子棋网页版项目不仅展示了JavaScript在游戏开发中的应用,也体现了开发者在HTML、CSS、逻辑设计以及性能优化方面的技能。通过学习这样的项目,我们可以深入了解网页游戏的开发流程,并掌握相关技术。

    vb五子棋_VB五子棋_源码

    总结来说,VB五子棋项目是一个很好的学习实践,它涵盖了基础的GUI编程、事件处理、数据结构、算法设计以及简单的游戏逻辑。对于初学者而言,这个项目可以帮助理解VB编程的基本概念,同时也能锻炼到问题解决和算法...

    Java五子棋设计报告.pdf

    从提供的文件内容来看,这是一个关于Java五子棋游戏设计的报告,内容中涉及了游戏的多个关键技术和实现细节。由于文档内容不完整且存在一些扫描错误,以下知识点将基于文档中可辨识的信息进行整理。 1. MVC设计模式...

    基于JAVA的升级版五子棋项目总结(PPT版)

    【标题】基于JAVA的升级版五子棋项目总结(PPT版) 在Java编程领域,五子棋项目是一个常见的教学实例,它可以帮助开发者巩固基础知识,理解面向对象编程、图形用户界面设计以及游戏逻辑的实现。这个升级版的五子棋...

    基于FPGA的五子棋算法

    **总结** 此项目提升了团队合作、FPGA 工程设计和时间管理的能力。在实践中,通过查阅资料、合作和请教老师,加深了对 Verilog 语言的理解,熟练掌握了工程软件的使用。实践证明,理论知识只有在实际应用中才能真正...

    五子棋AI python实现

    使用python写的基于两层博弈树的五子棋AI。加入了阿尔法贝塔剪枝。 python版本:3+,应该可以在命令行里直接跑。 电脑执黑,玩家执白。无禁手。 因为只有两层博弈树,请大家不要嫌他菜哈哈哈,仅供大家学习参考。 ...

Global site tag (gtag.js) - Google Analytics