javaEE基础看了两遍了,第一次没记笔记都忘了,无奈从头学记笔记了。
本着 代码审计的目的学习java,到gui这里,走不动道了,发现很有意思。
前后编写了两个小demo。一个是冰墩墩.jar,一个是jar包后门植入。
源码三个文件
import javax.swing.*; import java.net.URL; public class Data { public static URL headerUrl = Data.class.getResource("statics\\header.png"); public static ImageIcon header = new ImageIcon(headerUrl); public static URL upUrl = Data.class.getResource("statics\\up.png"); public static ImageIcon up = new ImageIcon(upUrl); public static URL downUrl = Data.class.getResource("statics\\down.png"); public static ImageIcon down = new ImageIcon(downUrl); public static URL leftUrl = Data.class.getResource("statics\\left.png"); public static ImageIcon left = new ImageIcon(leftUrl); public static URL rightUrl = Data.class.getResource("statics\\right.png"); public static ImageIcon right = new ImageIcon(rightUrl); public static URL bodyUrl = Data.class.getResource("statics\\body.png"); public static ImageIcon body = new ImageIcon(bodyUrl); public static URL foodUrl = Data.class.getResource("statics\\food.png"); public static ImageIcon food = new ImageIcon(foodUrl); }
import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.Random; public class GamePanel extends JPanel implements KeyListener, ActionListener{ //面板 static int code; int length;//蛇的长度 int [] snakeX = new int [600];//蛇的身体 int [] snakeY = new int [500]; String fx; boolean isStart = false;//游戏是否开始 //每隔多少秒执行一次 -- 设置移动速度 Timer timer = new Timer( 125, this); //定义一个食物 int foodx; int foody; Random random = new Random(); //添加死亡判断 boolean isFail = false; //积分系统 int score; public GamePanel(){ init(); //获取键盘的监听事件 this.setFocusable(true);//让焦点聚集在游戏上 this.addKeyListener(this); timer.start(); } public void init(){ length = 3;//初始长度为3 snakeX[0] = 100;snakeY[0] =100;//设置初始位置(头部坐标) snakeX[1] = 75;snakeY[1] =100;//第一个身体 snakeX[2] = 50;snakeY[2] =100;//第二个身体 fx = "R"; //默认方向为右 foodx = 25 + 25*random.nextInt(34); foody = 75 + 25*random.nextInt(24);//生成的随机数不能超过格子 score = 0; } //画板;画界面;画蛇 protected void paintComponent(Graphics g){ super.paintComponent(g);//调用父类方法来清楚屏幕 this.setBackground(Color.WHITE); //绘制广告栏 Data.header.paintIcon(this, g,25,11); //绘制游戏区域,画一个矩形 g.fillRect(25, 75, 850, 600); //画一条静态小蛇 if(fx.equals("R")){//根据不同方向,画不同方向的小蛇的头部 Data.right.paintIcon(this, g, snakeX[0], snakeY[0]); }else if(fx.equals("L")){ Data.left.paintIcon(this, g, snakeX[0], snakeY[0]); }else if(fx.equals("U")){ Data.up.paintIcon(this, g, snakeX[0], snakeY[0]); }else if(fx.equals("D")){ Data.down.paintIcon(this, g, snakeX[0], snakeY[0]); } for(int i = 1;i<length;i++){//循环打印身体长度 Data.body.paintIcon(this, g, snakeX[i], snakeY[i]); } //画食物 Data.food.paintIcon(this, g, foodx, foody); //画积分 g.setColor(Color.WHITE);//设置画笔颜色 g.setFont(new Font("微软雅黑",Font.BOLD,18));//设置字体样式,粗体,和大小 g.drawString("长度"+length, 750, 30);//画字体 g.drawString("分数"+score, 750,55);//画字体 //开始提示 if(isStart==false){ //画一个文字 g.setColor(Color.WHITE);//设置画笔颜色 g.setFont(new Font("微软雅黑",Font.BOLD,40));//设置字体样式,粗体,和大小 g.drawString("按下空格开始游戏", 300, 300);//画字体 } //失败 if(isFail){ //画一个文字 g.setColor(Color.WHITE);//设置画笔颜色 g.setFont(new Font("微软雅黑",Font.BOLD,40));//设置字体样式,粗体,和大小 g.drawString("游戏失败,按下空格重新开始", 300, 300);//画字体 } } //接受键盘的输入:监听 @Override public void keyPressed(KeyEvent e) { // TODO Auto-generated method stub //键盘按下的监听事件 //获取按下的键盘是哪一个键 int keyCode = e.getKeyCode(); if((keyCode==KeyEvent.VK_LEFT||keyCode==KeyEvent.VK_A)&&fx=="R"){ keyCode=KeyEvent.VK_RIGHT; }else if((keyCode==KeyEvent.VK_RIGHT||keyCode==KeyEvent.VK_D)&&fx=="L"){ keyCode=KeyEvent.VK_LEFT; }else if((keyCode==KeyEvent.VK_UP||keyCode==KeyEvent.VK_W)&&fx=="D"){ keyCode=KeyEvent.VK_DOWN; }else if((keyCode==KeyEvent.VK_DOWN||keyCode==KeyEvent.VK_S)&&fx=="U"){ keyCode=KeyEvent.VK_UP; } //如果按下的是空格,启动或暂停 if(keyCode==KeyEvent.VK_SPACE){ if(isFail){//失败,游戏再来一遍 isFail = false; init();//重新初始化 }else{ isStart = !isStart; } repaint();//刷新界面 } if(keyCode==KeyEvent.VK_LEFT||keyCode==KeyEvent.VK_A){ fx = "L"; } if(keyCode==KeyEvent.VK_RIGHT||keyCode==KeyEvent.VK_D){ fx = "R"; } if(keyCode==KeyEvent.VK_UP||keyCode==KeyEvent.VK_W){ fx = "U"; } if(keyCode==KeyEvent.VK_DOWN||keyCode==KeyEvent.VK_S){ fx = "D"; } } //定时器,监听时间 @Override public void actionPerformed(ActionEvent e) { //如果游戏处于开始状态,而且游戏没有结束 if(isStart&&isFail==false){ for(int i = length-1; i > 0; i--){//除了脑袋身体都向前移动 snakeX[i] = snakeX[i-1]; snakeY[i] = snakeY[i-1]; } //控制方向头部移动 if(fx.equals("R")){ snakeX[0] = snakeX[0] + 25; //边界判断 if(snakeX[0]>850){ snakeX[0] = 25;//回到原始位置 } }else if(fx.equals("L")){ snakeX[0] = snakeX[0] - 25; //边界判断 if(snakeX[0]<25){ snakeX[0] = 850;//回到原始位置 } }else if(fx.equals("U")){ snakeY[0] -= 25; //边界判断 if(snakeY[0]<75){ snakeY[0] = 650;//回到原始位置 } }else if(fx.equals("D")){ snakeY[0] += 25; //边界判断 if(snakeY[0]>650){ snakeY[0] = 75;//回到原始位置 } } //如果吃到食物:坐标重合 if(snakeX[0]==foodx&&snakeY[0]==foody){ //长度加一 score +=10 ; //重新生成食物 foodx = 25 + 25*random.nextInt(34); foody = 75 + 25*random.nextInt(24);//生成的随机数不能超过格子 length += 1; } //结束判断 for(int i = 1;i < length;i++){ if(snakeX[0]==snakeX[i]&&snakeY[0]==snakeY[i]){ isFail = true;//设置失败 } } //移动完要刷新界面 repaint(); } //让计时器动起来 timer.start(); } @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub //键盘按下,弹起 } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub //键盘释放 } }
import javax.swing.*; public class startGame { public static void main(String[] args) { // 窗体 JFrame frame = new JFrame(); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.setVisible(true); frame.setBounds(100,100,900,720); frame.setResizable(false); frame.setTitle("贪吃蛇🐍 by private null"); frame.add(new GamePanel()); }
有个bug算是,但也不是,java是跨平台的 win上空格不能开始游戏,放到linux里 可以正常玩
也不知道是电脑问题 还是啥问题,