JAVA小项目(6)javaSE

1 记帐本

1.1 使用技能点:

  • 分支、循环、String的拼接

1.2 功能和效果

功能

1.3 项目架构

public class Test {
    public static void main(String[] args) {
        while(true){
            System.out.println("-------欢迎使用记账系统--------");
            System.out.println("1.收支明细");
            System.out.println("2.登记收入");
            System.out.println("3.登记支出");
            System.out.println("4.退出");
            System.out.println("请输入你要选择的功能:");
            //拿来一个扫描器
            Scanner sc = new Scanner(System.in);
            //接收键盘录入的int类型的数据:
            int choice = sc.nextInt();
            //对你录入的choice做一个过滤:
            while(choice!=1&&choice!=2&&choice!=3&&choice!=4){
                System.out.println("对不起,你录入的功能错误,请重新录入:");
                int newChoice = sc.nextInt();
                choice = newChoice;
            }
            //根据你录入的数字,判断执行对应的功能:
            switch (choice){
                case 1:
                    System.out.println("记账系统》》》》收支明细");
                    break;
                case 2:
                    System.out.println("记账系统》》》》登记收入");
                    break;
                case 3:
                    System.out.println("记账系统》》》》登记支出");
                    break;
                case 4:
                    System.out.println("记账系统》》》》退出功能");
                    return;//结束当前方法
            }
        }
    }
}

1.4 项目细节代码实现

public class Test {
    public static void main(String[] args) {
        //定义一个字符串,用来接收整个收支的明细:
        String details = "";
        //定义一个变量,接收余额:
        int balance = 0; //初始化金额为0元
        while(true){
            System.out.println("-------欢迎使用小鲨鱼记账系统--------");
            System.out.println("1.收支明细");
            System.out.println("2.登记收入");
            System.out.println("3.登记支出");
            System.out.println("4.退出");
            System.out.println("请输入你要选择的功能:");
            //拿来一个扫描器
            Scanner sc = new Scanner(System.in);
            //接收键盘录入的int类型的数据:
            int choice = sc.nextInt();
            //对你录入的choice做一个过滤:
            while(choice!=1&&choice!=2&&choice!=3&&choice!=4){
                System.out.println("对不起,你录入的功能错误,请重新录入:");
                int newChoice = sc.nextInt();
                choice = newChoice;
            }
            //根据你录入的数字,判断执行对应的功能:
            switch (choice){
                case 1:
                    System.out.println("记账系统》》》》收支明细");
                    //如果直接输出details,那么最后多了一个换行:
                    //System.out.println(details);
                    /*String s = details.substring(0,details.length()-1);
                    System.out.println(s);*/
                    if(details!=""){
                        System.out.println(details.substring(0,details.length()-1));
                    }else{
                        System.out.print(details);
                    }
                    break;
                case 2:
                    System.out.println("记账系统》》》》登记收入");
                    System.out.println("请录入收入金额:");
                    int income = sc.nextInt();
                    System.out.println("请录入收入说明:");
                    String incomeDetail = sc.next();
                    balance += income;
                    details = details+"收入:"+income+",收入说明:"+incomeDetail+",账户余额:"+balance+"\n";
                    break;
                case 3:
                    System.out.println("记账系统》》》》登记支出");
                    System.out.println("请录入支出金额:");
                    int expend = sc.nextInt();
                    System.out.println("请录入支出说明:");
                    String expendDetail = sc.next();
                    balance -= expend;
                    details = details+"支出:"+expend+",支出说明:"+expendDetail+",账户余额:"+balance+"\n";
                    break;
                case 4:
                    System.out.println("记账系统》》》》退出功能");
                    System.out.println("确定要退出吗?Y/N:");
                    String isExit = sc.next();
                    switch (isExit){
                        case "Y" :
                            System.out.println("系统退出,欢迎您下次继续使用!");
                            return;//结束当前方法
                    }
            }
        }
    }
}

2 彩票

2.1 使用技能点:

  • 分支、循环结构、提取方法、数组。

2.2 功能和效果

  • 功能:
    买彩票判断是否中奖,中奖后判断是几等奖
    双色球投注区分为红色球号码区和蓝色球号码区,
    红色球号码区由1-33共33个号码组成,蓝色球号码区由1-16共16个号码组成。
    投注时选择6个红球号码和1个蓝球号码组成一注进行单式投注,每注金额2元。
    一等奖:投注号码与当期开奖号码全部相同(顺序不限,下同),即中奖;
    二等奖:投注号码与当期开奖号码中的6个红色球号码相同,即中奖;
    三等奖:投注号码与当期开奖号码中的任意5个红色球号码和1个蓝色球号码相同,即中奖;
    四等奖:投注号码与当期开奖号码中的任意5个红色球号码相同,或与任意4个红色球号码和1个蓝色球号码相同,即中奖;
    五等奖:投注号码与当期开奖号码中的任意4个红色球号码相同,或与任意3个红色球号码和1个蓝色球号码相同,即中奖;
    六等奖:投注号码与当期开奖号码中的1个蓝色球号码相同,即中奖。
    显示中奖结果的同时显示您一共下注人民币??元,累计中奖人民币??元
  • 效果:
    (1)购买彩票
    买票
    (2)查看开奖
    开奖
    (3)退出系统
    退出系统

