首页 > 代码库 > 用Java开发贪吃蛇游戏
用Java开发贪吃蛇游戏
贪吃蛇游戏的设计步骤:
Part 1:
设计游戏图纸
画出900*700的白色窗口
在窗口上添加画布
在画布上添加标题
在画布上添加黑色游戏区
Part 2:
放置静态的蛇:一个头、两个身体
加上开始提示:按空格键开始游戏
让蛇动起来:监听Timer事件,平移数据
实现游戏暂停
实现转向功能
Part 3:
添加食物
吃掉食物
添加死亡条件
实现“重新开始”功能
添加分数和长度
游戏图纸如下:
蛇及游戏框的素材如下:
Snake主类:
1 package snake; 2 3 import javax.swing.JFrame; 4 import javax.swing.JPanel; 5 6 public class Snake { 7 8 public static void main(String[] args) { 9 10 JFrame frame = new JFrame(); // 创建一个游戏界面的框架11 frame.setBounds(10, 10, 900, 720); // 设置框架的大小12 frame.setResizable(false); // 设置框架大小为不能改变13 // 点击关闭按钮 关闭游戏界面14 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);15 16 SnakePanel panel = new SnakePanel(); //添加画布17 frame.add(panel); // 刚添加时画布是空的看不到18 19 frame.setVisible(true); // 允许显示游戏界面20 }21 22 }
SnakePanel类:
1 package snake; 2 3 import java.awt.Color; 4 import java.awt.Font; 5 import java.awt.Graphics; 6 import java.awt.event.ActionEvent; 7 import java.awt.event.ActionListener; 8 import java.awt.event.KeyEvent; 9 import java.awt.event.KeyListener; 10 import java.util.Random; 11 12 import javax.swing.ImageIcon; 13 import javax.swing.JPanel; 14 import javax.swing.Timer; 15 16 public class SnakePanel extends JPanel implements KeyListener,ActionListener{ 17 18 // 定义七个图片变量,代表七张图片 19 ImageIcon up = new ImageIcon("up.png"); // 向上的蛇头 20 ImageIcon down = new ImageIcon("down.png"); // 向下的蛇头 21 ImageIcon left = new ImageIcon("left.png"); // 向左的蛇头 22 ImageIcon right = new ImageIcon("right.png"); // 向右的蛇头 23 ImageIcon food = new ImageIcon("food.png"); // 食物 24 ImageIcon body = new ImageIcon("body.png"); // 蛇的身体 25 ImageIcon title = new ImageIcon("title.jpg"); // 游戏界面的主题 26 27 // 蛇的每一部分 28 int[] snakex = new int [750]; 29 int[] snakey = new int [750]; 30 31 // 随机生成食物 32 Random rand = new Random(); 33 int foodx = rand.nextInt(34)*25+25; //此处的数值根据自己设计的游戏界面的大小来确定 34 int foody = rand.nextInt(24)*25+75; 35 36 // 设置游戏的默认属性 37 int len = 3; 38 int score = 0; 39 String direction = "R"; // U上 D下 L左 R右 40 41 boolean isStarted = false; // 判断游戏是否开始 42 boolean isFailed = false; // 判断游戏是否结束 43 44 Timer timer = new Timer(100,this); // 每100毫秒调用一次ActionPerformed 45 46 47 public SnakePanel() { // 建造画布的构造函数 48 this.setFocusable(true); // 获取焦点 49 this.addKeyListener(this); // 监听键盘事件 50 setup(); 51 timer.start(); 52 } 53 54 public void paint(Graphics g) { // Graphics 画笔 55 56 this.setBackground(Color.BLACK); // 设置画布背景颜色 57 title.paintIcon(this, g, 25, 11);// 放置主题图片 58 g.fillRect(25, 75, 850, 650); // 用画笔设置游戏方框 59 60 // 画蛇头(注意判断蛇头的方向) 61 if (direction.equals("R")) 62 right.paintIcon(this, g, snakex[0], snakey[0]); 63 else if (direction.equals("L")) 64 left.paintIcon(this, g, snakex[0], snakey[0]); 65 else if (direction.equals("U")) 66 up.paintIcon(this, g, snakex[0], snakey[0]); 67 else if (direction.equals("D")) 68 down.paintIcon(this, g, snakex[0], snakey[0]); 69 70 // 画蛇的身体 71 for(int i = 1; i < len; i ++) 72 body.paintIcon(this, g, snakex[i], snakey[i]); 73 74 // 判断如果游戏没开始显示。。。 75 if (!isStarted){ 76 g.setColor(Color.WHITE); 77 g.setFont(new Font("arial",Font.BOLD, 30)); 78 g.drawString("Press Space to start / pause", 200, 300); 79 } 80 81 // 判断如果游戏结束显示。。。 82 if (isFailed){ 83 g.setColor(Color.WHITE); 84 g.setFont(new Font("arial",Font.BOLD, 30)); 85 g.drawString("Game Over ! Press space to restart", 200, 300); 86 } 87 88 // 显示食物 89 food.paintIcon(this, g, foodx, foody); 90 91 // 设置分数和蛇的长度 92 g.setColor(Color.WHITE); 93 g.setFont(new Font("arial",Font.PLAIN,15)); 94 g.drawString("Score : "+score, 650, 37); 95 g.drawString("Len :"+len, 650, 57); 96 } 97 98 public void setup() { // 游戏初始化 99 isStarted = false;100 isFailed = false;101 len = 3;102 score = 0;103 snakex[0] = 100; snakex[1] = 75; snakex[2] = 50;104 snakey[0] = 100; snakey[1] = 100; snakey[2] = 100;105 }106 107 @Override108 public void keyPressed(KeyEvent e) {109 110 //实现键盘响应 111 int KeyCode = e.getKeyCode();112 if (KeyCode == KeyEvent.VK_SPACE){ // 敲击空格现实/消除提示信息113 if (isFailed){114 // isStarted = false; // 可以将这两行放入setup中115 // isFailed = false;116 setup();117 }else 118 isStarted = !isStarted;119 } else if (KeyCode == KeyEvent.VK_UP && direction != "D")120 direction = "U";121 else if (KeyCode == KeyEvent.VK_DOWN && direction != "U" )122 direction = "D";123 else if (KeyCode == KeyEvent.VK_RIGHT && direction != "L")124 direction = "R";125 else if (KeyCode == KeyEvent.VK_LEFT && direction != "R")126 direction = "L";127 }128 129 @Override130 public void actionPerformed(ActionEvent e) {131 // 1. 再定义一个闹钟132 timer.start();133 134 // 2. 移动数据135 if (isStarted && !isFailed){136 // 移动身体137 for (int i = len; i>0; i--){138 snakex[i] = snakex[i-1];139 snakey[i] = snakey[i-1];140 }141 // 移动头142 if (direction.equals("R")){143 snakex[0] = snakex[0] + 25;144 if(snakex[0] > 850) snakex[0] = 25;145 }else if (direction.equals("L")){146 snakex[0] = snakex[0] - 25;147 if(snakex[0] < 25) snakex[0] = 850;148 }else if (direction.equals("U")){149 snakey[0] = snakey[0] - 25;150 if (snakey[0] < 75) snakey[0] = 650;151 }else if (direction.equals("D")){152 snakey[0] = snakey[0] + 25;153 if (snakey[0] > 650) snakey[0] = 75;154 }155 156 if (snakex[0] == foodx && snakey[0] == foody){ // 吃食物157 len ++;158 score ++;159 foodx = rand.nextInt(34)*25+25;160 foody = rand.nextInt(24)*25+75;161 }162 163 for (int i = 1; i < len; i ++){ // 如果蛇头碰到自己的身体游戏结束164 if (snakex[0] == snakex[i] && snakey[0] == snakey[i]){165 isFailed = true;166 }167 }168 169 }170 // 3. repaint()171 repaint();172 }173 174 @Override 175 public void keyTyped(KeyEvent e) {176 177 }178 179 @Override180 public void keyReleased(KeyEvent e) {181 182 }183 }
游戏效果如下:
用Java开发贪吃蛇游戏
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。