JAVA小项目(6)javaSE

article/2025/10/12 8:16:31

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-161-33Math.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方法:@Overridepublic 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方法:@Overridepublic 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方法自动调用*/@Overrideprotected 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方法自动调用*/@Overrideprotected 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(){@Overridepublic void keyPressed(KeyEvent e) {//监听键盘按键的按下操作super.keyPressed(e);int keyCode = e.getKeyCode();System.out.println(keyCode);if(keyCode == 32){isStart = !isStart;//监听到空格以后,游戏开始的就变成暂停的,暂停的就变成开始的repaint();//重绘动作,重新调用paintComponent()方法}}});}/*paintComponent这个方法比较特殊,这个方法就属于图形版的main方法自动调用*/@Overrideprotected 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(){@Overridepublic 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*/@Overridepublic 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方法自动调用*/@Overrideprotected 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(){@Overridepublic 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*/@Overridepublic 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]){//将死亡 状态改为:trueisDie = true;}}repaint();//重绘}}});//定时器必须要启动:timer.start();}/*paintComponent这个方法比较特殊,这个方法就属于图形版的main方法自动调用*/@Overrideprotected 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
    然后执行成功。

http://chatgpt.dhexx.cn/article/lYsfYLaK.shtml

相关文章

java项目源码分享——适合新手练手的java项目

源码下载&#xff08;实例一&#xff09;&#xff1a;jsp开发完整的博研图书馆后台管理系统&#xff0c;不使用框架开发的&#xff0c;太完美了 源码下载&#xff08;实例二&#xff09;&#xff1a;javaWeb图书馆管理系统源码mysql版本 源码下载&#xff08;实例三&#xff09…

java小项目 ATM机(简易版)

目录 说明 项目介绍 功能介绍 结构图 各模块代码 登录界面 服务选择界面 存取款界面 修改密码模块 转账模块 总代码 说明 简单做了一个java的ATM机项目、本项目只能作为一个简单的运行程序。因为没有学到数据库&#xff0c;文件等内容&#xff0c;没有存储功能&…

适合新手练习的 java 小项目

适合新手练习的 java 小项目 智能电话本 视频连接在下方↓ 包括源码也在下面 不要问我为什么推荐这个&#xff0c;因为我也只是一个新手&#xff0c;这个项目是纯命令行的&#xff0c; 不需要数据库和网页编程知识&#xff0c;做起来很简单&#xff0c;可以帮助新手巩固基础…

JavaWeb新手小项目以及源码

此项目主要实现的功能有&#xff1a; jsp连接数据库、MD5加密、验证码验证、Ajax、文件的上传与下载、session登录验证等。 先来几张截图&#xff1a; 一、首先写登录页面 login.jsp <% page language"java" import"java.util.*" pageEncoding&qu…

java小项目水果摊

介绍 刚学完java 集合和IO流&#xff0c;想做了一个简单的小项目来练手&#xff0c;于是我就运用一些基础知识做了这个水果摊。水果摊的主要功能有&#xff1a; 进货查看水果列表购买水果查看购物车结账退出 都是一些简单的功能&#xff0c;下面就来展示代码&#xff1b; …

Java个人Web小项目

JavaWeb-HTML实列开发 目录源代码链接部分效果图 目录 #1.用户列表开发 新建一个Maven项目 创建包&#xff1a;com.iflytek 在项目中 在com.iflytek.controller中新建一个类为控制器类&#xff1a;(本网址为/UserController.java) UserController.java package com.iflytek…

Java小项目(一)---超市管理系统

超市管理系统 一、使用技术二、实现功能三、运行效果图3.1 货物清单3.2 增加货物3.3 删除货物3.4 修改货物3.5 退出 四、实现的代码4.1 Good商品货物类4.2 ShoppingSystem超市管理系统测试类 一、使用技术 Java SE 二、实现功能 使用选择结构&#xff0c;循环结构&#xff0…

Java小项目另一个水果摊

文章目录 前言一、包和表截图二、源代码1.JDBC连接Mysql数据管理员界面&#xff1a;增删查改用户界面 &#xff1a;查找水果建立断开连接 2.GUI窗口界面开始选择界面用户购买水果界面管理员登录界面管理员界面 3.水果属性4.main方法 总结拒绝白嫖&#xff0c;给个三连鼓励一下吧…

JavaWeb之综合小项目

案例需求&#xff1a; 使用Java程序操作数据库&#xff0c;并把结果显示在jsp页面上。 &#xff08;这里只做查询操作&#xff0c;增删改操作类似如此&#xff09; 使用工具&#xff1a; maven&#xff0c;idea&#xff0c;tomcat&#xff0c;MySQL数据库。 使用技术&#xff1…

20个Java小项目,献给嗜学如狂的人,拿来练练手

给大家推荐一条由浅入深的JAVA学习路径&#xff0c;首先完成 Java基础、JDK、JDBC、正则表达式等基础实验&#xff0c;然后进阶到 J2SE 和 SSH 框架学习。最后再通过有趣的练手项目进行巩固。 JAVA基础 1. Java编程语言&#xff08;新版&#xff09; 2. Java进阶之设计模式…

Java面试:java小项目实例

前言 本人是底层 211 本科,刚毕业,⽆科研经历,但是有些项⽬经历。 在国内监控行业某头部企业做过一段时间的实习。 想着投下字节,可以积累⼀下⾯试经验和为金九银十面招做准备。投了简历之后,过了一段时 间,HR 就打电话跟我约时间, 说明一下,我投的是北京 office。 以下就是一…

java 练手小项目

学习了javaSE的基础&#xff0c;为了巩固对Java面向对象编程&#xff0c;以及java多线程编程的理解&#xff0c;使用swing 写了一个很简单的小项目&#xff0c;源码github地址: https://github.com/pythondever/swing-demo 喜欢的同学可以学习学习 整体代码流程 * 1. JFra…

javaWeb小项目

作为一个学习加Java的小白&#xff0c;非常开心能记录下自己的成长历程。技术有限&#xff0c;请见谅&#xff01; 我主要学习的是Java后端&#xff0c;当我学着做了一个web小项目之后对javaee项目也有了初步见解&#xff01; 老师说万物皆对象&#xff0c;万物皆增删改查。我的…

java练习小项目(一)

学习java有一段时间了&#xff0c;都是处于那种三天打鱼&#xff0c;两天晒网的状态&#xff0c;没有效率&#xff0c;因为方法不对&#xff0c;一直是在看资料&#xff0c;看视频&#xff0c;并没有实际上手项目&#xff0c;就算当时看了&#xff0c;记住了&#xff0c;最后还…

适合Java新手练手的小项目!

对于很多朋友来说&#xff0c;Java是学习编程的开始&#xff0c;也有很多朋友希望通过Java可以找到工作&#xff0c;那么当我们学习了Java的基础知识之后&#xff0c;我们急需要一些项目去帮我们整理一下自己学习的知识点以及提高一下编程能力&#xff0c;对小的工程有一个大致…

Java小项目谁看谁都会(图书管理)

在我之前的几篇博客中对于Java语法&#xff0c;思想等等进行了总结&#xff0c;但是还是差点那味&#xff0c;就是没有将这些知识串起来那么今天的这篇博客我就将Java中&#xff1a;类 对象 封装 继承 多态 抽象类 接口等等知识共同使用完成一个Java的小项目一起来看 介绍 我…

推荐几个适合新手的Java练手项目(好玩又有趣)

Java练手项目第一波 一、坦克大战 链接&#xff1a;https://www.bilibili.com/video/BV1zP4y1b7gw/?spm_id_from333.337.search-card.all.click Java练手小项目&#xff0c;熟练掌握面向对象编程思想、对象池的使用、IO流、多线程、GUI等基础。 二、贪吃蛇 链接&#xff1a;ht…

10个优质的Java练手项目

10个优质的Java练手项目 最近有很多小伙伴私信我说推荐几个毕设项目&#xff0c;还有就是学了Java有一段时间了&#xff0c;想找几个项目想练练手&#xff0c;在面试的时候也可以增加一点项目经验。 在这里我收集了10个可以直接导入运行的项目。 由简单到复杂&#xff0c;分别…

JAVA小项目(一)——一个简单的记帐本【轻松入门,附源码】

目录 1. 实现效果 2.项目架构 3. 细节代码实现 &#x1f31e;哈喽&#xff0c;大家好丫&#xff0c;你们的小郭子又来啦 ~ &#x1f31e;今天我们用java来写一个简单的小项目——【记账本】&#xff0c;嘿嘿 话不多说&#xff0c;直接上干货&#xff0c; 1. 实现效果 2.项目…

【目标定位】基于matlab TDOA GPS混合定位【含Matlab源码 2310期】

⛄一、基于粒子滤波污染源定位简介 1 混合定位的系统结构 本文提出的GPS/TDOA混合定位系统结构可见于图1。 移动终端集成了无线通信模块和GPS接收模块,终端可同时测得通信网络中相对于服务基站的TDOA和GPS卫星到终端的伪距。在CDMA通信系统中,从通信终端测量TDOA的具体方法和…