精华内容
下载资源
问答
  • Java小程序之山寨版超级玛丽

    万次阅读 多人点赞 2017-01-06 00:55:04
    Java小程序之山寨版超级玛丽 一、游戏基本功能 1、能够向左向右行走(键盘监听) 2、能够跳跃 3、能够发射子弹 4、能够检测和障碍物之间的碰撞 5、背景图片的移动 二、游戏运行界面 三、游戏大致实现...

    Java小程序之山寨版超级玛丽

    一、游戏基本功能
    1、能够向左向右行走(键盘监听)
    2、能够跳跃
    3、能够发射子弹
    4、能够检测和障碍物之间的碰撞
    5、背景图片的移动

    二、游戏运行界面



    三、游戏大致实现思路:

    1.窗体
    2.自己角色的添加
    3.背景图片的添加
    4
    .背景图片的移动
    5.人物的移动和跳跃
    6.砖头、水管等等障碍物的添加
    7.任务和障碍物的碰撞

    难点分析:
    1.人物的多键控制
    1)给人物设定方向boolean变量:向左、向右、向上、向下
    2)通过键盘监听来修改方向的变量值
          按下某个键的时候,我们把相应方向改为true,释放的时候改false

    2.地图配置
    自定义文件读取方式实现:文件流的使用和字符串String类的方法调用

    3.碰撞检测
    封装一个Rectangle类的对象

    4.子弹添加
    1)先定义一个容器,这个用于封装所有的子弹对象
    2)按下某个键的时候,创建一个子弹对象(以角色的坐标为基准初始化)
    3)把子弹对象添加到容器当中
    4)在paint方法中,遍历容器,取出子弹对象并进行绘制

    5)检测子弹如果超出了窗体边界,则需要把当前子弹从容器当中移除掉


    四、程序源代码:
    代码结构图:分了三个包、敌人类包、游戏界面类包、游戏地图配置包

    com.huaxin.mario包:
    package com.huaxin.mario;
    
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.util.ArrayList;
    
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    
    import com.huaxin.enery.Enery;
    import com.huaxin.enery.Pipe;
    
    import Util.Map;
    
    public class GameFrame extends JFrame{
    	
    	public Mario mario;
    	public Enery pipe,cion,brick;
    	//背景图片
    	public BackgroundImage bg ;
    	
    	//容器装敌人
    	public ArrayList<Enery> eneryList = new ArrayList<Enery>();
    	
    	//子弹容器
    	public ArrayList<Boom> boomList = new ArrayList<Boom>();
    	
    	//子弹的速度
    	public int bspeed=0;
    	
    	//画地图,制定规则,是1画砖头,是2画金币,是3画水管
    	public int [][] map =null;
    	
    	//构造函数里面初始化背景图片和马里奥对象
    	public GameFrame() throws Exception {
    		
    		mario = new Mario(this);
    		mario.start();
    		Map mp= new Map();
    		bg = new BackgroundImage();
    		
    		//窗体重绘线程
    		new Thread(){
    			public void run(){
    				while(true){
    					//重绘窗体
    					repaint();
    					//检查子弹是否出界
    					checkBoom();
    					try {
    						Thread.sleep(10);
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    				}
    			}
    		}.start();
    		
    		map=mp.readMap();
    		//读取地图,并配置地图
    		for (int i = 0; i < map.length; i++) {
    			for (int j = 0; j < map[0].length; j++) {
    				//读取到的是1,画砖头
    				if(map[i][j]==1){
    					brick = new Pipe(j*30,i*30,30,30,new ImageIcon("image/brick.png").getImage());
    					eneryList.add(brick);
    				}
    				//读到2画金币
    				if(map[i][j]==2){
    					cion = new Pipe(j*30,i*30,30,30,new ImageIcon("image/coin_brick.png").getImage());
    					eneryList.add(cion);
    				}
    				//读到3画水管
    				if(map[i][j]==3){
    					pipe = new Pipe(j*30,i*30,60,120,new ImageIcon("image/pipe.png").getImage());
    					eneryList.add(pipe);
    				}
    				
    			}
    		}
    		//设置背景音乐
    		com.huaxin.music.Util.startMusic("music/bg1.wav");
    	}
    	
    	public void initFrame(){
    		//设置窗体相关属性
    		this.setSize(800,450);
    		this.setTitle("山寨版超级玛丽");
    		this.setResizable(false);
    		this.setLocationRelativeTo(null);
    		this.setDefaultCloseOperation(3);
    		this.setVisible(true);
    		
    		//该窗体添加键盘监听
    		KeyListener kl = new KeyListener(this);
    		this.addKeyListener(kl);
    	}
    	
    	public void paint(Graphics g) {
    		//利用双缓冲画背景图片和马里奥
    		BufferedImage bi =(BufferedImage)this.createImage(this.getSize().width,this.getSize().height);
    		Graphics big =bi.getGraphics();
    		big.drawImage(bg.img, bg.x, bg.y, null);
    		
    		for (int i = 0; i <eneryList.size(); i++) {
    			Enery e =eneryList.get(i);
    			big.drawImage(e.img, e.x, e.y, e.width, e.height,null);
    		}
    		
    		//画子弹
    		for (int i = 0; i < boomList.size(); i++) {
    			Boom b =boomList.get(i);
    			Color c =big.getColor();
    			big.setColor(Color.red);
    			big.fillOval(b.x+=b.speed, b.y, b.width, b.width);
    			big.setColor(c);
    		}
    		
    		//画人物
    		big.drawImage(mario.img, mario.x, mario.y, mario.width, mario.height,null);
    		g.drawImage(bi,0,0,null);
    		
    	}
    	
    	//检查子弹是否出界,出界则从容器中移除,不移除的话,内存会泄漏
    	public void checkBoom(){
    		for (int i = 0; i < boomList.size(); i++) {
    			Boom b = boomList.get(i);
    			if(b.x<0 || b.x>800){
    				boomList.remove(i);
    			}
    		}
    	}
    
    }
    

    package com.huaxin.mario;
    
    import java.awt.Image;
    import java.awt.Rectangle;
    
    import javax.swing.ImageIcon;
    
    import com.huaxin.enery.Enery;
    
    //自己的角色类
    public class Mario extends Thread{
    	
    	public GameFrame gf;
    	
    	public boolean jumpFlag=true;
    	
    	//马里奥的坐标
    	public int x=0,y=358;
    	//马里奥的速度
    	public int xspeed=5,yspeed=1;
    	//马里奥的宽高
    	public int width=30,height=32;
    	//马里奥的图片
    	public Image img = new ImageIcon("image/mari1.png").getImage();
    	
    	public boolean left=false,right=false,down=false,up=false;
    	
    	public String Dir_Up="Up",Dir_Left="Left",Dir_Right="Right",Dir_Down="Down";
    	
    	
    	public Mario (GameFrame gf) {
    		this.gf=gf;
    		this.Gravity();
    	}
    	
    	public void run(){
    		while(true){
    			//向左走
    			if(left){
    				//碰撞到了
    				if(hit(Dir_Left)){
    					this.xspeed=0;
    				}
    				
    				if(this.x>=0){
    					this.x-=this.xspeed;
    					this.img=new ImageIcon("image/mari_left.gif").getImage();
    				}
    				
    				this.xspeed=5;
    			}
    			
    			//向右走
    			if(right){
    				
    				if(hit(Dir_Right)){
    					this.xspeed=0;
    				}
    				//任人物向右移动
    				if(this.x<400){
    					this.x+=this.xspeed;
    					this.img=new ImageIcon("image/mari_right.gif").getImage();
    				}
    				
    				if(this.x>=400){
    					//背景向左移动
    					gf.bg.x-=this.xspeed;
    					//障碍物项左移动
    					for (int i = 0; i <gf.eneryList.size(); i++) {
    						Enery enery = gf.eneryList.get(i);
    						enery.x-=this.xspeed;
    					}
    					this.img=new ImageIcon("image/mari_right.gif").getImage();
    				}
    				this.xspeed=5;
    			}
    			
    			//向上跳
    			if(up){
    
    				if(jumpFlag && !isGravity){
    					jumpFlag=false;
    					new Thread(){
    						public void run(){
    							jump();
    							jumpFlag=true;
    						}
    					}.start();
    				}
    			}
    			
    			try {
    				this.sleep(20);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    	
    	
    	//向上跳的函数
    	public void jump(){
    		int jumpHeigh=0;
    		for (int i = 0; i < 150; i++) {
    			gf.mario.y-=this.yspeed;
    			jumpHeigh++;
    			if(hit(Dir_Up)){
    				break;
    			}
    			try {
    				Thread.sleep(5);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    		for (int i = 0; i <jumpHeigh; i++) {
    			gf.mario.y+=this.yspeed;
    			if(hit(Dir_Down)){
    				this.yspeed=0;
    			}
    			try {
    				Thread.sleep(5);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    			
    			
    		}
    		this.yspeed=1;//还原速度
    	}
    	
    	//检测碰撞
    	public boolean hit(String dir){
    		Rectangle myrect = new Rectangle(this.x,this.y,this.width,this.height);
    		Rectangle rect =null;
    		
    		for (int i = 0; i < gf.eneryList.size(); i++) {
    			Enery enery = gf.eneryList.get(i);
    			
    			if(dir.equals("Left")){
    				rect = new Rectangle(enery.x+2,enery.y,enery.width,enery.height);
    			}
    			else if(dir.equals("Right")){
    				rect = new Rectangle(enery.x-2,enery.y,enery.width,enery.height);
    			}
    			
    			else if(dir.equals("Up")){
    				rect = new Rectangle(enery.x,enery.y+1,enery.width,enery.height);
    			}else if(dir.equals("Down")){
    				rect = new Rectangle(enery.x,enery.y-2,enery.width,enery.height);
    			}
    			//碰撞检测
    			if(myrect.intersects(rect)){
    				return true;
    			}
    		}
    		
    		return false;
    	}
    	
    	//检查是否贴地
    	public boolean isGravity=false;
    	
    	public void Gravity(){
    			new Thread(){
    				public void run(){
    					
    					while(true){
    						try {
    							sleep(10);
    						} catch (InterruptedException e) {
    							e.printStackTrace();
    						}
    						
    						if(!jumpFlag){
    							
    						}
    						
    						while(true){
    							if(!jumpFlag){
    								break;
    							}
    							
    							if(hit(Dir_Down)){
    								break;
    							}
    							
    							if(y>=358){
    								isGravity=false;
    							}
    							else{
    								isGravity=true;
    								y+=yspeed;
    							}
    							
    							try {
    								sleep(10);
    							} catch (InterruptedException e) {
    								e.printStackTrace();
    							}
    					}
    				}
    				}
    			}.start();
    	
    	}
    }
    

    package com.huaxin.mario;
    
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;
    
    import javax.swing.ImageIcon;
    
    
    //键盘按下监听类
    public class KeyListener extends KeyAdapter{
    	
    	public GameFrame gf;
    	public boolean jumpFlag=true;
    	
    	public KeyListener(GameFrame gf) {
    		this.gf=gf;
    	}
    	
    	//键盘监听
    	public void keyPressed(KeyEvent e) {
    		int code = e.getKeyCode();
    		switch(code){
    		//向右走
    		case 39:
    			gf.mario.right=true;
    			break;
    			//向左走
    		case 37:
    			gf.mario.left=true;
    		break;
    		
    		case 66:
    			addBoom();
    		break;
    		
    		//向上跳
    		case 74:
    			gf.mario.up=true;
    			break;
    	}
    	}
    	
    	//添加子弹
    	public void addBoom() {	
    		Boom b = new Boom(gf.mario.x,gf.mario.y+5,10);
    		if(gf.mario.left) b.speed=-2;
    		if(gf.mario.right) b.speed=2;
    		gf.boomList.add(b);
    	}
    
    	//键盘释放监听
    	public void keyReleased(KeyEvent e) {
    		
    		int code=e.getKeyCode();
    		if(code==39){
    			
    			gf.mario.right=false;
    			
    			gf.mario.img=new ImageIcon("image/mari1.png").getImage();
    		}
    		if(code==37){
    			gf.mario.left=false;
    			
    			gf.mario.img=new ImageIcon("image/mari_left1.png").getImage();
    		}
    		
    		if(code==74){
    			gf.mario.up=false;
    			
    		}
    	}
    
    }
    

    package com.huaxin.mario;
    
    import java.awt.Image;
    
    import javax.swing.ImageIcon;
    
    public class BackgroundImage {
    	
    	public int x=0,y=0;
    	public int ox=0,oy=0;
    	public Image img=new ImageIcon("image/startBack.jpg").getImage();
    
    }
    

    package com.huaxin.mario;
    
    //子弹类
    public class Boom {
    	//子弹的坐标,大小,速度
    	int x,y;
    	int width;
    	int speed=1;
    	
    	public Boom(int x, int y, int width) {
    		super();
    		this.x = x;
    		this.y = y;
    		this.width = width;
    	}
    
    }
    

    主函数类,作为整个程序的入口
    package com.huaxin.mario;
    
    public class Test {
    	
    	//主函数,程序入口
    	public static void main(String[] args) throws Exception {
    		GameFrame gf = new GameFrame();
    		gf.initFrame();
    	}
    }
    


    com.huaxin.enery包:
    package com.huaxin.enery;
    
    import java.awt.Image;
    
    //障碍物的抽象父类
    public abstract class Enery {
    	
    	public int x,y;
    	public int width,height;
    	public Image img;
    	public Enery(int x, int y, int width, int height,Image img) {
    		this.x = x;
    		this.y = y;
    		this.width = width;
    		this.height = height;
    		this.img=img;
    	}
    }
    

    package com.huaxin.enery;
    
    import java.awt.Image;
    
    //金币类
    public class Coin extends Enery{
    
    	public Coin(int x, int y, int width, int height, Image img) {
    		super(x, y, width, height, img);
    	}
    
    }
    

    package com.huaxin.enery;
    
    import java.awt.Image;
    
    //砖头类
    public class Brick extends Enery {
    
    	public Brick(int x, int y, int width, int height, Image img) {
    		super(x, y, width, height, img);
    	}
    }
    

    package com.huaxin.enery;
    
    import java.awt.Image;
    
    //水管类
    public class Pipe extends Enery {
    
    	public Pipe(int x, int y, int width, int height, Image img) {
    		super(x, y, width, height, img);
    	}
    }
    


    com.huaxin.util包:
    package Util;
    
    import java.io.BufferedReader;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    
    //地图配置类
    public class Map {
    	
    	//数据容器
    	public ArrayList<String> list = new ArrayList<String>();
    	
    	public int [][] map=null;
    	
    	public  int[][] readMap() throws Exception {
    		// 构造文件输入流
    		FileInputStream fis = new FileInputStream("map.txt");
    		InputStreamReader isr = new InputStreamReader(fis);
    		BufferedReader br = new BufferedReader(isr);
    		
    		//直接读取一行数据
    		String value =br.readLine();
    		
    	    while(value!=null){
    	    	//将读取到的一行数据加入到容器中
    	    	list.add(value);
    	    	value =br.readLine();
    	    }
    	    
    	    br.close();
    	    
    	    //得到多少行多少列
    	    int row=list.size();
    	    int cloum=0;
    	
    	    for (int i = 0; i < 1; i++) {
    			String str=list.get(i);
    			String [] values=str.split(",");
    			cloum=values.length;
    		}
    	    
    	    
    	    map = new int [row][cloum];
    	    
    	    //将读到的字符创转换成整数,并赋值给二位数组map
    	   for (int i = 0; i < list.size(); i++) {
    		   String str=list.get(i);
    			String [] values=str.split(",");
    			for (int j = 0; j < values.length; j++) {
    				map[i][j]=Integer.parseInt(values[j]);
    			}
    	}
    	  return map;
    
    	}
    
    }
    


    五、项目总结:
    这个小项目看起来挺简单的,其实里面也有很多功能需要仔细去思考的,以前觉得游戏人物在窗体走的时候,觉得一直是人在走,其实,人物走到中间或者走到某一位置的时候,人物已经是在原地踏步了,取而代之的是背后那张长度很长的背景的图片在移动,任务的左右移动相对而言比较简答实现,跳跃功能就不是那么简单了,需要永达线程,跟后面障碍物碰撞检测又有关系,当没有碰到的时候,人物要往下掉,一不注意就会出现各种bug,比如,可以一直跳,在跳的同时还能再跳,还有就是下降可能不会落地面的同一高度,可能会高于地面的高度,可能会低于地面的高度;障碍物的添加,我们是通过配置地图的方式,配置地图有时通过读入文件的操作,大致的原理是将后面的那张的背景图片划分成很多的小格子,将这些小格子用代码转换为二位数组,二维数组可以存入不同数字,代表不同的障碍物,通过操作文件就可以轻易配置地图;首先通过文件输入流将文件数据读入,将字符转换为数字,并存储在二维数组中,后面,通过遍历二维数组的不同位置的值,在相应的格子填充相应的障碍物;地图就这样配置好了;
    觉得配地图很炫酷,因为以前有位学长在演示的时候,觉得好难,现在自己掌握了觉得也不是很难了,当然了,这里离不开老师的指导;碰撞检测类似之前小球的碰撞检测,这里主要需要处理碰撞之后的一些逻辑,如何避免一直碰撞(人物贴着障碍物不能动)等;发射子弹的话,也比较简单了,利用容器装子弹,不过需要注意的是要及时将容器中子弹移除,不然内存会很快被吃完的;
    写程序,一定要按照思路一步一步来,一点一点来实现!不要太过急于求成!以前老想着自己做一个小东西出来,可是自己总是很急,希望很快做出来,结果,思路没有理清,写起来一团糟!前车之鉴!
    好了,就先写到这吧!共勉!


    最近很多人问我要源代码:于是乎就把源代码上传到了CSDN的资源中,下面是下载链接;不需要积分;
    希望可以帮到想要学习这个游戏的朋友;

    展开全文
  • Java小程序2数学题练习小程序

    千次阅读 2015-05-13 10:02:04
    编写一个Java小程序,在文本框中显示出一道数学题,答对后打印在文本区域中,答错打出提示,一共10道//MathProblem.java 主类 import java.awt.*; import java.awt.event.*; import javax.swing.JTextField; public ...

    编写一个Java小程序,在文本框中显示出一道数学题,答对后打印在文本区域中,答错打出提示,一共10道

    //MathProblem.java 主类
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.JTextField;
    public class MathProblem extends Frame implements ActionListener {
        private static final long serialVersionUID = 1L;
        TextArea ta;
        JTextField tf1,tf2;
        Label lb1,lb2;
        Button bt1,bt2,bt3;
        Panel p1,p2,p3,p4,p5,p6;
        Frame f;
        int i;
        Question qu=new Question();
    
        MathProblem(){
            i=0;
            ta=new TextArea();
            ta.setSize(480, 180);
            ta.setEditable(true);
    
            tf1=new JTextField(20);
            tf2=new JTextField(10);
            tf1.setHorizontalAlignment(JTextField.CENTER);
            tf1.setText(qu.math[i]);
            tf1.setEditable(true);
            tf2.setEditable(true);
    
            lb1=new Label("题目:");
            lb2=new Label("答案:");
    
            bt1=new Button("确定");
            bt2=new Button("上一题");
            bt3=new Button("下一题");
            bt1.addActionListener(this);
            bt2.addActionListener(this);
            bt3.addActionListener(this);
    
            p1=new Panel();
            p2=new Panel();
            p3=new Panel();
            p1.add(ta);
            p2.add(lb1);
            p2.add(tf1);
            p2.add(lb2);
            p2.add(tf2);
            p3.setLayout(new GridLayout(1,3));
            p3.add(bt1);
            p3.add(bt2);
            p3.add(bt3);
    
            f=new Frame("练习题");
            f.setVisible(true);
            f.setResizable(false);
            f.setSize(500, 280);
            f.setLocationRelativeTo(null);
            f.add(p1,BorderLayout.NORTH);
            f.add(p2,BorderLayout.CENTER);
            f.add(p3,BorderLayout.SOUTH);
            f.addWindowListener(new WindowAdapter(){
                public void windowClosing(WindowEvent e){
                    System.exit(0);
                }
            });
        }
        public void actionPerformed(ActionEvent e) {
            if(e.getSource().equals(bt1)){
                if(tf2.getText().equals(qu.mathKey[i])){
                    ta.setText(qu.math[i]+qu.mathKey[i]);
                }
                else{
                    ta.setText("error!!!");
                }
            }
            if(e.getSource().equals(bt2)){
                i--;
                if(i>=0){
                    tf1.setText(qu.math[i]);
                    tf2.setText(null);
                    ta.setText(null);
                }
                else{
                    ta.setText("已经是第一题!");
                    i=0;
                }
            }
            if(e.getSource().equals(bt3)){
                i++;
                if(i<=9){
                    tf1.setText(qu.math[i]);
                    tf2.setText(null);
                    ta.setText(null);
                }
                else{
                    ta.setText("已经是最后一题!");
                    i=9;
                }
            }
        }
        public static void main(String args[]){
            MathProblem mp=new MathProblem();
        }
    }
    
    //Question.java 该类主要存放数组用于放置题目和答案
    public class Question {
        String[] math;
        String mathKey[]={"2","4","8","2","7","45","4","124","132","1"};
        Question(){
            math=new String[10];
            math[0]="1+1=";
            math[1]="10-6=";
            math[2]="2*4=";
            math[3]="6÷3=";
            math[4]="1+2*3=";
            math[5]="(100-10)*2=";
            math[6]="(7+1)÷2=";
            math[7]="1+123=";
            math[8]="64÷2+100=";
            math[9]="8+1-8=";
        }
    }
    

    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述

    展开全文
  • Java小程序 —— 简单五子棋

    万次阅读 多人点赞 2018-05-17 21:13:39
    看到好多后台留言问背景...另外还有好多朋友说为什么报错等等,我希望你们在问这种问题的时候最好把在哪报的错,报的什么错给贴出来呀,直接就回复说程序有问题我也不可能知道你的问题出在哪。。。,搞得我也很懵。 ...

    看到好多后台留言问背景图片的问题,在这里统一补充一下:所有的图片都是读取的本地图片文件,图片文件可以去网上下载,有一大堆(记得调好长宽),代码中的路径只是当时我的电脑的图片路径,你们运行的时候记得修改。

    另外还有好多朋友说为什么报错等等,我希望你们在问这种问题的时候最好把在哪报的错,报的什么错给贴出来呀,直接就回复说程序有问题我也不可能知道你的问题出在哪。。。,搞得我也很懵。                                                2019.11.09

     

    本程序适用于java初学者巩固类与对象、事件响应、awt包中各种工具的相关概念以及对逻辑能力的锻炼
    需要注意的有:
    ①要加入java界面的重绘(基本原则)
    ②由于玩家需要通过鼠标点击,计算机响应出棋子的位置,但却不能保证每次点击都正中棋盘点位,所以要有一定的误差范围
    ③要保存更新棋盘上的棋子信息,因为棋盘格数是固定的故本例中采取最简单的数组

     

     

     
    直接上代码:

    分为三个类,同一包下,相信大家都能明白

    package Study0326;
    
    public interface WZQConfig {
    	/*
    	 * 起始位置X
    	 */
    	public static final int START_X = 60;
    	/*
    	 * 起始位置Y
    	 */
    	public static final int START_Y = 60;
    	/*
    	 * 五子棋盘线条数
    	 */
    	public static final int H_LINE = 15;
    	/*
    	 * 五子棋盘竖线条数
    	 */
    	public static final int V_LINE = 15;
    	/*
    	 * 五子棋盘格子大小
    	 */
    	public static final int SIZE = 60;
    	/*
    	 * 储存棋子的x位置信息
    	 */
    	public static final int[][] bx = new int[17][17];
    }
    
    package Study0326;
    
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    
    import javax.swing.JButton;
    import javax.swing.JOptionPane;
    
    public class LoginListener implements MouseListener, WZQConfig, ActionListener {
    	private int x, y;// 鼠标点击的位置
    	private int x1, y1, xx, yy;// 鼠标点击附近格子交点的坐标
    	private Graphics g;
    	private int a = 0, i = 0, j = 0, count1 = 0;// count统计当前下的棋子数
    	private String Str;// 定义全局变量获取按钮上的字符串
    	private JButton jbu1, jbu2;
    	private int GetX[] = new int[256];
    	private int GetY[] = new int[256];
    	WZQFrame ui;
    
    	public void setG(Graphics g) {
    		this.g = g;
    	}
    
    	public void setT(JButton b) {
    		jbu1 = b;
    	}
    
    	public void setU(WZQFrame u) {
    		ui = u;
    	}
    
    	public void mouseClicked(MouseEvent e) {
    
    	}
    
    	public void mousePressed(MouseEvent e) {
    
    	}
    
    	public void mouseReleased(MouseEvent e) {
    		x = e.getX();
    		y = e.getY();
    		x1 = Math.abs(x - START_X);
    		y1 = Math.abs(y - START_Y);
    		xx = x1 % SIZE;
    		if (xx >= SIZE / 2) {
    			x1 = (x1 / SIZE) + 2;
    		} else {
    			x1 = (x1 / SIZE) + 1;
    		}
    
    		yy = y1 % SIZE;// 判断横坐标是否超过格子长度的一半(防止玩家点偏)
    		if (yy >= SIZE / 2) {
    			y1 = (y1 / SIZE) + 2;
    		} else {
    			y1 = (y1 / SIZE) + 1;
    		}
    
    		if ((count1 + 1) % 2 == 1) {// 单数步数时下黑棋,双数时下白棋
    			g.setColor(Color.BLACK);
    			if (bx[x1][y1] == 0) {
    				bx[x1][y1] = 1;// 表示黑棋
    				g.fillOval(Math.abs(x1 * SIZE - 25), Math.abs(y1 * SIZE - 25),
    						50, 50);
    				count1++;// 所下棋子数加一
    				GetX[count1] = x1;// 记录第count1步的棋子x值
    				GetY[count1] = y1;// 记录第count1步的棋子y值
    				if (CheckRow(x1, y1) >= 5) {
    					JOptionPane.showMessageDialog(null, "BLACK   WIN!!");
    				}
    				if (CheckList(x1, y1) >= 5) {
    					JOptionPane.showMessageDialog(null, "BLACK   WIN!!");
    				}
    				if (UpperRight(x1, y1) >= 5) {
    					JOptionPane.showMessageDialog(null, "BLACK   WIN!!");
    				}
    				if (UpperLeft(x1, y1) >= 5) {
    					JOptionPane.showMessageDialog(null, "BLACK   WIN!!");
    				}
    			}
    		} else {
    			g.setColor(Color.WHITE);
    			if (bx[x1][y1] == 0) {
    				bx[x1][y1] = 2;// 表示白棋
    				g.fillOval(Math.abs(x1 * SIZE - 25), Math.abs(y1 * SIZE - 25),
    						50, 50);
    				count1++;// 所下棋子数加一
    				GetX[count1] = x1;// 记录第count1步的棋子x值
    				GetY[count1] = y1;// 记录第count1步的棋子y值
    				if (CheckRow(x1, y1) >= 5) {
    					JOptionPane.showMessageDialog(null, "WHITE   WIN!!");
    				}
    				if (CheckList(x1, y1) >= 5) {
    					JOptionPane.showMessageDialog(null, "WHITE   WIN!!");
    				}
    				if (UpperRight(x1, y1) >= 5) {
    					JOptionPane.showMessageDialog(null, "WHITE   WIN!!");
    				}
    				if (UpperLeft(x1, y1) >= 5) {
    					JOptionPane.showMessageDialog(null, "WHITE   WIN!!");
    				}
    			}
    		}
    	}
    
    	public void actionPerformed(ActionEvent e) {
    		setT(jbu1);
    		Str = e.getActionCommand();// 读取点击按钮上的字符串
    		if ("悔棋".equals(Str)) {
    			if (g.getColor() == Color.BLACK) {
    				g.setColor(Color.WHITE);
    			}
    			if (g.getColor() == Color.WHITE) {
    				g.setColor(Color.BLACK);
    			}
    			Regret();
    			ui.repaint();
    		} else if ("重新开始".equals(Str)) {
    			Restart();
    			ui.repaint();
    		}
    	}
    
    	public void mouseEntered(MouseEvent e) {
    
    	}
    
    	public void mouseExited(MouseEvent e) {
    
    	}
    
    	public int CheckRow(int x, int y)// 横着五子连成一条直线
    	{
    		int count = 0;
    		for (int i = x + 1; i < bx.length; i++)// 向右判断是否棋子一样
    		{
    			if (bx[i][y] == bx[x][y])
    				count++;
    			else
    				break;
    		}
    		for (int i = x; i >= 0; i--)// 向右判断是否棋子一样
    		{
    			if (bx[i][y] == bx[x][y])
    				count++;
    			else
    				break;
    		}
    		return count;
    	}
    
    	public int CheckList(int x, int y)// 竖着五子连成一条直线
    	{
    		int count = 0;
    		for (int i = y + 1; i < bx.length; i++)// 向下判断是否棋子一样
    		{
    			if (bx[x][i] == bx[x][y])
    				count++;
    			else
    				break;
    		}
    		for (int i = y; i >= 0; i--)// 向上判断是否棋子一样
    		{
    			if (bx[x][i] == bx[x][y])
    				count++;
    			else
    				break;
    		}
    		return count;
    	}
    
    	public int UpperRight(int x, int y)// 右上到左下五子连成一条直线
    	{
    		int count = 0;
    		for (int i = x + 1, j = y - 1; i < bx.length && j >= 0; i++, j--)// 向下判断是否棋子一样
    		{
    			if (bx[i][j] == bx[x][y])
    				count++;
    			else
    				break;
    		}
    		for (int i = x, j = y; i >= 0 && j < bx.length; i--, j++)// 向上判断是否棋子一样
    		{
    			if (bx[i][j] == bx[x][y])
    				count++;
    			else
    				break;
    		}
    		return count;
    	}
    
    	public int UpperLeft(int x, int y)// 左上到右下五子连成一条直线
    	{
    		int count = 0;
    		for (int i = x - 1, j = y - 1; i >= 0 && j >= 0; i--, j--)// 向下判断是否棋子一样
    		{
    			if (bx[i][j] == bx[x][y])
    				count++;
    			else
    				break;
    		}
    		for (int i = x, j = y; i < bx.length && j < bx.length; i++, j++)// 向上判断是否棋子一样
    		{
    			if (bx[i][j] == bx[x][y])
    				count++;
    			else
    				break;
    		}
    		return count;
    	}
    
    	public void Regret() {// 悔棋
    		bx[GetX[count1]][GetY[count1]] = 0;
    		if (count1 > 0) {
    			count1--;
    		}
    	}
    
    	public void Restart() {//重新开始
    		{
    			for (int k = 0; k <= count1; k++) {
    				bx[GetX[k]][GetY[k]] = 0;
    			}
    		}
    	}
    }
    

     

    package Study0326;
    
    import java.awt.BasicStroke;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    /*
     * 五子棋的界面类,该类继承JFrame,然后实现WZQConfig接口
     */
    import javax.swing.JPanel;
    
    public class WZQFrame extends JPanel implements WZQConfig {
    	public void WZQFrame() {
    		// WZQFrame ui = new WZQFrame();
    		JFrame jf = new javax.swing.JFrame();
    		jf.setTitle("五子棋");
    		jf.setDefaultCloseOperation(3);
    		jf.setSize(1246, 1080);
    		jf.setLocationRelativeTo(null);
    		jf.setResizable(false);
    
    		jf.setLayout(new FlowLayout());
    		this.setLayout(new FlowLayout());
    
    		this.setPreferredSize(new Dimension(1030, 1080));
    
    		// this.setBackground(Color.CYAN);
    		// 把面板对象添加到窗体上
    		jf.add(this);
    		JPanel jp1 = new JPanel();
    		jp1.setPreferredSize(new Dimension(200, 1080));
    		jp1.setLayout(new FlowLayout());
    		jf.add(jp1);
    		LoginListener ll = new LoginListener();
    		String[] str = { "悔棋", "重新开始" };
    		for (int i = 0; i < str.length; i++) {
    			JButton jbu1 = new JButton(str[i]);
    			jbu1.setPreferredSize(new Dimension(150, 80));
    			jbu1.setFont(new Font("楷体", Font.BOLD,20));//设置字体
    			jp1.add(jbu1);
    			jbu1.addActionListener(ll);
    		}
    		
    		jf.setVisible(true);
    
    		Graphics g = this.getGraphics();
    
    		this.addMouseListener(ll);
    
    		ll.setG(g);
    		ll.setU(this);
    	}
    
    	/*
    	 * 重写窗体绘制容器的方法
    	 */
    	public void paint(Graphics g) {
    		super.paint(g);
    
    		ImageIcon im2 = new ImageIcon(this.getClass().getResource("2.jpg"));
    
    		g.drawImage(im2.getImage(), 0, 0, 1030, 1080, null);
    
    		for (int i = 1; i < 17; i++) {
    			Graphics2D g2 = (Graphics2D) g;
    			g2.setStroke(new BasicStroke(4));
    			g2.drawLine(START_X, START_Y * i, START_X + SIZE * V_LINE, START_Y
    					* i);// 横线
    			g2.drawLine(START_X * i, START_Y, START_X * i, START_Y + SIZE
    					* V_LINE);// 竖线
    
    			g2.setStroke(new BasicStroke(8));
    			// 画边框
    			g2.drawLine(35, 35, 990, 35);
    			g2.drawLine(35, 990, 990, 990);
    			g2.drawLine(35, 35, 35, 990);
    			g2.drawLine(990, 35, 990, 990);
    		}
    		for (int k = 0; k < 17; k++) {
    			for (int k1 = 0; k1 < 17; k1++) {
    				if (bx[k][k1] == 1) {
    					g.setColor(Color.BLACK);
    					g.fillOval(Math.abs(k * SIZE - 25),
    							Math.abs(k1 * SIZE - 25), 50, 50);
    
    				} else if (bx[k][k1] == 2) {
    					g.setColor(Color.WHITE);
    					g.fillOval(Math.abs(k * SIZE - 25),
    							Math.abs(k1 * SIZE - 25), 50, 50);
    				}
    
    			}
    
    		}
    
    	}
    
    	public static void main(String[] args) {
    		WZQFrame l = new WZQFrame();
    		l.WZQFrame();
    
    	}
    
    }

     

     

     
    友情提示:本代码仅适用于或者双人对战。
     
     
     
    由于时间安排原因,CSDN上的评论我没有办法秒回,如果需要及时联系到我,可以通过我的公众号找到我的微信:
     
     
     
     
    展开全文
  • Java小程序之画板入门

    千次阅读 2016-11-10 11:52:18
    Java小程序之画板入门 前言:画板小程序是对之前Java中的类,继承,方法重载以及接口等知识的综合应用;  建议大家先去把相关知识看一下(我前面的博客中),在来看这个Java小程序;  在这个小程序中我会用...
    Java小程序之画板入门

    前言:画板小程序是对之前Java中的类,继承,方法重载以及接口等知识的综合应用;
               建议大家先去把相关知识看一下(我前面的博客中),在来看这个Java小程序;
               在这个小程序中我会用红色标明我们用到的相关知识;

    思路:
            1.创建窗体
            2.在窗体上安装鼠标监听器,对鼠标动作进行监听;
            3.拿到鼠标在窗体上按下以及鼠标释放的坐标(两个);
            4.利用两点坐标进行直线绘制;

    难点:画笔的传递(利用构造函数来传递)
               画笔传递的理解(传递的是画笔的地址,可以参看内存中的堆栈相关知识)

    源代码:

    package com.huaxin;

    import java.awt.Graphics;

    import javax.swing.JFrame;

    //DrawBoeder'类继承窗体Frame类,那么它本身就是窗体类

    public class DrawBoard extends JFrame{

    public static void main(String[] args) {
     
    DrawBoard bd = new DrawBoard();
    bd.initFrame();
    }

    public void initFrame(){
    //设置窗体相关属性
                    //注意this代表的对象(this关键字的应用)
    this.setSize(600,500);
    this.setTitle("简易画板");
    this.setDefaultCloseOperation(3);
    this.setLocationRelativeTo(null);
    this.setVisible(true);

    //获取窗体的画笔(注意:必须得在设置窗体的可见性之后才可以拿到画笔)
    Graphics g = this.getGraphics();  //拿到的当前窗体上的画笔

                    //DrawListerer实现的是MouseListener接口,因为接口不能直接创建对象

    DrawListener ml = new DrawListener(g);//传递的是画笔的地址,联系前面内存中的堆栈

                   //监听器的使用
    this.addMouseListener(ml);
    }


    }


    package com.huaxin;
    import java.awt.Graphics;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    //接口知识的应用
    public class DrawListener implements MouseListener{

    public Graphics g;
    public int x1,y1,x2,y2;

    public DrawListener(){

    }

    //这里拿到的画笔是DrawBoard里面的画笔的地址
            //构造函数的应用
    public DrawListener(Graphics g1){
    g=g1;     

    }

    public void mousePressed(MouseEvent e) {
    x1=e.getX();
    y1=e.getY();
    }


    public void mouseReleased(MouseEvent e) {
    x2=e.getX();
    y2=e.getY();
    g.drawLine(x1, y1, x2, y2);
    }


    public void mouseClicked(MouseEvent e) {

    }

            //方法重载知识的应用
           //注意,这些方法在MouseListener接口中都是抽象的方法,但abstract关键可以省略,子类必须实现接口的额方法才能实例化对象
    public void mouseEntered(MouseEvent e) {

    }


    public void mouseExited(MouseEvent e) {

    }


    }


    运行结果:


    按下鼠标拖动然后释放鼠标,绘制直线;

    小程序总结:
    1.不要以为这个小程序简单,其实里面用了很多知识点;要深入理解,不要看表面;
    2.画笔传递一定要深入理解
    3.这里利用构造函数解决了怎样在一个类中使用另一个类的属性,这点以后会常用;
       (本来画笔是DrawBoard类中,但却要在DrawListener中使用)
    4.一定要多动手,按照思路一步一步来,不要觉得简单,看懂了就好,一定要多加实践;
    展开全文
  • JAVA小程序启动conhost和java虚拟机都会起动,但用任务管理器关掉conhost窗口java虚拟机不关闭如何解决?
  • Java小程序——汽车租赁》 1.描述:刚学Java写的小程序,用到类的继承,多态,abstract抽象方法。 2.工具:eclipse.exe 3.功能:选择子类(轿车 / 客车) 选择车型(轿车车型 / 客车车型) 根据天数计算租金(用...
  • 启动Java小程序的方法

    千次阅读 2017-08-08 18:19:44
    一 使用bat启动  把带有main方法的java程序打包成jar包,放到bat同级目录 ...二 用Tomcat启动Java小程序 1 建一个web项目,在web.xml里配置一个监听器: TomcatStartUp com.odin.itms.Test
  • 求个java 小程序 桌面提示信息 右下角 最好能有那种渐渐显示和隐藏的那种
  • 插入Java小程序在Dreamweaver Java是用来创建一个名为小程序自包含程序的编程语言。 Java小程序在浏览器窗口中运行,就像其他多媒体对象YOUE被这个颜色正与。你可以把一个java小程序到您的网页,添加参数,并添加了...
  • Java小程序:模拟ATM取款

    千次阅读 2016-05-11 14:40:56
    Java小程序,模拟ATM机取款
  • Java小程序——zoo》 1.描述:用到了类的封装,继承,抽象类,多态,接口,instanceof运算符 2.工具:eclipse.exe 3.功能:用数组遍历,同一函数,不同类调用输出不同功能 输出不同动物,不同腿数,不同叫声 /*...
  • Java小程序之球球大作战(基于Java线程实现)

    万次阅读 多人点赞 2017-01-05 00:44:21
    Java小程序之球球大作战(基于Java线程实现) 一、游戏基本功能:  1、自己的小球可以随着鼠标的移动而改变坐标;  2、敌方小球不断的在界面中移动  3、当检测到敌方小球相互碰撞时,小球会弹开  4、当我方...
  • 实用java小程序
  • Java小程序之我的记事本

    千次阅读 2016-11-27 00:25:51
    Java小程序之我的记事本 前言:Java中的流的知识非常重要,刚开始学,一定要多花时间对流的分类以及继承的知识学明白,只有这样,对流的应用才会了然于胸; 好了,言归正传,今天给大家写一个利用输入输出流知识...
  • 关于JAVA小程序完整打包过程

    万次阅读 2017-01-03 14:22:50
    距离写完那个小程序已经过去快半个月了,...1、JAVA小程序如何打包 我这里拿一个比较简单的例子给大家做演示,首先右键你的项目选择export 点击FINISH后会出现如果出现错误 可以点击上面工具栏pr
  • 扫雷游戏(java实现)java小程序

    万次阅读 多人点赞 2018-08-08 08:50:41
    想着做点东西玩玩,萌生了写一个扫雷的想法,这个想法其实在学c语言时就有了,当时并不知道c也有图形库,在后来就搁置了,最近看了大概两周的java,刚好看完 java Swing图形界面,老师说应该做个项目检验一下学习...
  • Java小程序之高级画板功能篇I

    千次阅读 2016-11-13 00:12:37
    Java小程序之高级画板功能篇I 前言:通过前面阶段的学习,已经学完了Java中的继承、重载、多态、构造函数、Java图形界面等知识,并结合一些小程序来加深对这些知识的理解;  今天,在完成Java小程序之高级画板...
  • (第24讲)java小程序——Applet

    千次阅读 2016-06-15 20:16:40
    l Java分为2类程序,分别是Application(Java应用程序)和Applet(Java小程序)。 Application是指在计算机操作系统中运行的程序。用java创建应用程序与其他任何计算机语言创建应用程序相似,这些应用程序可以基于...
  • 经典的java小程序源代码合集

    千次下载 热门讨论 2011-12-21 08:43:48
    164个完美程序,五子棋,俄罗斯方块,扫雷,聊天程序
  • 3.每天一个java小程序之累加累乘

    千次阅读 2017-11-28 21:43:52
    3.每天一个java小程序之累加累乘 java小练习之数的累加累乘,在于锻炼数学计算思维。 每天一个小程序,每天进步一点点。
  • Java小程序之你画我猜

    千次阅读 2017-02-27 12:00:12
    Java小程序之你画我猜 一、前言: 你画我猜是一款休闲益智的游戏,可以考验双方的默契,当然,画功也是一个方面;昨天我们写了个简单的网络画板,能够将一个客户端上画的图形实时传递给另一个客户端;其实 你画...
  • 一个简单的java小程序

    千次阅读 2016-01-21 15:52:49
    一个简单的java小程序程序代码很简单,通过循环将一个数字的个位,十位百位千位万位……上的数字进行相加,得出结果。代码奉上:class q { public static void main(String[] args) { // int a 的值为定义的数字 ...
  • Java小程序之高级画板功能篇II

    千次阅读 2016-11-14 00:23:24
    Java小程序之高级画板功能篇II 前言:在完成Java小程序之高级画板UI篇和功能篇I后,我们的画板已经初具雏形,拥有了较好的UI界面以及能够根据选取的颜色绘制相应颜色的直线、矩形、椭圆等图形了;今天我们将在以前...
  • 使用JavaToEXE将Java小程序打包成exe可执行文件 刚接触Java编程的小伙伴会经常自己写写小程序自娱自乐,这是不错的习惯,但是写完后只是留在IDE里面,那么怎样可以让自己的小程序可以像exe应用程序一样在电脑里面...
  • 简单的JAVA小程序

    万次阅读 2019-07-22 14:10:16
    一、加法 import java.io.*; //导入输入输出包 public class MyClass { private int val1,val2; public void myFun(int x,int y) { val1=x; val2=y; System.out.println("the sum is...
  • Java小程序之高级画板UI篇

    千次阅读 2016-11-11 15:31:55
    Java小程序之高级画板UI篇 前言:了解了Java中的图形组件,让我们来实践一下吧! 画板UI篇思路: 1、创建窗体并设置相关属性 2、给整个窗体添加一个中间容器JPanel panel用来覆盖整个窗体(就好像给整个桌子铺...
  • Java小程序之自定义链表的实现

    千次阅读 2017-01-06 18:19:40
    Java小程序之自定义链表的实现 一、前面我们自己实现了队列,和画板的重绘有关;今天我们实现自定义链表; 二、自定义链表实现源代码: 节点类: package Test; //定义节点类型 public class Node { public...
  • 一个计算文件夹大小的Java小程序

    千次阅读 2012-02-24 09:28:41
    一个计算文件夹大小的Java小程序 转载自:深度思索点击打开链接 今天,在论坛上看到有人求推荐一个可以方便计算文件夹大小的软件。原因也很简单,毕竟每次都使用鼠标右键查看属性不够方便。其实,对于...
  • 问题1:IE浏览器中Java小程序无法运行 原因: 装了jdk但是没有装jre或者jre版本不正确 解决:重新安装合适版本的jre(即:重装jdk时把jre也装了) 问题2:应用程序已被安全设置阻止 解决:去设置java安全级别 ...
  • java小程序之计算器

    千次阅读 多人点赞 2018-06-08 15:46:38
    import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.aw...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 71,644
精华内容 28,657
关键字:

java小程序

java 订阅