`

java五子棋总结和源代码

    博客分类:
  • java
阅读更多

1.用一个状态变量有时可以表示2个状态

  比如color={0,1,2}  color=0 表示没有设置颜色,也表示没有棋子

                               color=1 表示设置棋子为黑色,表示有棋子

                               color=2 表示设置棋子为白色,表示有棋子

 

2.边界判断一定要考虑清楚

    比如绘制x行,y列的棋盘,那么每行棋子数目是x+1,每列棋子数目是y+1,极容易出错

 

3.悔棋,下子之后都要用repaint()方法重绘界面,来显示相应的变化

 

4.计算鼠标点击处对应的格子的数组下标,+d/2的目的就是为了四舍五入

       公式 x=(Math.abs(x1-50)+d/2)/d

 

5.用一个状态变量f来表示是否可以下子,胜负结果出来后,f=false

 

6.源代码网页看的效果不好,复制到eclipse上面看效果更好。共3个文件

6.1Main

package s1222五子棋;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
//

public class Main extends JFrame {
	
	int FrameXLength=700,FrameYLength=700;                   //设置棋盘大小
	MyMouseListener l=new MyMouseListener();                 //创建鼠标事件监听对象
	static public int color[][]=new int[Chess.hang+1][Chess.lie+1];  //记录每个格子的棋子颜色,0表示没有棋子,1表示黑棋,2表示白棋
	//1.注意,画n条直线,n条竖线,那么每行每列都有n+1个棋子,所以数组长度要开n+1个!!!!
	//2.注意,color这一个状态变量就可以表示2中状态,棋子颜色和是否有棋子,color==0就表示没有棋子,我把2个状态变量压缩为1个了
		
	Main()  //构造方法直接画出界面
	{      
		
		  //设置初始各个格子状态为0,表示没有棋子,防止在同一个格子落子;颜色状态为0,表示没有设置颜色******************
		    for(int i=0;i<=Chess.hang;i++)
			for(int j=0;j<=Chess.lie;j++)
			{color[i][j]=0;}
		  //设置初始各个格子状态为0,表示没有棋子,防止在同一个格子落子;颜色状态为0,表示没有设置颜色******************
		    
		   //设置窗体属性************************************************
		   this.setTitle("五子棋");
	       this.setDefaultCloseOperation(3);
	       this.setSize(FrameXLength,FrameYLength);
	       this.setResizable(true);
	       this.setLocationRelativeTo(null);
	       this.setLayout(new BorderLayout());
	       //设置窗体属性************************************************ 
	       
	       //设置左边的面板**********************************************
	       JPanel west=new JPanel();
	       west.setBackground(Color.GRAY);
	       west.setPreferredSize(new Dimension(100,0));
	       west.setLayout(null);
	       //设置左边的面板**********************************************
	       
	 
	       //创建按钮*******************************************
	       EmptyBorder emp=new EmptyBorder(0,0,0,0);
	       JButton j1=new JButton("开始");           //创建按钮
	       j1.setBorder(emp);             			//设置边框
	       j1.setBounds(10, 100, 80, 40); 			//设置按钮的位置
	       j1.setBackground(Color.CYAN);  			//设置按钮底色
	       j1.addActionListener(l);                 //添加事件监听对象
	       west.add(j1);                  			//将按钮添加到窗体中
	 
	       JButton j2=new JButton("认输");
	       j2.setBorder(emp);
	       j2.setActionCommand("认输");
	       j2.setBounds(10, 150, 80, 40);
	       j2.setBackground(Color.CYAN);
	       j2.addActionListener(l);                 //添加事件监听对象
	       west.add(j2);
	 
	       JButton j3=new JButton("悔棋");
	       j3.setBorder(emp);
	       j3.setActionCommand("悔棋");
	       j3.setBounds(10, 200, 80, 40);
	       j3.setBackground(Color.CYAN);
	       j3.addActionListener(l);                 //添加事件监听对象
	       west.add(j3);
	       //创建按钮*******************************************
     
	       //设置绘画的面板***********************************************************************
	       //绘制界面的代码还要仔细看看
	       JPanel  drawpanel =new JPanel()
	       {
					public void paint(Graphics g)         //重写JPanel中的方法
					{
						super.paint(g);
                        int x=Chess.x;     //棋盘起始x坐标
                        int y=Chess.y;     //棋盘起始y坐标
                        int d=Chess.d;     //棋盘间距
                        int hang=Chess.hang;//行数,注意每行棋子最多有hang+1个,所以数组的下标最大值是hang
                        int lie=Chess.lie;  //列数,注意每列棋子最多有hang+1个,所以数组的下标最大值是hang
                        
                        //绘制hang+1条横线,lie+1条竖线,总共hang*lie个格子*****************
						for(int i=0;i<=hang;i++)
						{g.drawLine(x, y+d*i,x+lie*d,y+d*i); //绘制hang+1条横线
						 g.drawLine(x+d*i,y,x+d*i,y+d*hang);}//绘制lie+1条横线
						//绘制hang+1条横线,lie+1条竖线,总共hang*lie个格子*****************
						 for(int i=0;i<MyMouseListener.list.size();i++)
					  	  MyMouseListener.list.get(i).draw(g);	     
					}	
	       };
	       	drawpanel.setBackground(Color.lightGray);
	       	drawpanel.addMouseListener(l);   
	       	//设置绘画的面板***********************************************************************
              
            //设置中间的面板**********************************************  
     		JPanel center=new JPanel();
     	    center.setBackground(Color.WHITE);
     	    center.setLayout(new BorderLayout());
            center.add(drawpanel,BorderLayout.CENTER);
            //设置中间的面板**********************************************
    	  
            //给窗体添加面板,传递画笔*************************************
     	    this.add(center,BorderLayout.CENTER);
	        this.add(west,BorderLayout.WEST);
            this.setVisible(true);  
            Graphics g=drawpanel.getGraphics();
            l.setGraphics(g,drawpanel);          
            //给窗体添加面板,传递画笔*************************************
	}
	public static void main(String[] args) 
	{  Main t1=new Main();	}	
	
}

 6.2Mymouselistener

package s1222五子棋;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

//extends MouseAdapter 因为mouselistener中不是所有方法都要用到,所以用extends比较好
public class MyMouseListener extends MouseAdapter implements ActionListener  
{   
 		int x1,y1;        				//棋子的绝对坐标值
 		Graphics g;            			//声明画笔
 		int x,y;          				//棋子的格子下标
 		int d=Chess.d;              		//棋盘格子间距
 		JPanel drawpanel=null;  		//接收绘画面板对象
 		Boolean black=true,f=true;      //black用来设置棋子颜色,f为false就不能再下棋子
 		public static ArrayList<Chess> list=new ArrayList<Chess>(); //用一个队列来保存棋子信息
 		
    public void setGraphics(Graphics g,JPanel drawpanel)
    {this.g=g; this.drawpanel=drawpanel;}
		
	public void actionPerformed(ActionEvent e) 
	{
	    if(e.getActionCommand().equals("开始"))
	    {   f=true; 
	    	while(list.size()>0)
	    	{
	    		Main.color[list.get(list.size()-1).qizix][list.get(list.size()-1).qiziy]=0;  //设置格子中棋子颜色为没有设置
	    		list.remove(list.size()-1);                               					 //队列中删掉棋子
	    	}	
	    	black=true;
	        drawpanel.repaint();	 }	                                                 //重绘
     
		if(e.getActionCommand().equals("认输")&&f)
		{  f=false;
		   if(black==true)  JOptionPane.showMessageDialog(null,"黑方认输,白方胜利");
		   else            JOptionPane.showMessageDialog(null,"白方认输,黑方胜利");}
	    
		if(e.getActionCommand().equals("悔棋")&&f)                  //悔棋只能在事件里面更改,不能到mousePressed中更改,&&f用的好,借鉴别人的
		{  
			if(list.size()>0)
			{  
				int i=list.get(list.size()-1).qizix;         				//得到最后落子的x坐标
				int j=list.get(list.size()-1).qiziy;         				//得到最后落子的y坐标
				Main.color[i][j]=0; 						  				//颜色状态变量设置为0
				black=!black;								  				//因为悔棋,所以要改变棋子颜色状态变量
				list.remove(list.size()-1);            						//悔棋,悔棋之后要重绘,界面才会显示出区别来
				drawpanel.repaint();                                        //重绘,调用的是重写过的repaint方法
//              for(int i=0;i<MyMouseListener.list.size();i++)      		// 重新绘制不能加在这里,一定要加在主函数
//	  	        {  MyMouseListener.list.get(i).draw(g);	    }     
			}
			else return;
		}
      }


	public void mousePressed(MouseEvent e) 
	{  	if(f)
		{
		x1=e.getX();
		y1=e.getY();
	    x=(Math.abs(x1-50)+d/2)/d;//计算鼠标点击处对应的格子的横坐标是第几格,这个公式很关键,隐含了四舍五入
	    y=(Math.abs(y1-50)+d/2)/d;//计算鼠标点击处对应的格子的纵坐标是第几格,这个公式很关键,隐含了四舍五入

	         if(x>=0&&y>=0&&x<=(Chess.hang)&&y<=(Chess.lie)&&Main.color[x][y]==0)   //棋盘边界判断条件
	         	{   String s;
	        	   if(black)  //判断是黑棋还是白棋	
	        	      {		s="黑棋";
	        		   		g.setColor(Color.BLACK);//设置画笔颜色
	        		   		black=false;            //black=false表示这一次下的是黑棋,改变状态变量的值,下一次就下白棋
	        		   		Main.color[x][y]=1; }   
	        	                           	 	
	        	   else      
	        	   	  {		s="白棋";
	        	   	  		g.setColor(Color.WHITE);//设置画笔颜色
	        	   	  		black=true;				//black=true表示这一次下的是白棋,改变状态变量的值,下一次就下黑棋
	        	   	  		Main.color[x][y]=2; }
	        	   	    
	        	     Chess chess=new Chess(50+x*d-d/2,50+y*d-d/2,Main.color[x][y],x,y);//创建一个棋子对象,保存信息
	        	     list.add(chess);System.out.println("list.size="+list.size());		 //将棋子添加到队列中
	        		 g.fillOval(50+x*d-d/2, 50+y*d-d/2, d, d);           			 	 //画棋子
	         	 	 this.winner(x, y,s);                                				 //判断胜负	      
	         	}	        	    
	         	       
	         else if(Main.color[x][y]!=0)                                 				 //如果点击处已经有棋子了
	        	 {
	        	  JOptionPane.showMessageDialog(null,"无效落子");  
	        	  for(int i=0;i<list.size();i++)  list.get(i).draw(g);			//弹出信息框之后会重画,所以要这2行代码。	         	      
	        	 }
		}}
	
	public void winner(int x,int y,String s)
	{     int x11=x-4,y11=y-4,x22=x+4,y22=y+4;
		  int count1=0,count2=0,count3=0,count4=0;
		  String t=s;
		 
		 for(int i=x11;i<=x22;i++)//判断从左到右,从上到下斜向是否胜利
	          {   
	        	  if(i>=0&&y11>=0&&i<=Chess.hang&&y11<=Chess.lie)
	        	  {   
	        	     if(Main.color[i][y11++]==list.get(list.size()-1).color) count1++;  else count1=0;//颜色相同计数+1
	                 if(count1==5) {JOptionPane.showMessageDialog(null, t+"Win");f=false;}            //连续五个相同,则胜利
	        	  }
	        	  else{y11++;}
	          }

		 x11=x-4;y11=y-4;x22=x+4;y22=y+4;//初始化参数,再执行判断
for(int i=x11;i<=x22;i++)//判断从左到右,从下到上斜向是否胜利
         	{   
			 	if(i>=0&&y22>=0&&i<=Chess.hang&&y22<=Chess.lie)
			 	{    
			 		if(Main.color[i][y22--]==list.get(list.size()-1).color) count2++;  	else count2=0; //颜色相同计数+1	 	
			 		if(count2==5) {JOptionPane.showMessageDialog(null, t+"Win");f=false;}			   //连续五个相同,则胜利
			 	}
			 	else{y22--;}
         }
		 
		  x11=x-4;y11=y-4;x22=x+4;y22=y+4;//初始化参数,再执行判断
for(int i=x11;i<=x22;i++)//判断从左到右,横向是否胜利
		 	{   
			 	if(i>=0&&i<=Chess.hang)
			 	{    
			 		if(Main.color[i][y]==list.get(list.size()-1).color) count3++;       else count3=0;	//颜色相同计数+1
			 		if(count3==5) {JOptionPane.showMessageDialog(null, t+"Win");f=false;}			    //连续五个相同,则胜利		
			 	}		
		 	}
		 
		  x11=x-4;y11=y-4;x22=x+4;y22=y+4;//初始化参数,再执行判断
for(int i=y11;i<=y22;i++)//判断从左到右,横向是否胜利
		 	{   
			 	if(i>=0&&i<=Chess.lie)
			 	{    
			 		if(Main.color[x][i]==list.get(list.size()-1).color)  count4++;		else count4=0;	//颜色相同计数+1
			 		if(count4==5) {JOptionPane.showMessageDialog(null, t+"Win");f=false;}		 	    //连续五个相同,则胜利
			 	}		
		 	}	
	}

}

 6.3chess  用来设置棋盘属性,

package s1222五子棋;

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

public class Chess {
	public static final int hang=12;     //棋盘行数
	public static final int lie=12;      //棋盘列数
	public static final int x=50;        //棋盘左上角x坐标
	public static final int y=50;        //棋盘左上角y坐标
	public static final int d=40;        //棋盘格子间距

	int x1;    //棋子的绝对坐标
    int y1;    //棋子的绝对坐标
    int color; //0表示未设置颜色,1表示黑色,2表示白色
    int qizix; //棋子的格子下标
    int qiziy; //棋子的格子下标
   
     public Chess(int x,int y,int color,int qizix,int qiziy)  //构造方法
     { this.x1=x;
       this.y1=y;  	 
       this.color=color;
       this.qizix=qizix;
       this.qiziy=qiziy;
     }
     
     public void draw(Graphics g)                             //绘图
     {  if(color==1) g.setColor(Color.BLACK);
        if(color==2) g.setColor(Color.WHITE);
        g.fillOval(x1, y1, d, d);      	 
     }

}

 

分享到:
评论

相关推荐

    Java五子棋游戏完整源代码+详细注释【适合初学者】

    Java五子棋游戏完整源代码 界面美观 详细注释【适合初学者】 java 五子棋游戏源码 java初学者 java游戏源码 java入门 【特点】界面美观 详细注释 【推荐】java初学者参考学习之用 Java五子棋游戏完整源代码 界面...

    计网课程设计Java写的五子棋源代码.zip

    计网课程设计Java写的五子棋源代码计网课程设计Java写的五子棋源代码计网课程设计Java写的五子棋源代码计网课程设计Java写的五子棋源代码计网课程设计Java写的五子棋源代码计网课程设计Java写的五子棋源代码计网课程...

    五子棋java全套源代码

    【五子棋Java全套源代码】是一个基于Java Swing开发的桌面应用程序,专为五子棋爱好者设计。在这款游戏中,玩家可以与计算机进行对弈,体验经典的五子棋玩法。Swing是Java的一个图形用户界面(GUI)工具包,它允许...

    java小游戏 (源码)swing五子棋源代码

    java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源...

    java五子棋源代码

    java五子棋源代码 java五子棋源代码 java五子棋源代码 java五子棋源代码 java五子棋源代码 可实现人机对战!

    基于java的开发源码-Java网络五子棋的源代码.zip

    基于java的开发源码-Java网络五子棋的源代码.zip 基于java的开发源码-Java网络五子棋的源代码.zip 基于java的开发源码-Java网络五子棋的源代码.zip 基于java的开发源码-Java网络五子棋的源代码.zip 基于java的开发...

    Java 网络版五子棋(含源代码)

    在Java五子棋中,Swing组件如JFrame、JButton、JPanel和JLabel等被用来创建棋盘、按钮(悔棋、认输等操作)以及聊天窗口。Swing提供了事件监听机制,使得用户可以与界面交互,例如点击棋盘上的格子进行落子,或者...

    java课程设计:基于java实现的单机五子棋游戏的源代码.zip

    java课程设计:基于java实现的单机五子棋游戏的源代码 java课程设计:基于java实现的单机五子棋游戏的源代码 java课程设计:基于java实现的单机五子棋游戏的源代码 java课程设计:基于java实现的单机五子棋游戏的源...

    Java五子棋游戏源代码集锦

    【】514]java编写的智能五子棋【】five【】fiveChess【】FiveInARow【】Java五子棋代码【】java实现五子棋【】java编写的一个简单的五子棋程序【】java编的五子棋【】一个很有趣的五子棋源代码java【】五子棋【IT教 ...

    java 五子棋简单版源代码

    一个简单的五子棋程序,是我在上java课程时候的一个小练习,比较简单,主要是为了锻炼逻辑思维能力,一点点小的体会:做程序的时候 或许没有思路,但是可以先架设大的框架,有一个大概要做成的样子要在大脑中形成,...

    Java五子棋游戏源代码

    通过分析这份Java五子棋游戏源代码,我们可以看到Java语言在图形界面设计和游戏逻辑处理上的应用。游戏实现了基本的用户交互和简单的智能,如自动判断输赢并提供重新开始游戏的功能。对于学习Java编程,特别是图形...

    五子棋java源代码网络版

    【五子棋java源代码网络版】是一款使用Java编程语言实现的在线对弈五子棋游戏。这款程序允许用户通过网络进行实时对战,提供了一个交互式的平台,让玩家可以体验到传统桌面游戏的乐趣,同时享受互联网带来的便利。在...

    Android手机版Java五子棋源代码

    【Android手机版Java五子棋源代码】是一款专为Android平台设计的移动应用程序,它使用Java编程语言编写,为开发者提供了一个实现五子棋游戏的完整示例。此源代码不仅适用于娱乐,更是一个宝贵的教育资源,对于想要...

    java毕业设计——基于java的五子棋游戏的设计与开发(源代码+论文).zip

    java毕业设计——基于java的五子棋游戏的设计与开发(源代码+论文).zip java毕业设计——基于java的五子棋游戏的设计与开发(源代码+论文).zip java毕业设计——基于java的五子棋游戏的设计与开发(源代码+论文).zip ...

    java 网络五子棋源代码

    总的来说,这个【Java网络五子棋源代码】项目涵盖了Java基础、GUI编程、网络编程、自定义协议设计、游戏逻辑和可能的AI策略等多个IT领域的知识点,对于想要提升Java全栈技能的开发者来说,是一个极好的学习和实践...

    Java网络五子棋源代码

    【Java网络五子棋源代码】是一个典型的Java编程项目,主要涵盖了网络编程、图形用户界面(GUI)设计以及游戏逻辑的实现。这个项目包括服务器端和客户端两大部分,旨在实现玩家之间的在线对战功能,同时提供了游戏...

Global site tag (gtag.js) - Google Analytics