2.3 代码实现

public class Test {
    public static void main(String[] args) {
        //声明一个数组,用来接收7个球的数字:
        int[] balls = new int[7];
        //购买注数:
        int count = 0;
        //定义一个变量,用来设定是否购买彩票:
        boolean isBuy = false;//默认情况下没有买彩票
        while(true){
            //写菜单:
            System.out.println("------欢迎进入双色球彩票系统---------");
            System.out.println("1.购买彩票");
            System.out.println("2.查看开奖");
            System.out.println("3.退出");
            System.out.println("请选择你要完成的功能:");
            //拿过来一个扫描器:
            Scanner sc = new Scanner(System.in);
            //从键盘接收一个int类型的数据:
            int choice = sc.nextInt();
            switch (choice){
                case 1:
                    System.out.println("双色球系统》》购买彩票");
                    System.out.println("请选择你要购买几注:");
                    count = sc.nextInt();//购买数量
                    for(int i=1;i<=7;i++){
                        if(i!=7){//录入红色球
                            System.out.println("请录入第"+i+"个红球:");
                            int redBall = sc.nextInt();
                            balls[i-1] = redBall;
                        }else{//i==7  录入蓝色球
                            System.out.println("请录入一个蓝色球:");
                            int blueBall = sc.nextInt();
                            balls[6] = blueBall;
                        }
                    }
                    //提示完整信息:
                    System.out.println("您购买了"+count+"注彩票,一共消费了"+count*2+"元钱,您购买的彩票号码为:");
                    //遍历数组:
                    for(int num:balls){
                        System.out.print(num+"\t");
                    }
                    //换行
                    System.out.println();
                    //彩票购买:
                    isBuy = true;
                    break;
                case 2:
                    if(isBuy){
                        //1.购买号码-->balls
                        //2.中奖号码
                        int[] luckBall = getLuckBall();
                        //3.将两组号码进行比对
                        int level = getLevel(balls,luckBall);
                        //4.根据level的结果执行后面的逻辑:
                        switch (level){
                            case 1:
                                System.out.println("恭喜你,中了1等奖,1注奖金500万,您一共获得:"+500*count+"万元");
                                break;
                            case 2:
                                System.out.println("恭喜你,中了2等奖,1注奖金100万,您一共获得:"+100*count+"万元");
                                break;
                            case 3:
                                System.out.println("恭喜你,中了3等奖,1注奖金30万,您一共获得:"+30*count+"万元");
                                break;
                            case 4:
                                System.out.println("恭喜你,中了4等奖,1注奖金5万,您一共获得:"+5*count+"万元");
                                break;
                            case 5:
                                System.out.println("恭喜你,中了5等奖,1注奖金2000千元,您一共获得:"+2000*count+"元");
                                break;
                            case 6:
                                System.out.println("恭喜你,中了6等奖,1注奖金5万,您一共获得:"+5*count+"元");
                                break;
                        }
                        System.out.println("双色球系统》》查看开奖");
                    }else{//如果没有买彩票 就给提示
                        System.out.println("对不起,请先购买彩票");
                    }
                    break;
                case 3:
                    System.out.println("双色球系统》》退出");
                    return;//遇到return结束当前方法
            }
        }
    }
    //定义一个方法,专门用来生成中奖号码:
    public static int[] getLuckBall(){
        //int[] luckBall = {1,2,3,4,5,6,7};
        int[] luckBall = new int[7];
        /*
        红球:1-33
        篮球:1-16
        1-33
        Math.random() -> [0.0,1.0)
        Math.random()*33 -> [0.0,33.0)
        (int)(Math.random()*33) -> [0,32]
        (int)(Math.random()*33)+1 ->[1,33]
         */
        for(int i = 1;i<=7;i++){
            if(i!=7){//给红球赋值
                luckBall[i-1] = (int)(Math.random()*33)+1;
            }else{//i==7  给蓝色球赋值:
                luckBall[6] = (int)(Math.random()*16)+1;
            }
        }
        return luckBall;
    }
    //定义一个方法,专门用来比对 购买号码和中奖号码的:
    public static int getLevel(int[] balls,int[] luckBall){
        int level = 1;
        //计数器:用来计红球有几个相等:
        int redCount = 0;
        //计数器:用来计篮球有几个相等:
        int blueCount = 0;
        //就是将我们的球一个一个的跟中奖号码比对:
        //遍历我购买的号码
        for(int i = 0;i<=6;i++){
            if(i!=6){//i:0-5 红球  比对红球
                for(int j = 0;j<=5;j++){
                    if(balls[i]==luckBall[j]){
                        redCount++;
                    }
                }
            }else{//i:6 ->蓝色球
                if(balls[6]==luckBall[6]){
                    blueCount++;
                }
            }
        }
        //输出比对结果:
        System.out.println("红球有"+redCount+"个相等");
        System.out.println("蓝球有"+blueCount+"个相等");
        //根据红球和篮球的相等数量得到level的具体结果:
        if(redCount==6&&blueCount==1){
            level = 1;
        }else if(redCount==6){
            level = 2;
        }else if(redCount==5&&blueCount==1){
            level = 3;
        }else if(redCount==5||(redCount==4&&blueCount==1)){
            level = 4;
        }else if(redCount==4||(redCount==3&&blueCount==1)){
            level = 5;
        }else{
            level = 6;
        }
        return level;
    }
}

