JAVA 实现贪吃蛇

xiaoxiao2021-02-28  49

本人为初学者:

         背景可以换成你自己的图片。(有注释)

import java.awt.Color;import java.awt.Container;import java.awt.Graphics;import java.awt.Image;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import javax.swing.ImageIcon;import javax.swing.JFrame;import javax.swing.JPanel;public class Game extends JFrame{ Container c=this.getContentPane(); private static final long serialVersionUID = 1L; //TODO:变量声明 gameKeyListener keyListener; //蛇的位置 int[] snakeColum=new int[400];//列 int[] snakeRow=new int[400];//行 //食物的位置 int foodcolum=(int)(Math.random()*20);//列 int foodRow=(int)(Math.random()*20);//行 //蛇当前的长度 int snakeLength=3; //游戏运行的线程 MyThread m=new MyThread(200); //方向 /* *上0 下1 左2 右3  **/ int drirection=0; public Game() { //TODO:初始化 snakeColum[0]=10; snakeRow[0]=10; snakeColum[1]=11; snakeRow[1]=10; snakeColum[2]=12; snakeRow[2]=10; init(); //添加键盘监听事件 keyListener= new gameKeyListener(); this.addKeyListener(keyListener); //设置窗体为绘图对象面板 repaint(); c.add(new DrawPanel()); //setContentPane(new DrawPanel()); //窗体可视化 this.setVisible(true); } //初始化窗体 private void init() { // 窗口的特征 this.setTitle("贪吃蛇"); this.setSize(620, 650);// 设置窗口大小==设置蛇活动的范围 // this.pack();// 自动适应窗口大小 this.setResizable(false);// 禁止放大按钮 this.setLocationRelativeTo(null);// 窗体居中 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } //画蛇图 class DrawPanel extends JPanel{ private static final long serialVersionUID = 1L; /* (non-Javadoc) * @see javax.swing.JComponent#paint(java.awt.Graphics) */ @Override public void paint(Graphics g) { // TODO Auto-generated method stub super.paint(g); /*//画背景图 Image image=new ImageIcon(this.getClass().getResource("bg1.jpg")).getImage(); g.drawImage(image, 0, 0, null);*/ /* * 哪个先画,重复时候谁就被覆盖先 * 运动的时候,先画蛇身,移动时候就不会把蛇头覆盖了 */         //画蛇身         for(int i=1;i<snakeLength;i++) {         g.setColor(Color.green);         g.fillRect((snakeColum[i])*30,(snakeRow[i])*30, 30, 30);//画实心矩形,位置在(0,0),长为30,宽为30         }       //画蛇头 g.setColor(Color.BLUE);         g.fillRect(snakeColum[0]*30,snakeRow[0]*30, 30, 30);//画实心矩形,位置在(0,0),长为30,宽为30         //画食物         g.setColor(Color.red);         g.fillOval(foodcolum*30,foodRow*30, 30, 30); } } //蛇运动的线程 class MyThread implements Runnable{ //游戏运行的速度        int time;        Thread t=null; public MyThread(int time) { this.time=time; t=new Thread(this); //当条用构造函数时,线程开启。 t.start(); } /* (non-Javadoc) * @see java.lang.Runnable#run() */ @Override public void run() { // TODO Auto-generated method stub try { while(true) { Thread.sleep(time); /* * 哪个先画,重复时候谁就被覆盖先 * 运动的时候,先画蛇身,移动时候就不会把蛇头覆盖了 */ //蛇身体动 for(int i=snakeLength-1;i>=1;i--) { snakeColum[i]=snakeColum[i-1]; snakeRow[i]=snakeRow[i-1]; } //蛇头动 /* *上0 下1 左2 右3  **/ switch(drirection) { case 0: snakeRow[0]--; break; case 1: snakeRow[0]++; break; case 2: snakeColum[0]--; break; case 3: snakeColum[0]++; break; } //判断是否吃豆--就是判断蛇头坐标是否和豆的坐标重合 if(snakeColum[0]==foodcolum && snakeRow[0]==foodRow) { //从新生成食物的位置 foodcolum=(int)(Math.random()*20);//列 foodRow=(int)(Math.random()*20);//行 snakeLength++;   //在尾巴生成一节蛇身 snakeColum[snakeLength-1]=snakeColum[snakeLength-2]; snakeRow[snakeLength-1]=snakeRow[snakeLength-2]; } //判断死亡 //撞墙死 if(snakeRow[0]< 0||snakeRow[0]>19 ||snakeColum[0]<0||snakeColum[0]>19) { System.exit(-1); } //自咬死 //就是判断蛇头的位置是否和蛇身的位置有没有重合的 for(int i=1;i<snakeLength;i++) { if(snakeRow[0]==snakeRow[i] && snakeColum[0]==snakeColum[i]) { System.exit(-1); } } repaint(); } }catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } } //键盘监听事件 class gameKeyListener implements KeyListener{ /* (non-Javadoc) * @see java.awt.event.KeyListener#keyPressed(java.awt.event.KeyEvent) */ @Override public void keyPressed(KeyEvent e) { // TODO Auto-generated method stub switch (e.getKeyCode()) { case KeyEvent.VK_LEFT:// 左 drirection=2; break; case KeyEvent.VK_RIGHT:// 右 drirection=3; break; case KeyEvent.VK_UP:// 上 drirection=0; break; case KeyEvent.VK_DOWN:// 下 drirection=1; break; } repaint(); } /* (non-Javadoc) * @see java.awt.event.KeyListener#keyReleased(java.awt.event.KeyEvent) */ @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub } /* (non-Javadoc) * @see java.awt.event.KeyListener#keyTyped(java.awt.event.KeyEvent) */ @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub } } public static void main(String[] args) { new Game(); }}

转载请注明原文地址: https://www.6miu.com/read-2620447.html

最新回复(0)