代码下载
最近学习了Java的贪吃蛇的制作方法,重新回顾了一下Java的窗口知识,下面就讲一下它的流程吧:
一、首先创建并设置窗口的属性:
然后设置窗口是显示出来的:
二、窗口创建完成后就要在窗口加一个画布:
并添加画布基本属性:
在main方法中调用
加入图片装饰
三、画布完成后就要设置蛇的初始化状态
import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.Random; /** * Created by Taoyongpan on 2017/3/23. */ public class SnakePanel extends JPanel implements KeyListener,ActionListener{ ImageIcon body = new ImageIcon("img/body.png"); ImageIcon food = new ImageIcon("img/food.png"); ImageIcon title = new ImageIcon("img/title.jpg"); ImageIcon up = new ImageIcon("img/up.png"); ImageIcon down = new ImageIcon("img/down.png"); ImageIcon left = new ImageIcon("img/left.png"); ImageIcon right = new ImageIcon("img/right.png"); int[] snakex = new int[750]; int[] snakey = new int[750]; //随机产生食物 Random random = new Random(); int foodx = random.nextInt(34)*25+25; int foody = random.nextInt(24)*25+75; //贪吃蛇长度 int len = 3; //得分 int score = 0; //贪吃蛇速度 int speed = 0; //贪吃蛇方向 String fangxiang = "R";//R向右,L向左,U向上,D向下 //默认游戏为不开始 boolean isStarted = false; //判断游戏是否结束 boolean isFailed = false; Timer timer = new Timer(100,this); //重新构造 public SnakePanel(){ //获得焦点 this.setFocusable(true); //添加键盘监听 this.addKeyListener(this); setup(); timer.start(); } public void paint(Graphics g){ //调用paint方法 super.paint(g); this.setBackground(Color.WHITE); title.paintIcon(this,g,25,11); //画一个方框 g.fillRect(25,75,850,600); //画蛇头 if(fangxiang.equals("R")){ right.paintIcon(this,g,snakex[0],snakey[0]); }else if(fangxiang.equals("L")){ left.paintIcon(this,g,snakex[0],snakey[0]); }else if(fangxiang.equals("U")){ up.paintIcon(this,g,snakex[0],snakey[0]); }else if(fangxiang.equals("D")){ down.paintIcon(this,g,snakex[0],snakey[0]); } //画蛇身体 for(int i = 1; i < len; i++){ body.paintIcon(this,g,snakex[i],snakey[i]); } //设置开始的提示语句 if(!isStarted){ g.setColor(Color.WHITE); g.setFont(new Font("arial",Font.BOLD,30)); g.drawString("Press Space to Start/Stop",300,300); } //设置失败时候的提示语句 if (isFailed){ g.setColor(Color.WHITE); g.setFont(new Font("arial",Font.BOLD,30)); g.drawString("Game over,Press Space to ReStart",300,300); } //添加食物 food.paintIcon(this,g,foodx,foody); g.setColor(Color.WHITE); g.setFont(new Font("arial",Font.PLAIN,20)); g.drawString("Score:"+score,750,30); g.drawString("Length:"+len,750,50); } //初始化蛇 public void setup(){ isFailed = false; isStarted = false; len = 3; //默认方向为R fangxiang = "R"; snakex[0] = 100; snakey[0] = 100; snakex[1] = 75; snakey[1] = 100; snakex[2] = 50; snakey[2] = 100; } //在源组件上按下一个键然后释放该键后被调用 @Override public void keyTyped(KeyEvent e) { } //在源组件上按下一个键后被调用 @Override public void keyReleased(KeyEvent e) { } // 在源组件上释放一个键后被调用 @Override public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); //敲空格键 /** * VK_HOME Home键 VK_CONTROL 控制键 VK_END End键 VK_SHIFT shift键 VK_PGUP page up键 VK_BACK_SPACE 退格键 VK_PGDN page down键 VK_CAPS_LOCK 大小写锁定键 VK_UP 上箭头 VK_NUM_LOCK 小键盘锁定键 VK_DOWN 下箭头 VK_ENTER 回车键 VK_LEFT 左箭头 VK_UNDEFINED 未知键 VK_RIGHT 右箭头 VK_F1--VK_F12 F1 -- F12 VK_ESCAPE Esc键 VK_0 --VK_9 0 --- 9 VK_TAB Tab键 VK_A --VK_Z A----Z */ if(keyCode == KeyEvent.VK_SPACE){ if (isFailed) { setup(); }else { isStarted = !isStarted; } repaint(); }else if (keyCode == KeyEvent.VK_UP && fangxiang != "D"){ fangxiang = "U"; }else if (keyCode == KeyEvent.VK_DOWN&& fangxiang != "U"){ fangxiang = "D"; }else if (keyCode == KeyEvent.VK_LEFT&& fangxiang != "R"){ fangxiang = "L"; }else if (keyCode == KeyEvent.VK_RIGHT&& fangxiang != "L"){ fangxiang = "R"; } } //就像一个闹钟一样 /** * 这是一个事件监听器,可以处理类似单击鼠标时触发的事件 * ActionEvent就是一个事件类,传入的e就是该事件的对象 * @param e */ @Override public void actionPerformed(ActionEvent e) { //再定义一个闹钟 timer.start(); //移动数据 if(isStarted&&!isFailed){ //移动身体 for (int i = len ; i > 0 ; i--){ snakex[i] = snakex[i-1]; snakey[i] = snakey[i-1]; } //移动头 if(fangxiang.equals("R")){ snakex[0] = snakex[0] + 25; if (snakex[0] >850){ isFailed = true; //snakex[0] = 25; } }else if(fangxiang.equals("L")){ snakex[0] = snakex[0] - 25; if (snakex[0] < 25){ //snakex[0] = 850; isFailed = true; } }else if(fangxiang.equals("U")){ snakey[0] = snakey[0] - 25; if (snakey[0] <75 ){ //snakey[0] = 650; isFailed = true; } }else if(fangxiang.equals("D")){ snakey[0] = snakey[0] + 25; if(snakey[0] > 650){ //snakey[0] = 75; isFailed = true; } } if(snakex[0] == foodx&&snakey[0] == foody){ len++; score++; foodx = random.nextInt(34)*25+25; foody = random.nextInt(24)*25+75; } for (int i= 1;i<len;i++){ if (snakex[0] == snakex[i] && snakey[0] == snakey[i]) { isFailed = true; } } } //repaint() repaint(); } }