3 点餐商店

3.1 使用技能点

  • 面向对象,类,属性,方法,继承,封装,多态,工厂类。

3.2 功能和效果

功能和效果

3.3 代码实现

  • 披萨父类
public class Pizza {
    //属性
    private String name;//名称
    private int size;//大小
    private int price;//价格
    //方法
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getSize() {
        return size;
    }
    public void setSize(int size) {
        this.size = size;
    }
    public int getPrice() {
        return price;
    }
    public void setPrice(int price) {
        this.price = price;
    }
    //展示匹萨信息:
    public String showPizza(){
        return "匹萨的名字是:"+name+"\n匹萨的大小是:"+size+"寸\n匹萨的价格:"+price+"元";
    }
    //构造器
    public Pizza() {
    }
    public Pizza(String name, int size, int price) {
        this.name = name;
        this.size = size;
        this.price = price;
    }
}
  • 培根披萨
public class BaconPizza extends Pizza {
    //属性:
    private int weight;
    public int getWeight() {
        return weight;
    }
    public void setWeight(int weight) {
        this.weight = weight;
    }
    //构造器:
    public BaconPizza() {
    }
    public BaconPizza(String name, int size, int price, int weight) {
        super(name, size, price);
        this.weight = weight;
    }
    //重写父类showPizza方法:
    @Override
    public String showPizza() {
        return super.showPizza()+"\n培根的克数是:"+weight+"克";
    }
}
  • 水果披萨
public class FruitsPizza extends Pizza{
    //属性:
    private String burdening;
    public String getBurdening() {
        return burdening;
    }
    public void setBurdening(String burdening) {
        this.burdening = burdening;
    }
    //构造器:
    public FruitsPizza() {
    }
    public FruitsPizza(String name, int size, int price, String burdening) {
        super(name, size, price);
        this.burdening = burdening;
    }
    //重写父类showPizza方法:
    @Override
    public String showPizza() {
        return super.showPizza()+"\n你要加入的水果:"+burdening;
    }
}
  • 工厂类
public class PizzaStore {
    public static Pizza getPizza(int choice){
        Scanner sc = new Scanner(System.in);
        Pizza p = null;
        switch (choice){
            case 1:
                {
                    System.out.println("请录入培根的克数:");
                    int weight = sc.nextInt();
                    System.out.println("请录入匹萨的大小:");
                    int size = sc.nextInt();
                    System.out.println("请录入匹萨的价格:");
                    int price = sc.nextInt();
                    //将录入的信息封装为培根匹萨的对象:
                    BaconPizza bp = new BaconPizza("培根匹萨",size,price,weight);
                    p = bp;
                }
                break;
            case 2:
                {
                    System.out.println("请录入你想要加入的水果:");
                    String burdening = sc.next();
                    System.out.println("请录入匹萨的大小:");
                    int size = sc.nextInt();
                    System.out.println("请录入匹萨的价格:");
                    int price = sc.nextInt();
                    //将录入的信息封装为水果匹萨的对象:
                    FruitsPizza fp = new FruitsPizza("水果匹萨",size,price,burdening);
                    p = fp;
                }
                break;
        }
        return p;
    }
}
  • 测试类
public class Test {
    public static void main(String[] args) {
        //选择购买匹萨:
        Scanner sc = new Scanner(System.in);
        System.out.println("请选择你想要购买的匹萨(1.培根匹萨 2.水果匹萨):");
        int choice = sc.nextInt();//选择
        //通过工厂获取匹萨:
        Pizza pizza = PizzaStore.getPizza(choice);
        System.out.println(pizza.showPizza());
    }
}

4 贪吃蛇

4.1 使用技能点

