五子棋(一)

                                                                  五子棋总结    

  总结错误:

       1、绘制UI时的错误
          (1)将面板添加到窗体上时需写在面板属性的后面。
          (2)空件及组件需写在可见之前。

          (3)绘制棋盘时,重绘,画笔

  //在面板上画线
	public void paintBoard(Graphics g){
		//super.paint(g);不能绘制窗体本身
		for(int i=1;i<=10;i++){
			g.drawLine(50,50*i, 450, 50*i);
			for(int j=1;j<9;j++){
				g.drawLine(50*i, 50, 50*i, 500);	
			}
			
设置全局变量
<pre name="code" class="java">//创建全局的画笔
	Graphics g = null;

 //创建面板对象   功能的实现
	    JPanel boardPanel=new JPanel(){
	    	//当窗体改变时重绘
	    	public void paint(Graphics g){
	    	super.paint(g);
	    	//绘制棋盘
	    	paintBoard(g);
	    	//绘制已经下过的棋子
	    	for(int i=0;i<list.size()/3;i++){
	    		int x=(int) list.get(3*i);
	    		int y=(int) list.get(3*i+1);
	    		Color color=(Color) list.get(3*i+2);
	    		//重画棋子
	    		g.setColor(color);
	    		g.fillOval(x, y, 30, 30);
	    	}
	    		
	    	}
	    };


 
  //棋盘面板获取画笔
	    g=boardPanel.getGraphics();

       2、事件监听

           (1)按钮监听

                     给关于按钮添加监听时需写在它本身的方法中,如果写在鼠标监听中则会出现不能关闭的错误。

	});
	    //给关于按钮添加监听
	    	about.addActionListener(new ActionListener(){

				@Override
				public void actionPerformed(ActionEvent e) {
					//flagabout=false;
					if(flagabout){
						JOptionPane.showMessageDialog(FiveChess.this, "你是猪吗?");
								
						}	
				}})

           (2)鼠标监听


 MouseListener mouselistener=new MouseListener(){
			public void mouseClicked(MouseEvent e) {
				
				if(flagbegin){
				//下棋子
				int x=e.getX();
				int y=e.getY();
				
				
				 
				//距离鼠标单击点最近的交叉点下棋
				for(int i=0;i<=10;i++){//横线
					for(int j=0;j<=9;j++){//竖线
						//所有交叉点通式
						//int x0 = 50*(j-1);
						//int y0 = 50*(i-1);
						int x0 = 50*(j+1);
						int y0 = 50*(i+1);
						//判断 单击点是否在误差范围内 误差范围为50/3
						if((x>x0-50/3&&x<x0+50/3&&y>y0-50/3&&y<y0+50/3)){
							//list获得棋子的坐标,保存到list中;
							list.add(x0-15);
							list.add(y0-15);
							//判断该交叉点是否有棋子
//							if(flagregret){
//								chesses[i][j]=0;cc
//								flagregret = false;
//							}
							if(flagagain)
							for(int i1=0;i1<100;i1++){
							{
								chesses[i][j]=0;
								//flagagain=false;
								
							}}
							if(chesses[i][j]==0){//没有棋子
								//区分颜色
								if(flagregret==true){
						   System.out.println("++++++");
									g.setColor(color);//存储删除后的棋子的颜色
									list.add(color);
									//chesses[i][j]=q;
									flagregret=false;
									
								}
								else if(flagColor == true){
									//保存的颜色,将颜色存入list
									list.add(Color.black);
									//改变画布的颜色
									g.setColor(Color.black);
									chesses[i][j] = 1;//黑色
									flagColor = false;
								}
								else if(flagColor == false){
									//保存的颜色,将颜色存入list
									list.add(Color.white);
									//改变画布的颜色
									g.setColor(Color.white);
									chesses[i][j] = 2;//白色
									flagColor = true;
								}
								//以x,y为圆心画填充圆
								g.fillOval(x0-15,y0-15,30,30);
								//判断输赢
								win(i,j);
								//list获得棋子的坐标;
								
								//list.add(arg0);
								
								}
							
							}
						
						}
					}
				
				}else{
					
					//显示错误
				JOptionPane.showMessageDialog(FiveChess.this, "没有点击开始按钮!");
					
				
			}	 
				//if(flagabout){
					//JOptionPane.showMessageDialog(FiveChess.this, "你是猪吗?");
							
					//	}		 
		
				
			}
			
			
				

			public void mouseEntered(MouseEvent e) {
			}
			public void mouseExited(MouseEvent e) {	
			}
			public void mousePressed(MouseEvent e) {
			}
			public void mouseReleased(MouseEvent e) {
				
			}};
			
			
			
			  
			   //给面板添加鼠标监听
			   boardPanel.addMouseListener(mouselistener);
			   //给关于按钮添加鼠标监听  
			  about.addMouseListener(mouselistener);
			   //给开始按钮添加鼠标监听   
			   begin.addMouseListener(mouselistener);
			   again.addMouseListener(mouselistener);

运行后的界面
			


3、判断输赢

(1)定义win方法

(2)调用方法

根据二维数组的下标判断,进行遍历,判断输赢。

//判断输赢
	public void win(int i,int j){
	
		int count=1;
		int m=1;
		//判断横向向右下
		while(j-m>=0&&chesses[i][j]==chesses[i][j-m]){
			m++;
			count++;
		}
		m=1;
		//判断横向向左下
		while(j+m<10&&chesses[i][j]==chesses[i][j+m]){
			m++;
		    count++;
		}
		//判断纵向向下下
				while(i-m>0&&chesses[i][j]==chesses[i-m][j]){
					m++;
					count++;
				}
				m=1;
				//判断纵向向上下
				while(i+m<10&&chesses[i][j]==chesses[i+m][j]){
					m++;
				    count++;
				}
				//往左上角下
				while(i+m<10&&j-m>=0&&chesses[i][j]==chesses[i+m][j-m]){
					m++;
				    count++;
				}
				m=1;
				//往左下角下
				while(i-m>=0&&j-m>=0&&chesses[i][j]==chesses[i-m][j-m]){
					m++;
				    count++;
				}
				//往右上角下
				while(i+m<10&&j+m<10&&chesses[i][j]==chesses[i+m][j+m]){
					m++;
				    count++;
				}
				m=1;
				//往右下角下
				while(i-m>=0&&j+m<10&&chesses[i][j]==chesses[i-m][j+m]){
					m++;
				    count++;
				}
		//黑棋胜
		if(count>=5&&chesses[i][j]==1){
			//弹出提示框
			JOptionPane.showMessageDialog(this, "黑棋胜");
		}
		//白棋胜
				if(count>=5&&chesses[i][j]==2){
					//弹出提示框
					JOptionPane.showMessageDialog(this, "白棋胜");
				}
	}
	

4、悔棋、重来,对链表中的元素进行删除,根据链表的位置,判断i,j值,判断棋子的位置,将二维数组的标记置零。

  //给悔其按钮添加监听
	    regret.addActionListener(new ActionListener(){
       
			@Override
			public void actionPerformed(ActionEvent e) {
				// 从list中删除一个棋子(三个元素)
				Color color=(Color)list.get(list.size()-1);
				int x0 = (Integer)list.get(list.size()-2);
				int y0 = (Integer)list.get(list.size()-3);
				chesses[x0/50][y0/50] = 0;
				//chesses[x0/50][y0/50]=q;
				list.remove(list.size()-1);
				list.remove(list.size()-1);
				list.remove(list.size()-1);
				
				flagregret= true;
				//强制刷新窗体  执行paint方法
				repaint();
				
			} 
			
			});




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值