`
什么都不懂的孩子
  • 浏览: 27810 次
社区版块
存档分类
最新评论

java实战---五子棋

 
阅读更多

        学习java也有两个月了,一些简单是swing组件和事件监听机制也懂了,现在开始了我的第一个实战小程序---五子棋,说起五子棋,大家都知道,只要五个相同颜色的棋子在同一条直线或者斜线上面,就算赢,有两种颜色的棋子,黑白,标准的五子棋棋盘是15×15的,要在一个panel上利用重绘,把棋盘画好,然后加鼠标监听器,填充两种颜色的圆,每次填充的圆颜色要不一样,而且要填充到交点上,之后还要做几个按钮,例如开始按钮,点击以后开始游戏,此时添加监听器,开始游戏,还有悔棋,认输按钮,功能我就不一一赘述了。

        先写一个类继承JFrame,设置它的各种属性,顺便加了一个panel,我把它放在东边,留着加按钮的时候用,代码如下:

public class GoBong extends JFrame {
	
	
	public static void main(String[] args) throws 
	ClassNotFoundException, InstantiationException, IllegalAccessException,
	UnsupportedLookAndFeelException {
		
		//设置LookAndFeel
		UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
		GoBong gb = new GoBong();
		gb.setUI();
		
	}
	public void setUI(){
		//设置标题
		this.setTitle("五子棋");
		//设置大小
		this.setSize(new Dimension(700,600));
		//设置居中
		this.setLocationRelativeTo(null);
		//设置不可调大小
		this.setResizable(false);
		//设置背景色
		//this.getContentPane().setBackground(Color.BLUE);
		//设置关闭操作
		this.setDefaultCloseOperation(3);
		//东边面板
		setEast();
		//设置背景图片
		SetBackground();
		//设置背景透明
		ct.setOpaque(false);;
		//设置可见
		this.setVisible(true);
	}

           可能有些人会有些疑惑,因为我上面在主函数调用的时候写了一大堆异常,其实我只是想把界面作的好看,总是用java默认的swing界面,难免会觉得难看,至于上面两行代码的解释,我是从一个CSDN的博客上看到的,简单易懂,向大家推荐一下,博客地址:http://blog.csdn.net/sunyiz/article/details/7595371 ,这里面对swing界面讲解讲的很简单,很容易懂,建议大家看一下。

         接下来,我们来看一下最简单的东边panel,这个panel是留着专门添加按钮用的,先暂时只加些按钮,下一步优化正在继续,我的程序中加了三个按钮:开始游戏、悔棋、认输。这三个按钮我没有用图片,而是直接用文字代替了,这样做的好吃就是不用繁琐的设置每个按钮的“名字”(暂且这么说),而坏处就是不美观,这个panel的代码我就不拿出来了。

        写完东边的按钮panel后,就该画棋盘了,这个棋盘设置在中间面板上,用一个木纹的图片作为背景图片,然后取画布画棋盘,这个panel我新建了一个类,因为这里的代码很多,很复杂,还有重绘要写,所以用一个类继承Jpanel,直接写在重绘的方法里,因为棋盘线是固定不动的,不管怎么样,每次程序出现时都要画出来,另外在画棋子的时候,要立体感更强烈一些的话,就要对棋子用不同的颜色反复的画,来达到立体棋子的目的,而在做立体棋子的时候我发现一个问题,就是圆形棋子边缘会有锯齿,显得不美观,这里又要用到Graphics2D里面的setRenderingHint方法,小伙伴们可以用API文档查一下,至于这个方法的参数,API文档里面有说明,我把代码个小伙伴们看一下

public class SetCenter extends JPanel implements ChessIml{
	
	//重绘方法
	public void paint(Graphics g){
		//设置父类重绘方法
		super.paint(g);
		//设置画棋盘线
		Graphics2D g2 = (Graphics2D) g; 
		//消除锯齿关闭,否则棋盘线太淡
		g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
				RenderingHints.VALUE_ANTIALIAS_OFF);
		for(int i = 0;i<15;i++){
			//线条粗细
			g2.setStroke(new BasicStroke(2));
			g2.drawLine(19+i*Size, 19, 19+i*Size, 19+14*Size);
			g2.drawLine(19, 19+i*Size, 19+14*Size, 19+i*Size);
		}
}
 

 

 这个是画棋盘的时候所用到的,我在重绘棋子的时候试了一下打开消除锯齿,显得棋盘线会很淡,所以我在绘制棋盘的时候就把消除锯齿关掉了,上面的Size我并没有在这个类里面声明,其实它是在ChessIml这个接口里面,因为棋盘大小Size还有count和row是经常用到的,这个借口里面还有一个二维数组用来存储棋子的位置,还有一个数组队列,这个数组队列是用来做悔棋的时候用的,类型是一个ChessPiece类,这个类里面包含了两个数据成员,r,c,正好用在数组队列中,悔棋的时候根据数组队列来重绘棋盘,做悔棋的时候,这个数组队列是用来辅助二维数组画棋盘用的,为什么不直接用数组队列来画棋盘,主要是有一个黑棋白棋的问题,如果我们用数组队列,就又要用一个标志来存储黑白棋,比较麻烦,这几部分的代码如下

public interface ChessIml {
	//设置棋盘属性
	int Row =15;
	int Count = 15;
	int Size = 38;
	//创建存储棋子的数组
	int [][] SavePiece = new int [15][15];
	//创建数组队列
	ArrayList<ChessPiece> array = new ArrayList();
}
 

 

 

public class ChessPiece {
	
	private int r;
	
	private int c;
	
	public ChessPiece(int row,int count){
		this.c = count;
		this.r = row;
	}
	
	public int GetR(){
		return  r;
	}
	
	public int GetC(){
		return c;
	}
}

 

 监听器当然是少不了的,用一个类继承MouseAdapter,而我们只需要MouseAdapter其中的mousePressed就够了,要画棋子,首先要有画布,画布要从中间面板里面取到,刚开始我写了一个监听器类构造方法,想直接把中间面板在构造的时候传进来,但是后来运行 的时候抛出了一个栈内存溢出异常 ,应该是重复的调用问题,后来在构造方法直接把主GoBong类传进来,然后中间面板自然就能进来了,而且声明主类的时候不能new,那样也会抛出栈异常,这是要特别注意的。要画黑白棋,肯定要有一个标志,因为五子棋不可以连续下两个相同颜色的棋子,用一个boolean类型的flag来标志,每下一个棋子,标志位变换一次。然后比较难的就是画棋子这方面了,因为鼠标不可能每次都正好点在棋盘线的交差点上面,所以要计算每次鼠标的点击位置离哪个坐标最近,然后把位置记录下来存进数组和数组队列里面,最后画出棋子,画旗子的时候要画出立体棋子并不难,只是在fillOval这个方法里面要注意,这个方法画棋子是在鼠标点击的坐标点上以这个点为正方形画内接圆,所以循环画圆的时候要注意坐标的变化。

public class CPListener extends MouseAdapter implements ChessIml {
	//设置x,y坐标
	private int x,y;
	//下棋点坐标
	private int row,count;
	//传入GoBong用,先在此声明变量gb1
	GoBong gb1;
	private Graphics2D g1;
	//黑白棋哨兵
	Boolean flag=false;
	//构造方法,传入GoBong类对象,使得传入ct的画布
	public CPListener(GoBong gb1){
		this.gb1 = gb1;
		
	}
	
	public boolean getFlag(){
		return flag;
	}
	//鼠标按下方法
	public void mousePressed(MouseEvent e) {
		x = e.getX();
		y = e.getY();
		//将ct传入的画布转为
		g1 = (Graphics2D) gb1.ct.getGraphics();
		//消除边缘化锯齿
		g1.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
				RenderingHints.VALUE_ANTIALIAS_ON);
		//计算棋子下落点
		row=(x+(Size/2)-19)/Size;
		count=(y+(Size/2)-19)/Size;
		//System.out.print(x1+"    "+y1);
		//下黑棋
		if(flag){
			if(SavePiece[row][count]==0){
				for(int i = 0;i<10;i++){
				g1.setColor(new Color(0+i*10,0+i*10,0+i*10));
				g1.fillOval(row*Size+2*i, count*Size+2*i, 38-3*i, 38-3*i);
				//下黑棋记为1
				SavePiece[row][count]=1;
				flag = false;
				}
				
				ChessPiece cp = new ChessPiece(row,count);
				array.add(cp);
			}
		}
		//下白旗
		else{
			if(SavePiece[row][count]==0){
				for(int i = 0;i<10;i++){
				g1.setColor(new Color(205+i*5,205+i*5,205+i*5));
				g1.fillOval(row*Size+2*i, count*Size+2*i, 38-3*i, 38-3*i);
				//下白棋记为-1
				SavePiece[row][count]=-1;
				flag = true;
				}
				ChessPiece cp = new ChessPiece(row,count);
				array.add(cp);
			}
		}
	}
}

 

这一步做完了,就是最后的人人对战输赢的判断了,这个判断就是围绕最后下的那一颗棋子的四个方向来判断是否有五个棋子相连,这四个方向并不是前后左右,而是横、竖,还有两个斜着的方向,检查是否有5个棋子相连的时候是一条线一条线上的检查。

五子棋大致就是这些了,还有一部分代码没有粘贴出来,因为我是写完这个之后才写的文章,所以有点思路不是很清晰,需要小伙伴们自己想的多一些。

 

分享到:
评论

相关推荐

    JAVA实战-五子棋程序源代码

    【标题】"JAVA实战-五子棋程序源代码"揭示了本项目的核心是使用Java编程语言实现一个五子棋游戏的完整源代码。在Java世界里,实战项目是提升技能和理解面向对象编程的重要途径。五子棋游戏的实现不仅涉及基本的控制...

    Android4项目实战--五子棋

    【标题】"Android4项目实战--五子棋"是一个针对Android平台开发的五子棋游戏应用的实战教程,旨在帮助开发者提升在Android 4.x版本系统上的应用开发技能,特别是游戏编程方面。在这个项目中,你将学习如何利用...

    基于J2ME的Java游戏--五子棋的开发

    随着移动通信技术的发展,J2ME(Java Micro Edition)作为Java平台的一个重要分支,被广泛应用于移动设备,如手机和掌上设备,提供了丰富的应用程序开发环境。五子棋作为一种普及度高的棋类游戏,适合在移动平台上...

    自定义view实战---五子棋gobang.zip

    五子棋游戏想必大家都非常熟悉,游戏规则十分简单。游戏开始后,玩家在游戏设置中选择人机对战,则系统执黑棋,玩家自己执白棋。双方轮流下一棋,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。 ...

    疯狂java实战演义-第1章_控制台五子棋

    "疯狂 Java 实战演义 - 第 1 章_控制台五子棋" 本章节的主要目的是让读者掌握与理解 Java 编程的基础知识,通过实现一个控制台五子棋游戏来展示五子棋的实现原理。 controls台五子棋游戏的主要功能是让用户用键盘...

    java-Net-wzq-Source.rar_java五子棋_五子棋java_网络 五子棋

    【Java五子棋网络版详解】 本项目是一个基于Java实现的网络五子棋游戏,它允许局域网内的玩家通过网络进行对弈...通过学习和分析该项目,开发者可以深入理解Java网络编程的实战应用,同时也能掌握棋盘游戏的设计思路。

    疯狂java实战演义-第1章 控制台五子棋.doc

    【疯狂java实战演义-第1章 控制台五子棋】 本章主要探讨的是如何在Java控制台环境中实现一个简单的五子棋游戏。五子棋是一种源自中国的双人对弈棋类游戏,目标是在棋盘上连成五个棋子以赢得比赛。尽管控制台版本的...

    Java软件开发实战 Java基础与案例开发详解 20-1 项目实战2-网络五子棋与网络版JQ的开发 共17页.pdf

    根据提供的文档信息,我们可以归纳出该文档主要涵盖了Java软件开发的基础知识及项目实战案例,特别是针对网络五子棋和网络版JQ(类似QQ的聊天工具)的开发过程进行了详细介绍。接下来,我们将从文档的标题、描述以及...

    Java项目开发实战──五子棋游戏

    Java项目开发实战──五子棋游戏.ppt 可以讲解一个全方位的开发实战的经验

    Java软件开发实战 Java基础与案例开发详解 17-1 顶目实战1-单机版五子棋游戏 共5页.pdf

    ### Java软件开发实战:Java基础与案例开发详解 #### 1. Java概述 - **什么是Java**:Java是一种广泛使用的高级编程语言,以其跨平台能力("一次编写,到处运行")而闻名。 - **Java语言特点**:简单、面向对象、...

    Java 初学小项目2 --五子棋.zip

    在本项目"Java 初学小项目2 --五子棋.zip"中,我们将探索如何使用Java编程语言开发一个五子棋游戏。这是一个非常适合初学者的实践项目...实践是检验理论的最好方式,所以动手开始吧,祝你在Java实战的道路上越走越远!

    java网络版五子棋

    【Java网络版五子棋】项目是一个典型的网络编程与游戏开发的结合实例,适用于初学者进行实战练习。这个项目的核心是实现两个玩家通过网络连接进行实时的五子棋对弈。下面将详细介绍该项目中的关键知识点。 1. **...

    五子棋---网络版

    总结来说,五子棋网络版项目是一个集成了Java基础知识、网络编程、图形界面设计等多个技术领域的实战案例,对于学习和提升Java开发技能具有很高的参考价值。通过实际操作,开发者不仅能加深对这些技术的理解,还能...

    疯狂java实战演义 光盘源码

    《 疯狂Java实战演义》以15个生动的Java案例,引领读者体验Java开发的乐趣。书中使用Java的Swing技术开发了若干个游戏,从这些游戏中可以了解到,Java一样可以做出优秀的游戏和应用程序。本书知识点丰富,适合有一定...

    实战突击:java项目开发案例整合源代码

    【标题】"实战突击:Java项目开发案例整合源代码"是一个涵盖了多个实际应用领域的Java编程实践项目,旨在帮助开发者深入理解和应用Java技术。这个资源集合包括了FTP客户端、网络五子棋、电子商城以及BBS论坛等不同...

    JavaGUI小游戏-五子棋

    【JavaGUI小游戏-五子棋】是一个利用Java编程语言实现的图形用户界面(GUI)应用程序,它允许两位玩家在屏幕上进行五子棋游戏对战。这个项目主要涉及到以下几个核心的Java知识点: 1. **Java GUI**:Java GUI是Java...

    java实战项目之五子棋视频及源代码下载(百度云)

    在此介绍下本资源,本次资源是有视频教学的并配合源代码的,但我设置的资源分只有2分,网友上传的五子棋大部分是没有视频教学的,对此不利于学习者的学习,这个五子棋项目训练的是java各知识点,主要有awt、swing...

    五子棋(java开发,适用于java初学者学)

    在本项目中,我们关注的是一个使用Java语言开发的五子棋游戏,它特别适合Java初学者进行学习和实践。这个程序提供了单机双人模式,允许两位玩家在同一台计算机上进行对战。开发者提到他们计划在未来加入人工智能和...

    五子棋 java 小程序

    【五子棋 Java 小程序】是一个基于Java编程语言实现的简单游戏应用,它允许用户在计算机上玩经典的五子棋游戏。这个程序已经完成了编译过程,用户可以直接运行而无需进行额外的编译步骤,这大大简化了用户体验。不仅...

    疯狂java实战演义(pdf+codes)

    疯狂java实战演义(包括pdf 和源代码 压缩后17.5m) gobang: 第1章 控制台五子棋 cal: 第2章 仿Windows计算器 viewer: 第3章 图片浏览器 ball: 第4章 桌面弹球 tetris: 第5章 俄罗斯方块 image: 第6章 仿...

Global site tag (gtag.js) - Google Analytics