1.循环、分支
2.方法的抽取
3.数组的使用
4.面向对象
5.继承,子类方法的重写
6.接口,接口的实现
7.图形化界面编程GUI:(GUI的组件:窗口,弹窗,面板,文本框,列表框,按钮,图片,事件(鼠标事件,键盘事件)
注意:虽然GUI不流行了,但是学的是思想

4.2 功能和效果

效果

4.3 代码实现

4.3.1 原理图

原理图

4.3.2 将图片加载到程序中

  • 现在本程序中创建一个Images包,包中保存需要使用的照片,如图所示
    文件目录
/**
 * Images这个类,专门用来获取游戏中所涉及的图片
 */
public class Images {
    /*
    现在是面向对象的语言,面向对象的思维--》将图片进行封装 ,封装为一个对象,这样在程序中才可以通过操纵这个对象来操纵图片。
     */
    //将图片的路径封装为一个对象:
    public static URL bodyURL = Images.class.getResource("/images/body.png");
    //将图片封装为程序中一个对象:
    public static ImageIcon bodyImg = new ImageIcon(bodyURL);
    //将图片的路径封装为一个对象:
    public static URL downURL = Images.class.getResource("/images/down.png");
    //将图片封装为程序中一个对象:
    public static ImageIcon downImg = new ImageIcon(downURL);
    //将图片的路径封装为一个对象:
    public static URL foodURL = Images.class.getResource("/images/food.png");
    //将图片封装为程序中一个对象:
    public static ImageIcon foodImg = new ImageIcon(foodURL);
    //将图片的路径封装为一个对象:
    public static URL headerURL = Images.class.getResource("/images/header.png");
    //将图片封装为程序中一个对象:
    public static ImageIcon headerImg = new ImageIcon(headerURL);
    //将图片的路径封装为一个对象:
    public static URL leftURL = Images.class.getResource("/images/left.png");
    //将图片封装为程序中一个对象:
    public static ImageIcon leftImg = new ImageIcon(leftURL);
    //将图片的路径封装为一个对象:
    public static URL rightURL = Images.class.getResource("/images/right.png");
    //将图片封装为程序中一个对象:
    public static ImageIcon rightImg = new ImageIcon(rightURL);
    //将图片的路径封装为一个对象:
    public static URL upURL = Images.class.getResource("/images/up.png");
    //将图片封装为程序中一个对象:
    public static ImageIcon upImg = new ImageIcon(upURL);
}
class TestURL {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        URL url = Images.class.getResource("/");// /指代的就是相对路径,相对/D:/IDEA_workspace/TestJavaSE/out/production/TestSnakeGame/
        System.out.println(url);
    }
}

4.3.3 创建窗体

public class StartGame {
    public static void main(String[] args) {
        //创建一个窗体:
        JFrame jf = new JFrame();
        //给窗体设置一个标题:
        jf.setTitle("贪吃蛇  by jayden");
        //设置窗体弹出的坐标,对应窗体的宽高:
        int width = Toolkit.getDefaultToolkit().getScreenSize().width;
        int height = Toolkit.getDefaultToolkit().getScreenSize().height;
        jf.setBounds((width-800)/2,(height-800)/2,800,800);
        //设置窗体大小不可调节:
        jf.setResizable(false);
        //关闭窗口的同时 程序随之关闭:
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //默认情况下窗体是隐藏效果,必须将窗体进行显现:细节--》这个显现方法最好放在最后
        jf.setVisible(true);
    }
}

4.3.4 创建一个面板

  • 窗体是整个GUI界面,而要进行图像绘制的化是在面板中,所以要在窗体中嵌套面板。
/**
 * @author : jayden
 * GamePanel继承了JPanel以后,才具备面板的功能,才成为一个面板
 */
public class GamePanel extends JPanel {
    /*
    paintComponent这个方法比较特殊,这个方法就属于图形版的main方法
    自动调用
     */
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        //填充背景颜色:
        this.setBackground(new Color(208, 221, 227));
        //画头部图片:
        /*
        paintIcon四个参数:this指的是当前面板  g:指的是使用的画笔  x,y对应的坐标
         */
        Images.headerImg.paintIcon(this,g,-10,10);
        //调解画笔颜色:
        g.setColor(new Color(219, 226, 219));
        //画一个矩形:
        g.fillRect(10,70,770,685);
    }
}
//记得在窗口中加入该面板
public class StartGame {
    public static void main(String[] args) {
        //创建一个窗体:
        JFrame jf = new JFrame();
        //给窗体设置一个标题:
        jf.setTitle("贪吃蛇  by jayden");
        //设置窗体弹出的坐标,对应窗体的宽高:
        int width = Toolkit.getDefaultToolkit().getScreenSize().width;
        int height = Toolkit.getDefaultToolkit().getScreenSize().height;
        jf.setBounds((width-800)/2,(height-800)/2,800,800);
        //设置窗体大小不可调节:
        jf.setResizable(false);
        //关闭窗口的同时 程序随之关闭:
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //创建面板:
        GamePanel gp = new GamePanel();
        //将面板放入窗体:
        jf.add(gp);
        //默认情况下窗体是隐藏效果,必须将窗体进行显现:细节--》这个显现方法最好放在最后
        jf.setVisible(true);
    }
}

