正式宣布90后退出青年市场,00后统治世界~我们也即将是老去的一代。
小编偶然想到童年玩过的那些经典游戏,在当下吃鸡,撸啊撸风靡的时代,那些小游戏渐渐被人遗忘,现在回想起来,当时那些游戏还是很好玩的呢,各位看官觉得呢?所以小编自己动手写出了贪吃蛇游戏的java代码,又重温了一下,仿佛又回到了童年时代。
下面给大家介绍一下代码的逻辑和具体的代码是什么:1.逻辑判断要点分析:1)数据结构:matrix[][]用来存储地图上面的信息,如果什么也没有设置为false,如果有食物或蛇,设置为true;nodeArray,一个LinkedList,用来保存蛇的每一节;food用来保存食物的位置;而Node类是保存每个位置的信息。
2)重要函数:changeDirection(int newDirection) ,用来改变蛇前进的方向,而且只是保存头部的前进方向,因为其他的前进方向已经用位置来指明了。
其中newDirection必须和原来的direction不是相反方向,所以相反方向的值用了同样的奇偶性。
在测试的时候使用了direction%2!=newDirection%2 进行判断。
moveOn(),用来更新蛇的位置,对于当前方向,把头部位置进行相应改变。
如果越界,结束;否则,检测是否遇到食物(加头部)或身体(结束);如果什么都没有,加上头部,去掉尾部。
由于用了LinkedList数据结构,省去了相当多的麻烦。
2.具体代码public class SnakePanel extends JPanel implements KeyListener,ActionListener {ImageIcon up = new ImageIcon(“up.png”);ImageIcon down = new ImageIcon(“down.png”);ImageIcon right = new ImageIcon(“right.png”);ImageIcon left = new ImageIcon(“left.png”);ImageIcon title = new ImageIcon(“title.jpg”);ImageIcon food = new ImageIcon(“food.png”);ImageIcon body = new ImageIcon(“body.png”);/** 定义数组记录蛇头和蛇身体的坐标,变量len表示蛇的长度* 变量方向表示蛇移动的方向*/int[] snakex = new int[750];int[] snakey = new int[750];Random rand = new Random();int foodx = rand.nextInt(34)*25+25;int foody = rand.nextInt(24)*25+75;int len = 3;int score = 0;String fangxiang = “R”;//R右、L左、U上、D下boolean isStarted = false;//判断游戏是否开始boolean isFailed = false;//判断是否死亡//计时器:1.时间 2.时间到了去找的对象Timer timer = new Timer(300, this);public SnakePanel(){this.setFocusable(true);//取得焦点this.addKeyListener(this);setup();timer.start();}/** Graphics图像* public void paint(Graphics g) 以绘制组件。
* 应用程序不应直接调用 paint,而是应该使用 repaint 方法来安排重绘组件。
* 参数:g (相当于画笔)- 在其中进行绘制的 Graphics 上下文*/public void paint(Graphics g){// super.paint(g);// this.setBackground(Color.WHITE);this.getRootPane().setBackground(Color.WHITE);/** public void paintIcon(Component c,Graphics g,int x,int y)* 绘制图标。
* 图标的左上角在图形上下文 g 的坐标空间中的点 (x, y) 处绘制。
* 如果此图标没有图像观察者,则此方法使用 c 组件作为观察者。
* 参数:c(画布) – 用作观察者的组件,如果此图标没有图像观察者g (画笔)- 图形上下文x – 图标左上角的 X 坐标y – 图标左上角的 Y 坐标*/title.paintIcon(this, g, 25, 11);/** void java.awt.Graphics.fillRect(int x, int y, int width, int height)* 填充指定的矩形。
* 该矩形左边和右边位于 x 和 x + width – 1。
* 顶边和底边位于 y 和 y + height – 1。
* 得到的矩形覆盖的区域宽度为 width 像素,高度为 height 像素。
* 使用图形上下文的当前颜色填充该矩形。
* 参数:x – 要填充矩形的 x 坐标。
y – 要填充矩形的 y 坐标。
width – 要填充矩形的宽度。
height – 要填充矩形的高度。
*/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]);}//游戏没有开始时,显示提示语(!isStarted)if(isStarted == false){g.setColor(Color.WHITE);g.setFont(new Font(“微软雅黑”,Font.BOLD,35));g.drawString(“Press Space to Start/Pause”, 250, 350);}if(isFailed){g.setColor(Color.WHITE);g.setFont(new Font(“微软雅黑”,Font.BOLD,35));g.drawString(“Game Over! Press Space to ReStart”, 200, 350);}food.paintIcon(this, g, foodx, foody);//添加分数g.setColor(Color.WHITE);g.drawString(“Score : “+score, 600, 45);}public void setup(){isStarted = false;isFailed = false;len = 3;snakex[0] = 100;snakey[0] = 100;snakex[1] = 75;snakey[1] = 100;snakex[2] = 50;snakey[2] = 100;}@Overridepublic void keyPressed(KeyEvent e) {// TODO Auto-generated method stubint keyCode = e.getKeyCode();//实现转向,不能实现反转if(keyCode == KeyEvent.VK_SPACE){if (isFailed) {// isStarted = false;// isFailed = false;setup();}else {// isStarted = true;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_RIGHT && fangxiang != “L”){fangxiang = “R”;}else if(keyCode == KeyEvent.VK_LEFT && fangxiang != “R”){fangxiang = “L”;}}@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stub//1.再定义个闹钟timer.start();//2.移动数据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)snakex[0] = 25;}else if(fangxiang.equals(“L”)){snakex[0] = snakex[0] – 25;if(snakex[0] < 25) snakex[0] = 850;}else if(fangxiang.equals(“U”)){snakey[0] = snakey[0] – 25;if(snakey[0] < 75) snakey[0] = 650;}else if(fangxiang.equals(“D”)){snakey[0] = snakey[0] + 25;if(snakey[0] > 650) snakey[0] = 75;}}//吃食物if(snakex[0] == foodx && snakey[0] == foody){len ++;score ++;foodx = rand.nextInt(34)*25+25;foody = rand.nextInt(24)*25+75;}//判断身体相碰,游戏结束for (int i = 1; i < len; i++) {if (snakex[0] == snakex[i] && snakey[0] == snakey[i]) {isFailed = true;}}//3.repaint()repaint();}@Overridepublic void keyReleased(KeyEvent e) {// TODO Auto-generated method stub}@Overridepublic void keyTyped(KeyEvent e) {// TODO Auto-generated method stub}}package 贪吃蛇;import java.applet.Applet;import java.io.File;import java.net.MalformedURLException;import javax.swing.JFrame;public class Snake {public static void main(String[] args) {// TODO Auto-generated method stubJFrame frame = new JFrame();frame.setBounds(10, 10, 900, 720);frame.setResizable(false);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);SnakePanel panel = new SnakePanel();frame.add(panel);frame.setVisible(true);}}代码量有点大,小伙伴们可以复制到eclipse中运行就可以了。
在最后呢,祝各位小伙伴永远18岁,新年快乐~谢谢观看~
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)