`
古尔丹之颅
  • 浏览: 30846 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

java游戏之 五子棋实现人人对战!

阅读更多

五子棋,是我们大家都喜爱玩的智力棋类游戏,在学完了界面以及绘图之后便一直想做一个,如今终于如愿以偿,虽然还没有更好的美化该游戏,但是大局已定。高兴!

 

五子棋我们需要很多常量,比如说棋子的大小,棋盘格子的间距,棋盘行列的其实位置。所以我们需要首先定义一个借口来存储这些常量,以便我们能更好的使用它,以及更快捷的改变其值的大小。

package com.czh130708;

public interface Config {
		public static final int x=45;
		public static final int y=45;//x,y的起始位置
		public static final int row=15;
		public static final int columns=15;
		public static final int csize=30;
		public static final int size=45;
		public static final int[][] chess = new int[row][columns];
}

 

 

其次我们要定义一个棋盘界面,该界面类继承了JFrame。在该类中我们获取了画布,实例化了鼠标事件对象。重写了paint方法,并在该方法中调用了画棋盘的方法,以及棋子和棋盘的重绘方法。

package com.czh130708;

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

import javax.swing.JFrame;

public class MyDraw extends JFrame{
		Graphics g;
		public static void main(String [] args){
			MyDraw dl = new MyDraw();
			dl.initUI();
}
		private void initUI() {			
			this.setName("五子棋");
			this.setSize(1100,730);//设置窗口大小
			this.setDefaultCloseOperation(3);
			this.setLocation(00,00);//设置窗口位置
			this.setVisible(true);	
				
			this.g=this.getGraphics();
			ChessL cl=new ChessL(g);			
			this.addMouseListener(cl);
		}
			public void paint(Graphics g){
				//调用父类的重绘方法
				super.paint(g);
				drawChessTable(g);
				draw(g);
			}			
			public void drawChessTable(Graphics g){
				//绘制棋盘
				super.paint(g);
				//绘制15条横线
				for(int i=0;i<Config.row;i++)
					g.drawLine(Config.x, Config.y+Config.size*i,Config.row*Config.size,Config.y+Config.size*i);				
				//绘制15条竖线
				for(int j=0;j<Config.columns;j++)
					g.drawLine(Config.x+Config.size*j, Config.y,Config.x+Config.size*j,Config.columns*Config.size);					
			}
			//棋子重绘的方法
			public void draw(Graphics g){
				for(int i=0;i<Config.chess.length;i++){
					//数组的每一个元素其实是一个一维数组
					for(int j=0;j<Config.chess[i].length;j++){
						    if(Config.chess[i][j]==1){
							//如果是黑子,就为1
							g.setColor(Color.black);
							g.fillOval(Config.x+Config.size*i-Config.size/2, Config.y+Config.size*j-Config.size/2, Config.size, Config.size);
						
						}else 
							if(Config.chess[i][j]==-1){
							//如果是白子,就是-1
							g.setColor(Color.WHITE);
							g.fillOval(Config.x+Config.size*i-Config.size/2, Config.y+Config.size*j-Config.size/2, Config.size, Config.size);
									
					}
				}				
			}
			}
}

 

 

五子棋游戏的重中之重我觉得就是两个人交互下棋的方法定义。

首先我们要获得鼠标事件发生时,所得到的位置,并循环遍历棋盘,得到该位置最接近的横纵直线的焦点位置,并在该位置上画上一颗棋子。

当下第二颗棋子时,颜色不能与上一颗一样,并且切记已经下过棋子的地方不能再次下棋,所以我们需要一个数组来记住所有下过棋子的地方,并且给该位置设置一个权值,该权值会记住该位置下的是黑棋还是白旗。

 

判定胜负方式也是重点。因为我们需要判断横向斜向纵向每一条线上是否有五颗棋子相连,若有五颗棋子相连则提示胜出!

在棋子重绘的方法中我们也会用到数组。

五子棋的代码实现如下!

package com.czh130708;

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

import javax.swing.JOptionPane;

public class ChessL extends MouseAdapter {
		private Graphics g;
		private int c=0;//计数器	
		public ChessL(Graphics g) {
			this.g=g;				
		}		
		//定义一个鼠标监听器
		public void mouseReleased(MouseEvent e){
			int x1 = e.getX();
			int y1 = e.getY();
			
			for(int i=0;i<Config.columns;i++){
			for(int j=0;j<Config.row;j++){
				
					if(Config.chess[i][j] == 0){
					int x=Config.x+Config.size*i;//横坐标
					int y=Config.y+Config.size*j;//纵坐标

					//与圆心的误差为三分之一size/3
					if(x1>x-Config.size/3 && x1 < x+Config.size/3 && y1>y-Config.size/3 && y1<y+Config.size/3){					
							if(c == 0){
								Config.chess[i][j]=1;//如果是黑子,就为1
								g.setColor(Color.black);
								c++;
							}else{
								Config.chess[i][j]=-1;//如果是白子,就是-1
								g.setColor(Color.WHITE);
								c--;								
							}
							//以交叉点为圆心画圆
							
							g.fillOval(x-Config.size/2, y-Config.size/2, Config.size, Config.size);	
							this.checkrow(i,j);
							this.checkcolumns(i,j);
							this.checkrowc(i,j);
							this.checkrcolumns(i,j);						
					}																	
				}
			}
		}
	}
		//检查横向是否有五子相连向右
		public int checkrow(int x,int y){
			int count=0;				
			for(int i=x;i<Config.row;i++){
				if(Config.chess[i][y]==Config.chess[x][y]){
					count++;
				}
				else{
					break;
				}
			}
			//向左
			for(int i=x-1;i>=0;i--){
				if(Config.chess[i][y]==Config.chess[x][y]){
					count++;
				}
				else{
					break;
				}
			}
			if(count>=5){
				JOptionPane.showMessageDialog(null,
						"大神,你胜利了");
				
			}
			return count;
			
		}
		
		//检查纵向是否有五子相连
		public int checkcolumns(int x,int y){			
			int count=0;
		
			for(int i=y;i<Config.columns;i++){
				if(Config.chess[x][i]==Config.chess[x][y]){
					count++;
				}
				else{
					break;
				}
			}
			for(int i=y-1;i>=0;i--){
				if(Config.chess[x][i]==Config.chess[x][y]){
					count++;
				}
				else{
					break;
				}
			}
			if(count>=5){
				JOptionPane.showMessageDialog(null,
						"大神,你胜利了");				
			}

			return count;
			}

		
		//斜向方向是否有棋子
		public int checkrowc(int x,int y){
			int count=0;
		

			for(int i=x,j=y;i<Config.row&&j<Config.columns;i++,j++){
				
				if(Config.chess[x][y]==Config.chess[i][j]){
					count++;
				}
				else{
					break;
				}}
				for(int i=x-1,j=y-1;i>=0&&j>=0;i--,j--){
					
					if(Config.chess[x][y]==Config.chess[i][j]){
						count++;
					}
					else{
						break;
					}}
				if(count>=5){
					JOptionPane.showMessageDialog(null,
							"大神,你胜利了");				
				}
				return count;
}		
		
		public int checkrcolumns(int x,int y){
			int count=0;
			for(int i=x,j=y;i<Config.row&&j>=0;i++,j--){
				
				if(Config.chess[x][y]==Config.chess[i][j]){
					count++;}
				
				else{
					break;
				}}
				for(int i=x-1,j=y+1;i>=0&&j<Config.columns;i--,j++){
					
					if(Config.chess[x][y]==Config.chess[i][j]){
						count++;
					}
					else{
						break;
					}}
				if(count>=5){
					JOptionPane.showMessageDialog(null,
							"大神,你胜利了");				
				}
				return count;
}
}

 

0
0
分享到:
评论
3 楼 古尔丹之颅 2013-07-24  
不可以啊,要是棋子不重绘的话,只要界面移动或者最小化之后,棋子就都没有了!
2 楼 杨柳之 2013-07-24  
“重绘棋子”那块方法代码是不是可以不要
1 楼 xuyi1994 2013-07-22  
华哥  

相关推荐

    java五子棋人人对战可悔棋

    【Java五子棋人人对战可悔棋】是一款基于Java编程语言实现的两人对弈的五子棋游戏,允许玩家在走错棋步时进行悔棋操作,为玩家提供了更加自由的游戏体验。该项目由个人独立完成,并获得了老师的高度评价,成绩A+。...

    五子棋人人对战小游戏java代码

    【五子棋人人对战小游戏】是基于Java编程语言实现的一款经典桌面游戏,它通过简单的图形界面让两位玩家可以在线上或本地进行实时对战。这款游戏的代码结构清晰,易于理解,非常适合初学者学习和研究Java图形用户界面...

    java实现的人人对战五子棋

    标题 "java实现的人人对战五子棋" 暗示了这是一个使用Java编程语言开发的五子棋游戏,允许两个玩家通过网络或同一设备进行对战。在五子棋游戏中,目标是先将五个棋子连成一线(水平、垂直或对角线)的玩家获胜。下面...

    Java 五子棋 人人对战

    【Java五子棋人人对战】是一个基于Java编程语言实现的简单桌面游戏,它允许两位玩家在同一设备上进行对弈。这个项目可能是为一个IT课程的实验报告而创建的,但与作者之前的作品相比,其功能可能有所简化,因为描述中...

    java五子棋的实现,实现人人对战,人机对战

    java五子棋的实现,适合学生的课程设计,希望能够帮到大家,实现人机对战,和人人对战功能模式,有时间统计

    java五子棋人人对战.rar

    Java五子棋人人对战程序是一款使用Java编程语言开发的桌面游戏应用,它实现了玩家与玩家之间的实时对弈。此程序具有丰富的功能,包括开始新游戏、重新开始、悔棋等,满足了用户在游戏过程中的多种需求。此外,它还...

    java实现五子棋人机智能对战/人人网络对战

    用Java实现的五子棋的对战小游戏,实现了人人网络对战,人机对战,拥有界面,在使用的时候记得将src下面的所有素材放到bin目录下方可正常运行,导入Eclipse即可运行。

    java五子棋(人机对战、人人对战)总共三个还有算法!

    【标题】中的“java五子棋(人机对战、人人对战)”指的是一个用Java编程语言开发的五子棋游戏,它包含了两种模式:人机对战和人人对战。在人机对战模式中,玩家可以与计算机进行对抗;在人人对战模式下,两个玩家...

    java开发的五子棋人人对战

    总结来说,"java开发的五子棋人人对战"项目是一个基础的Java GUI编程实践,涵盖了图形界面设计、事件处理和基本的游戏逻辑实现。虽然没有AI,但扩展到人机对战模式将是一个提升游戏体验的好方法,同时也对开发者提出...

    五子棋 人人对战 人机对战

    《五子棋游戏详解:人人对战与人机对战技术》 五子棋,作为一项深受人们喜爱的传统智力游戏,其简洁的规则和深奥的策略性使其在电子游戏领域也有着广泛的适应性。本篇文章将围绕"五子棋 人人对战 人机对战"这一主题...

    wuziqi.rar_java 五子棋 人人对战_五子棋人人

    在本项目中,我们关注的是一个基于Java实现的五子棋游戏,专为"人人对战"模式设计。五子棋是一种古老的双人棋类游戏,目标是在棋盘上连成五个棋子以获胜。这个Java项目对于初学者来说特别有价值,因为它提供了简单...

    Java编程实现五子棋人人对战代码示例

    Java编程实现五子棋人人对战代码示例 本资源主要介绍了Java编程实现五子棋人人对战代码示例,具有一定借鉴价值,需要的朋友可以参考下。下面将详细讲解该示例的知识点。 一、Java基础知识 1. Java基本数据类型:...

    wuziqi.rar_java 五子棋_wuziqi_五子棋 java_五子棋 人人 对战

    【描述】"这是一个五子棋小代码,只有人人对战,没有智能." 这句话揭示了这个项目的特点:它的代码量不大,专注于提供两个人之间的人工对战功能,即玩家与玩家之间的实时对弈,而没有包含AI(人工智能)对战模式。...

    人人对战五子棋 java

    ### 人人对战五子棋 Java 程序解析 #### 概述 这段代码实现了一个简单的五子棋游戏,采用 Java 编程语言完成。它允许两名玩家在同一个计算机上进行对战,通过鼠标点击放置棋子。下面将详细分析代码中的关键部分及其...

    五子棋(人人对战) Java版

    五子棋是世界智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏,是世界智力运动会竞技项目之一,通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成5子连线者获胜。 棋具与围棋通用,...

    java五子棋人机人人

    Java五子棋人机人人项目是一个利用Java编程语言实现的五子棋游戏,它支持人与人对战、人与计算机对战以及计算机与计算机之间的对战模式。在这个项目中,我们将探讨Java编程基础、图形用户界面(GUI)设计、算法实现...

    五子棋的人人对战代码(仅在AVD上运行过)

    本文将详细讲解基于Java实现的五子棋人人对战代码的相关知识。对于初学者来说,这是一个很好的实践项目,能够帮助理解和应用基础的编程概念,尤其是针对游戏开发。 五子棋是一种双人对弈的策略棋类游戏,目标是先在...

    安卓五子棋人人对战

    【安卓五子棋人人对战】是一个专门为Android平台设计的双人对弈应用,它允许两位玩家在同一设备上进行实时的五子棋游戏。这款应用的核心特性是利用自定义View来构建游戏界面,以实现更加灵活和高效的游戏交互。下面...

    java swing 人机对战 五子棋

    主要是一个五子棋游戏,利用java swing技术编写,总共只有一个类,两个内部类。人机对战

    java实现五子棋,实现了人机人人两种模式

    本文将详细解析如何使用Java语言来实现一个五子棋游戏,涵盖人机对战和人人对战两种模式。 首先,我们要了解Java编程语言。Java是一种面向对象的、跨平台的编程语言,它的“一次编写,到处运行”特性使得它成为开发...

Global site tag (gtag.js) - Google Analytics