4.3.5 画静态的小蛇,并且蛇头将按照行走方向改变

/**
 * @author : jayden
 * GamePanel继承了JPanel以后,才具备面板的功能,才成为一个面板
 */
public class GamePanel extends JPanel {
    //定义两个数组
    //蛇的长度:
    int length;
    //一个数组,专门存储蛇的x轴坐标
    int[] snakeX = new int[200];
    //一个数组,专门存储蛇的y轴坐标
    int[] snakeY = new int[200];
    //定义蛇的行走方向:
    String direction ;
    public void init(){
        //初始化蛇的长度:
        length = 3;
        //初始化蛇头坐标:
        snakeX[0] = 175;
        snakeY[0] = 275;
        //初始化第一节身子坐标:
        snakeX[1] = 150;
        snakeY[1] = 275;
        //初始化第二节身子坐标:
        snakeX[2] = 125;
        snakeY[2] = 275;
        //初始化蛇头的方向:
        direction = "R"; // U  D  L R
    }
    public GamePanel(){
        init();
    }
    /*
    paintComponent这个方法比较特殊,这个方法就属于图形版的main方法
    自动调用
     */
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        //填充背景颜色:
        this.setBackground(new Color(208, 221, 227));
        //画头部图片:
        /*
        paintIcon四个参数:this指的是当前面板  g:指的是使用的画笔  x,y对应的坐标
         */
        Images.headerImg.paintIcon(this,g,-10,10);
        //调解画笔颜色:
        g.setColor(new Color(219, 226, 219));
        //画一个矩形:
        g.fillRect(10,70,770,685);
        //画小蛇:
        //画蛇头:
        if("R".equals(direction)){
            Images.rightImg.paintIcon(this,g,snakeX[0],snakeY[0]);
        }
        if("L".equals(direction)){
            Images.leftImg.paintIcon(this,g,snakeX[0],snakeY[0]);
        }
        if("U".equals(direction)){
            Images.upImg.paintIcon(this,g,snakeX[0],snakeY[0]);
        }
        if("D".equals(direction)){
            Images.downImg.paintIcon(this,g,snakeX[0],snakeY[0]);
        }
        /*//画第一节身子:
        Images.bodyImg.paintIcon(this,g,snakeX[1],snakeY[1]);
        //画第二节身子:
        Images.bodyImg.paintIcon(this,g,snakeX[2],snakeY[2]);*/
        //优化为循环画蛇的身子:
        for(int i = 1;i<length;i++){
            Images.bodyImg.paintIcon(this,g,snakeX[i],snakeY[i]);
        }
    }
}

4.3.6 加入监听事件,空格来控制游戏是否开始

/**
 * @author : jayden
 * GamePanel继承了JPanel以后,才具备面板的功能,才成为一个面板
 */
public class GamePanel extends JPanel {
    //定义两个数组
    //蛇的长度:
    int length;
    //一个数组,专门存储蛇的x轴坐标
    int[] snakeX = new int[200];
    //一个数组,专门存储蛇的y轴坐标
    int[] snakeY = new int[200];
    //游戏只有两个状态,开始,暂停:
    boolean isStart = false;//默认游戏是暂停效果
    //定义蛇的行走方向:
    String direction ;
    public void init(){
        //初始化蛇的长度:
        length = 3;
        //初始化蛇头坐标:
        snakeX[0] = 175;
        snakeY[0] = 275;
        //初始化第一节身子坐标:
        snakeX[1] = 150;
        snakeY[1] = 275;
        //初始化第二节身子坐标:
        snakeX[2] = 125;
        snakeY[2] = 275;
        //初始化蛇头的方向:
        direction = "R"; // U  D  L R
    }
    public GamePanel(){
        init();
        //将焦点定位在当前操作的面板上:
        this.setFocusable(true);
        //加入监听:
        this.addKeyListener(new KeyAdapter(){
            @Override
            public void keyPressed(KeyEvent e) {//监听键盘按键的按下操作
                super.keyPressed(e);
                int keyCode = e.getKeyCode();
                System.out.println(keyCode);
                if(keyCode == 32){
                    isStart = !isStart;//监听到空格以后,游戏开始的就变成暂停的,暂停的就变成开始的
                    repaint();//重绘动作,重新调用paintComponent()方法
                }
            }
        });
    }
    /*
    paintComponent这个方法比较特殊,这个方法就属于图形版的main方法
    自动调用
     */
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        //填充背景颜色:
        this.setBackground(new Color(208, 221, 227));
        //画头部图片:
        /*
        paintIcon四个参数:this指的是当前面板  g:指的是使用的画笔  x,y对应的坐标
         */
        Images.headerImg.paintIcon(this,g,-10,10);
        //调解画笔颜色:
        g.setColor(new Color(219, 226, 219));
        //画一个矩形:
        g.fillRect(10,70,770,685);
        //画小蛇:
        //画蛇头:
        if("R".equals(direction)){
            Images.rightImg.paintIcon(this,g,snakeX[0],snakeY[0]);
        }
        if("L".equals(direction)){
            Images.leftImg.paintIcon(this,g,snakeX[0],snakeY[0]);
        }
        if("U".equals(direction)){
            Images.upImg.paintIcon(this,g,snakeX[0],snakeY[0]);
        }
        if("D".equals(direction)){
            Images.downImg.paintIcon(this,g,snakeX[0],snakeY[0]);
        }
        /*//画第一节身子:
        Images.bodyImg.paintIcon(this,g,snakeX[1],snakeY[1]);
        //画第二节身子:
        Images.bodyImg.paintIcon(this,g,snakeX[2],snakeY[2]);*/
        //优化为循环画蛇的身子:
        for(int i = 1;i<length;i++){
            Images.bodyImg.paintIcon(this,g,snakeX[i],snakeY[i]);
        }
        //如果游戏暂停的,界面中间就应该有一句提示语:
        if(isStart == false){
            //画一个文字:
            g.setColor(new Color(114, 98, 255));
            //三个参数:字体,加粗,字号
            g.setFont(new Font("微软雅黑",Font.BOLD,40));
            //画文字:三个参数:文字内容,x轴坐标,y轴坐标
            g.drawString("点击空格开始游戏",250,330);
        }
    }
}

4.3.7 让蛇动起来

public class GamePanel extends JPanel {
    //定义两个数组
    //蛇的长度:
    int length;
    //一个数组,专门存储蛇的x轴坐标
    int[] snakeX = new int[200];
    //一个数组,专门存储蛇的y轴坐标
    int[] snakeY = new int[200];
    //游戏只有两个状态,开始,暂停:
    boolean isStart = false;//默认游戏是暂停效果
    //加入一个定时器:
    Timer timer;
    //定义蛇的行走方向:
    String direction ;
    public void init(){
        //初始化蛇的长度:
        length = 3;
        //初始化蛇头坐标:
        snakeX[0] = 175;
        snakeY[0] = 275;
        //初始化第一节身子坐标:
        snakeX[1] = 150;
        snakeY[1] = 275;
        //初始化第二节身子坐标:
        snakeX[2] = 125;
        snakeY[2] = 275;
        //初始化蛇头的方向:
        direction = "R"; // U  D  L R
    }
    public GamePanel(){
        init();
        //将焦点定位在当前操作的面板上:
        this.setFocusable(true);
        //加入监听:
        this.addKeyListener(new KeyAdapter(){
            @Override
            public void keyPressed(KeyEvent e) {//监听键盘按键的按下操作
                super.keyPressed(e);
                int keyCode = e.getKeyCode();
                System.out.println(keyCode);
                if(keyCode == 32){
                    isStart = !isStart;//监听到空格以后,游戏开始的就变成暂停的,暂停的就变成开始的
                    repaint();//重绘动作,重新调用paintComponent()方法
                }
            }
        });
        //对定时器进行初始化动作:
        timer = new Timer(150, new ActionListener() {
            /*
            ActionListener是 事件监听
            相当于每100ms监听一下你是否发生了一个动作
            具体的动作放入actionPerformed
             */
            @Override
            public void actionPerformed(ActionEvent e) {
                if(isStart){//游戏是开始状态的时候,蛇才动:
                    //后一节身子走到前一节身子的位置上:
                    for(int i=length-1;i>0;i--){
                        snakeX[i] = snakeX[i-1];
                        snakeY[i] = snakeY[i-1];
                    }
                    //动头:
                    snakeX[0] += 25;
                    //防止蛇超出边界:
                    if(snakeX[0]>750){
                        snakeX[0] = 25;
                    }
                    repaint();//重绘
                }
            }
        });
        //定时器必须要启动:
        timer.start();
    }

    /*
    paintComponent这个方法比较特殊,这个方法就属于图形版的main方法
    自动调用
     */
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        //填充背景颜色:
        this.setBackground(new Color(208, 221, 227));
        //画头部图片:
        /*
        paintIcon四个参数:this指的是当前面板  g:指的是使用的画笔  x,y对应的坐标
         */
        Images.headerImg.paintIcon(this,g,-10,10);
        //调解画笔颜色:
        g.setColor(new Color(219, 226, 219));
        //画一个矩形:
        g.fillRect(10,70,770,685);
        //画小蛇:
        //画蛇头:
        if("R".equals(direction)){
            Images.rightImg.paintIcon(this,g,snakeX[0],snakeY[0]);
        }
        if("L".equals(direction)){
            Images.leftImg.paintIcon(this,g,snakeX[0],snakeY[0]);
        }
        if("U".equals(direction)){
            Images.upImg.paintIcon(this,g,snakeX[0],snakeY[0]);
        }
        if("D".equals(direction)){
            Images.downImg.paintIcon(this,g,snakeX[0],snakeY[0]);
        }
        /*//画第一节身子:
        Images.bodyImg.paintIcon(this,g,snakeX[1],snakeY[1]);
        //画第二节身子:
        Images.bodyImg.paintIcon(this,g,snakeX[2],snakeY[2]);*/
        //优化为循环画蛇的身子:
        for(int i = 1;i<length;i++){
            Images.bodyImg.paintIcon(this,g,snakeX[i],snakeY[i]);
        }
        //如果游戏暂停的,界面中间就应该有一句提示语:
        if(isStart == false){
            //画一个文字:
            g.setColor(new Color(114, 98, 255));
            //三个参数:字体,加粗,字号
            g.setFont(new Font("微软雅黑",Font.BOLD,40));
            //画文字:三个参数:文字内容,x轴坐标,y轴坐标
            g.drawString("点击空格开始游戏",250,330);
        }
    }
}

4.3.8 画食物和吃食物,并且赋予积分,死亡判定

public class GamePanel extends JPanel {
    //定义两个数组
    //蛇的长度:
    int length;
    //一个数组,专门存储蛇的x轴坐标
    int[] snakeX = new int[200];
    //一个数组,专门存储蛇的y轴坐标
    int[] snakeY = new int[200];
    //游戏只有两个状态,开始,暂停:
    boolean isStart = false;//默认游戏是暂停效果
    //加入一个定时器:
    Timer timer;
    //定义蛇的行走方向:
    String direction ;
    //定义食物的x,y轴坐标:
    int foodX;
    int foodY;
    //定义一个积分:
    int score;
    //加入一个变量,判断小蛇的死亡状态:
    boolean isDie = false;//默认情况下小蛇没有死亡
    public void init(){
        //初始化蛇的长度:
        length = 3;
        //初始化蛇头坐标:
        snakeX[0] = 175;
        snakeY[0] = 275;
        //初始化第一节身子坐标:
        snakeX[1] = 150;
        snakeY[1] = 275;
        //初始化第二节身子坐标:
        snakeX[2] = 125;
        snakeY[2] = 275;
        //初始化食物的坐标:
        foodX = 300;
        foodY = 200;

        //初始化蛇头的方向:
        direction = "R"; // U  D  L R
    }
    public GamePanel(){
        init();
        //将焦点定位在当前操作的面板上:
        this.setFocusable(true);
        //加入监听:
        this.addKeyListener(new KeyAdapter(){
            @Override
            public void keyPressed(KeyEvent e) {//监听键盘按键的按下操作
                super.keyPressed(e);
                int keyCode = e.getKeyCode();
                System.out.println(keyCode);
                if(keyCode == 32){
//                    isStart = !isStart;//监听到空格以后,游戏开始的就变成暂停的,暂停的就变成开始的
//                    repaint();//重绘动作,重新调用paintComponent()方法
                    if(isDie){
                        //全部恢复到初始化状态
                        init();
                        isDie = false;
                    }else{//小蛇没有死亡的情况下:
                        isStart = !isStart;
                        repaint();//重绘动作
                    }
                }
                //监听向上箭头:
                if(keyCode == KeyEvent.VK_UP){
                    direction = "U";
                }
                //监听向下箭头:
                if(keyCode == KeyEvent.VK_DOWN){
                    direction = "D";
                }
                //监听向左箭头:
                if(keyCode == KeyEvent.VK_LEFT){
                    direction = "L";
                }
                //监听向右箭头:
                if(keyCode == KeyEvent.VK_RIGHT){
                    direction = "R";
                }
            }
        });
        //对定时器进行初始化动作:
        timer = new Timer(150, new ActionListener() {
            /*
            ActionListener是 事件监听
            相当于每100ms监听一下你是否发生了一个动作
            具体的动作放入actionPerformed
             */
            @Override
            public void actionPerformed(ActionEvent e) {
                if(isStart&&isDie == false){//游戏是开始状态的时候,蛇才动:
                    //后一节身子走到前一节身子的位置上:
                    for(int i=length-1;i>0;i--){
                        snakeX[i] = snakeX[i-1];
                        snakeY[i] = snakeY[i-1];
                    }
                    //动头:
                    if("R".equals(direction)){
                        snakeX[0] += 25;
                    }
                    if("L".equals(direction)){
                        snakeX[0] -= 25;
                    }
                    if("U".equals(direction)){
                        snakeY[0] -= 25;
                    }
                    if("D".equals(direction)){
                        snakeY[0] += 25;
                    }
                    //防止蛇超出边界:
                    if(snakeX[0]>750){
                        snakeX[0] = 25;
                    }
                    if(snakeX[0]<25){
                        snakeX[0] = 750;
                    }
                    if(snakeY[0]<100){
                        snakeY[0] = 725;
                    }
                    if(snakeY[0]>725){
                        snakeY[0] = 100;
                    }
                    //防止蛇超出边界:
                    if(snakeX[0]>750){
                        snakeX[0] = 25;
                    }
                    //检测碰撞的动作:
                    //食物的坐标和蛇头的坐标一样的时候,才是碰撞了
                    if(snakeX[0] == foodX&&snakeY[0] == foodY){
                        //蛇长度加1:
                        length++;
                        //吃上食物以后 积分加10分:
                        score += 10;
                        //食物坐标改变:随机生成坐标 --》细节:坐标必须是25的倍数
                        /*
                        [25,750] -> [1,30]*25
                        [1,30]
                        Math.random() -> [0.0,1.0)
                        Math.random()*30 -> [0.0,30.0)
                        (int)(Math.random()*30) -> [0,29]
                        (int)(Math.random()*30)+1 -> [1,30]
                         */
                        foodX = ((int)(Math.random()*30)+1)*25;//[25,750]
                        /*
                        [100,725] -> [4,29]*25
                        [4,29]->[0,25]+4
                        [0,25]
                        new Random().nextInt(26) -> [0,26) ->[0,25]
                         */
                        foodY = (new Random().nextInt(26)+4)*25;//[100,725]
                    }
                    //死亡判定:蛇头和任意一节身子碰撞都是死亡:
                    for(int i = 1;i<length;i++){
                        if(snakeX[0]==snakeX[i]&&snakeY[0]==snakeY[i]){
                            //将死亡 状态改为:true
                            isDie = true;
                        }
                    }
                    repaint();//重绘
                }
            }
        });
        //定时器必须要启动:
        timer.start();
    }

    /*
    paintComponent这个方法比较特殊,这个方法就属于图形版的main方法
    自动调用
     */
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        //填充背景颜色:
        this.setBackground(new Color(208, 221, 227));
        //画头部图片:
        /*
        paintIcon四个参数:this指的是当前面板  g:指的是使用的画笔  x,y对应的坐标
         */
        Images.headerImg.paintIcon(this,g,-10,10);
        //调解画笔颜色:
        g.setColor(new Color(219, 226, 219));
        //画一个矩形:
        g.fillRect(10,70,770,685);
        //画小蛇:
        //画蛇头:
        if("R".equals(direction)){
            Images.rightImg.paintIcon(this,g,snakeX[0],snakeY[0]);
        }
        if("L".equals(direction)){
            Images.leftImg.paintIcon(this,g,snakeX[0],snakeY[0]);
        }
        if("U".equals(direction)){
            Images.upImg.paintIcon(this,g,snakeX[0],snakeY[0]);
        }
        if("D".equals(direction)){
            Images.downImg.paintIcon(this,g,snakeX[0],snakeY[0]);
        }
        /*//画第一节身子:
        Images.bodyImg.paintIcon(this,g,snakeX[1],snakeY[1]);
        //画第二节身子:
        Images.bodyImg.paintIcon(this,g,snakeX[2],snakeY[2]);*/
        //优化为循环画蛇的身子:
        for(int i = 1;i<length;i++){
            Images.bodyImg.paintIcon(this,g,snakeX[i],snakeY[i]);
        }
        //如果游戏暂停的,界面中间就应该有一句提示语:
        if(isStart == false){
            //画一个文字:
            g.setColor(new Color(114, 98, 255));
            //三个参数:字体,加粗,字号
            g.setFont(new Font("微软雅黑",Font.BOLD,40));
            //画文字:三个参数:文字内容,x轴坐标,y轴坐标
            g.drawString("点击空格开始游戏",250,330);
        }
        //画食物:
        Images.foodImg.paintIcon(this,g,foodX,foodY);
        //画积分:
        g.setColor(new Color(255, 248, 248));
        g.setFont(new Font("微软雅黑",Font.BOLD,20));
        g.drawString("积分:"+score,670,45);
        //画入死亡状态:
        if(isDie){
            g.setColor(new Color(255, 82, 68));
            g.setFont(new Font("微软雅黑",Font.BOLD,20));
            g.drawString("小蛇死亡,游戏停止,按下空格重新开始游戏",200,330);
        }
    }
}

4.3.9 把游戏打包

12345

  • 打开jar包所在位置:
    5
  • 直接点击jar包就可以运行:
    6
  • 如果双击无法打开:
    7
    (1)将默认打开方式设置为JRE对应的javaw.exe上,然后修改相应注册表即可
    8
    (2)打开注册表编辑器,找到“HKEY_CLASSES_ROOT\Applications\javaw.exe\shell\open\command”,在其中文件打开命令中加入参数 -jar,修改后的数值类似:“C:\Program Files\Java\jre7\bin\javaw.exe” -jar “%1”,保存并退出注册表编辑器。(这一步很重要,看清涉及到的路径大小写,找对要修改的地方;-jar前后各有一个空格!!!)
    9
    10
    然后执行成功。
  • 5
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jayden-leo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值