java贪吃蛇用JAVA编一个小的贪吃蛇游戏 (要求如下) 求JAVA高手

java贪吃蛇  时间:2021-07-10  阅读:()

贪食蛇 java 简单代码

很简单啊 首先就是要有一个数组,用于保存蛇身体的信息。

每吃一个东西,数组长度增加一个。

读取方向键,控制蛇的方向。

在循环里,不断更新数组的位置信息。

把新的位置涂上色,把最后一个改成背景色 没太想好怎么说。

贪吃蛇 java代码

主要用了javax.swing.Timer这个类: import java.awt.*; import javax.swing.*; @SuppressWarnings("serial") public class MainClass extends JFrame { ControlSnake control; Toolkit kit; Dimension dimen; public static void main(String[] args) { new MainClass("my snake"); } public MainClass(String s) { super(s); control = new ControlSnake(); control.setFocusable(true); kit = Toolkit.getDefaultToolkit(); dimen = kit.getScreenSize(); add(control); setLayout(new BorderLayout()); setLocation(dimen.width / 3, dimen.height / 3);// dimen.width/3,dimen.height/3 setSize(FWIDTH, FHEIGHT); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setResizable(false); setVisible(true); } public static final int FWIDTH = 315; public static final int FHEIGHT = 380; } import java.util.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.Timer; import java.util.Random; @SuppressWarnings("serial") public class ControlSnake extends JPanel implements ActionListener { Random rand; ArrayList<Point> list, listBody; String str, str1; static boolean key; int x, y, dx, dy, fx, fy, flag; int snakeBody; int speed; public ControlSnake() { snakeBody = 1; str = "上下左右方向键控制 P键暂停..."; str1 = "现在的长度为:" + snakeBody; key = true; flag = 1; speed = 700; rand = new Random(); list = new ArrayList<Point>(); listBody = new ArrayList<Point>(); x = 5; y = 5; list.add(new Point(x, y)); listBody.add(list.get(0)); dx = 10; dy = 0; fx = rand.nextInt(30) * 10 + 5;// 2 fy = rand.nextInt(30) * 10 + 5;// 2 setBackground(Color.WHITE); setSize(new Dimension(318, 380)); final Timer time = new Timer(speed, this); time.start(); addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { if (e.getKeyCode() == 37) { dx = -10; dy = 0; } else if (e.getKeyCode() == 38) { dx = 0; dy = -10; } else if (e.getKeyCode() == 39) { dx = 10; dy = 0; } else if (e.getKeyCode() == 40) { dx = 0; dy = 10; } else if (e.getKeyCode() == 80) { if (flag % 2 == 1) { (); } if (flag % 2 == 0) { time.start(); } flag++; } } }); } public void paint(Graphics g) { g.setColor(Color.WHITE); g.fillRect(0, 0, 400, 400); g.setColor(Color.DARK_GRAY); g.drawLine(3, 3, 305, 3); g.drawLine(3, 3, 3, 305); g.drawLine(305, 3, 305, 305); g.drawLine(3, 305, 305, 305); g.setColor(Color.PINK); for (int i = 0; i < listBody.size(); i++) { g.fillRect(listBody.get(i).x, listBody.get(i).y, 9, 9); } g.fillRect(x, y, 9, 9); g.setColor(Color.ORANGE); g.fillRect(fx, fy, 9, 9); g.setColor(Color.DARK_GRAY); str1 = "现在的长度为:" + snakeBody; g.drawString(str, 10, 320); g.drawString(str1, 10, 335); } public void actionPerformed(ActionEvent e) { x += dx; y += dy; if (makeOut() == false) { JOptionPane.showMessageDialog(null, "重新开始......"); speed = 700; snakeBody = 1; x = 5; y = 5; list.clear(); list.add(new Point(x, y)); listBody.clear(); listBody.add(list.get(0)); dx = 10; dy = 0; } addPoint(x, y); if (x == fx && y == fy) { speed = (int) (speed * 0.8);//速度增加参数 if (speed < 200) { speed = 100; } fx = rand.nextInt(30) * 10 + 5;// 2 fy = rand.nextInt(30) * 10 + 5;// 2 snakeBody++;// 2 } // 2 repaint(); } public void addPoint(int xx, int yy) { // 动态的记录最新发生的50步以内的移动过的坐标 // 并画出最新的snakeBody if (list.size() < 100) {//蛇身长度最长为100 list.add(new Point(xx, yy)); } else { list.remove(0); list.add(new Point(xx, yy)); } if (snakeBody == 1) { listBody.remove(0); listBody.add(0, list.get(list.size() - 1)); } else { listBody.clear(); if (list.size() < snakeBody) { for (int i = list.size() - 1; i > 0; i--) { listBody.add(list.get(i)); } } else { for (int i = list.size() - 1; listBody.size() < snakeBody; i--) { listBody.add(list.get(i)); } } } } public boolean makeOut() { if ((x < 3 || y < 3) || (x > 305 || y > 305)) { return false; } for (int i = 0; i < listBody.size() - 1; i++) { for (int j = i + 1; j < listBody.size(); j++) { if (listBody.get(i).equals(listBody.get(j))) { return false; } } } return true; } }

java贪吃蛇原理

楼主没有看到蛇移动的本质,蛇虽然是分成很多块,但他们还是一个整体,每一块的移动都和上一块有关,所以不需要对每一块都进行判断。

原理: 把蛇身体的每一块看成一个对象(对象存储该块的坐标和相关信息),作为节点存储在线性链表中,再设置一个变量标志蛇的方向(通过按键可以改变)。

一般人都是让每一个节点等于他指向的下一个节点,并让头节点改变位置来实现转弯和移动,这个算法复杂度太高(O(n)),实际上只要做两步操作,插入一个头节点,删除一个尾节点就可以了,新插入的头节点位置根据蛇当前的方向决定

贪吃蛇程序用JAVA编写

//drawNode():绘画某一结点(蛇身或食物) //---------------------------------------------------------------------- private void drawNode(Graphics g,Node n) { g.fillRect(n.x*nodeWidth,n.y*nodeHeight,nodeWidth-1,nodeHeight-1); } //---------------------------------------------------------------------- //updateScore():改变计分牌 //---------------------------------------------------------------------- public void updateScore() { String s=’Score: ’+snakeModel.score; [Page] labelScore.setText(s); } //---------------------------------------------------------------------- //begin():游戏开始,放置贪吃蛇 //---------------------------------------------------------------------- void begin() { if(snakeModel==null||!snakeModel.running) { snakeModel=new SnakeModel(this,canvasWidth/nodeWidth, this.canvasHeight/nodeHeight); (new Thread(snakeModel)).start(); } } //---------------------------------------------------------------------- //main():主函数 //---------------------------------------------------------------------- public static void main(String[] args) { GreedSnake gs=new GreedSnake(); } } /************************************************************************** *文件名:SnakeModel.java *作者:C.Jason *要点分析: *1)数据结构:matrix[][]用来存储地图上面的信息,如果什么也没有设置为false, * 如果有食物或蛇,设置为true;nodeArray,一个LinkedList,用来保存蛇的每 * 一节;food用来保存食物的位置;而Node类是保存每个位置的信息。

*2)重要函数: * changeDirection(int newDirection) ,用来改变蛇前进的方向,而且只是 * 保存头部的前进方向,因为其他的前进方向已经用位置来指明了。

其中newDirection * 必须和原来的direction不是相反方向,所以相反方向的值用了同样的奇偶性。

在测试 * 的时候使用了direction%2!=newDirection%2 进行判断。

* moveOn(),用来更新蛇的位置,对于当前方向,把头部位置进行相应改变。

如果越界, * 结束;否则,检测是否遇到食物(加头部)或身体(结束);如果什么都没有,加上头部, * 去掉尾部。

由于用了LinkedList数据结构,省去了相当多的麻烦。

*************************************************************************/ import java.util.*; import javax.swing.*; //---------------------------------------------------------------------- //Node:结点类 //---------------------------------------------------------------------- class Node { int x; int y; Node(int x,int y) { this.x=x; this.y=y; } } //---------------------------------------------------------------------- //SnakeModel:贪吃蛇模型 //---------------------------------------------------------------------- class SnakeModel implements Runnable { GreedSnake gs; boolean[][] matrix;// 界面数据保存在数组里 LinkedList nodeArray=new LinkedList(); Node food; int maxX;//最大宽度 int maxY;//最大长度 int direction=2;//方向 boolean running=false; int timeInterval=200;// 间隔时间(速度) double speedChangeRate=0.75;// 速度改变程度 [Page] boolean paused=false;// 游戏状态 int score=0; int countMove=0; // UP和DOWN是偶数,RIGHT和LEFT是奇数 public static final int UP=2; public static final int DOWN=4; public static final int LEFT=1; public static final int RIGHT=3; //---------------------------------------------------------------------- //GreedModel():初始化界面 //---------------------------------------------------------------------- public SnakeModel(GreedSnake gs,int maxX,int maxY) { this.gs=gs; this.maxX=maxX; this.maxY=maxY; matrix=new boolean[maxX][]; for(int i=0;i<maxX;++i) { matrix[i]=new boolean[maxY]; Arrays.fill(matrix[i],false);// 没有蛇和食物的地区置false } //初始化贪吃蛇 int initArrayLength=maxX>20 ? 10 : maxX/2; for(int i=0;i<initArrayLength;++i) { int x=maxX/2+i; int y=maxY/2; nodeArray.addLast(new Node(x,y)); matrix[x][y]=true;// 蛇身处置true } food=createFood(); matrix[food.x][food.y]=true;// 食物处置true } //---------------------------------------------------------------------- //changeDirection():改变运动方向 //---------------------------------------------------------------------- public void changeDirection(int newDirection) { if(direction%2!=newDirection%2)// 避免冲突 { direction=newDirection; } } //---------------------------------------------------------------------- //moveOn():贪吃蛇运动函数 //----------------------------------------------------------------------

用JAVA编一个小的贪吃蛇游戏 (要求如下) 求JAVA高手

不合意的自己去修改 import java.awt.*; import java.awt.event.*; public class GreedSnake //主类 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub new MyWindow(); } } class MyPanel extends Panel implements KeyListener,Runnable//自定义面板类,继承了键盘和线程接口 { Button snake[]; //定义蛇按钮 int shu=0; //蛇的节数 int food[]; //食物数组 boolean result=true; //判定结果是输 还是赢 Thread thread; //定义线程 static int weix,weiy; //食物位置 boolean t=true; //判定游戏是否结束 int fangxiang=0; //蛇移动方向 int x=0,y=0; //蛇头位置 MyPanel() { setLayout(null); snake=new Button[20]; food=new int [20]; thread=new Thread(this); for(int j=0;j<20;j++) { food[j]=(int)(Math.random()*99);//定义20个随机食物 } weix=(int)(food[0]*0.1)*60; //十位*60为横坐标 weiy=(int)(food[0]%10)*40; //个位*40为纵坐标 for(int i=0;i<20;i++) { snake[i]=new Button(); } add(snake[0]); snake[0].setBackground(Color.black); snake[0].addKeyListener(this); //为蛇头添加键盘监视器 snake[0].setBounds(0,0,10,10); setBackground(Color.cyan); } public void run() //接收线程 { while(t) { if(fangxiang==0)//向右 { try { x+=10; snake[0].setLocation(x, y);//设置蛇头位置 if(x==weix&&y==weiy) //吃到食物 { shu++; weix=(int)(food[shu]*0.1)*60; weiy=(int)(food[shu]%10)*40; repaint(); //重绘下一个食物 add(snake[shu]); //增加蛇节数和位置 snake[shu].setBounds(snake[shu-1].getBounds()); } thread.sleep(100); //睡眠100ms } catch(Exception e){} } else if(fangxiang==1)//向左 { try { x-=10; snake[0].setLocation(x, y); if(x==weix&&y==weiy) { shu++; weix=(int)(food[shu]*0.1)*60; weiy=(int)(food[shu]%10)*40; repaint(); add(snake[shu]); snake[shu].setBounds(snake[shu-1].getBounds()); } thread.sleep(100); } catch(Exception e){} } else if(fangxiang==2)//向上 { try { y-=10; snake[0].setLocation(x, y); if(x==weix&&y==weiy) { shu++; weix=(int)(food[shu]*0.1)*60; weiy=(int)(food[shu]%10)*40; repaint(); add(snake[shu]); snake[shu].setBounds(snake[shu-1].getBounds()); } thread.sleep(100); } catch(Exception e){} } else if(fangxiang==3)//向下 { try { y+=10; snake[0].setLocation(x, y); if(x==weix&&y==weiy) { shu++; weix=(int)(food[shu]*0.1)*60; weiy=(int)(food[shu]%10)*40; repaint(); add(snake[shu]); snake[shu].setBounds(snake[shu-1].getBounds()); } thread.sleep(100); } catch(Exception e){} } int num1=shu; while(num1>1)//判断是否咬自己的尾巴 { if(snake[num1].getBounds().x==snake[0].getBounds().x&&snake[num1].getBounds().y==snake[0].getBounds().y) { t=false; result=false; repaint(); } num1--; } if(x<0||x>=this.getWidth()||y<0||y>=this.getHeight())//判断是否撞墙 { t=false; result=false; repaint(); } int num=shu; while(num>0) //设置蛇节位置 { snake[num].setBounds(snake[num-1].getBounds()); num--; } if(shu==15) //如果蛇节数等于15则胜利 { t=false; result=true; repaint(); } } } public void keyPressed(KeyEvent e) //按下键盘方向键 { if(e.getKeyCode()==KeyEvent.VK_RIGHT)//右键 { if(fangxiang!=1)//如果先前方向不为左 fangxiang=0; } else if(e.getKeyCode()==KeyEvent.VK_LEFT) { if(fangxiang!=0) fangxiang=1; } else if(e.getKeyCode()==KeyEvent.VK_UP) { if(fangxiang!=3) fangxiang=2; } else if(e.getKeyCode()==KeyEvent.VK_DOWN) { if(fangxiang!=2) fangxiang=3; } } public void keyTyped(KeyEvent e) { } public void keyReleased(KeyEvent e) { } public void paint(Graphics g) //在面板上绘图 { int x1=this.getWidth()-1; int y1=this.getHeight()-1; g.setColor(Color.red); g.fillOval(weix, weiy, 10, 10);//食物 g.drawRect(0, 0, x1, y1); //墙 if(t==false&&result==false) g.drawString("GAME OVER!", 250, 200);//输出游戏失败 else if(t==false&&result==true) g.drawString("YOU WIN!", 250, 200);//输出游戏成功 } } class MyWindow extends Frame implements ActionListener//自定义窗口类 { MyPanel my; Button btn; Panel panel; MyWindow() { super("GreedSnake"); my=new MyPanel(); btn=new Button("begin"); panel=new Panel(); btn.addActionListener(this); panel.add(new Label("begin后请按Tab键选定蛇")); panel.add(btn); panel.add(new Label("按上下左右键控制蛇行动")); add(panel,BorderLayout.NORTH); add(my,BorderLayout.CENTER); setBounds(100,100,610,500); setVisible(true); validate(); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public void actionPerformed(ActionEvent e)//按下begin按钮 { if(e.getSource()==btn) { try { my.thread.start(); //开始线程 my.validate(); } catch(Exception ee){} } } }

hostodo:美国大流量VPS,低至$3,8T流量/月-1.5G内存/1核/25gNVMe/拉斯维加斯+迈阿密

hostodo从2014年年底运作至今一直都是走低价促销侧率运作VPS,在市场上一直都是那种不温不火的品牌知名度,好在坚持了7年都还运作得好好的,站长觉得hostodo还是值得大家在买VPS的时候作为一个候选考虑项的。当前,hostodo有拉斯维加斯和迈阿密两个数据中心的VPS在促销,专门列出了2款VPS给8T流量/月,基于KVM虚拟+NVMe整列,年付送DirectAdmin授权(发ticket...

wordpress外贸集团企业主题 wordpress高级推广外贸主题

wordpress外贸集团企业主题,wordpress通用跨屏外贸企业响应式布局设计,内置更完善的外贸企业网站优化推广功能,完善的企业产品营销展示 + 高效后台自定义设置。wordpress高级推广外贸主题,采用标准的HTML5+CSS3语言开发,兼容当下的各种主流浏览器,根据用户行为以及设备环境(系统平台、屏幕尺寸、屏幕定向等)进行自适应显示; 完美实现一套主题程序支持全部终端设备,保证网站在各...

Raksmart VPS主机如何设置取消自动续费

今天有看到Raksmart账户中有一台VPS主机即将到期,这台机器之前是用来测试评测使用的。这里有不打算续费,这不面对万一导致被自动续费忘记,所以我还是取消自动续费设置。如果我们也有类似的问题,这里就演示截图设置Raksmart取消自动续费。这里我们可以看到上图,在对应VPS主机的【其余操作】中可以看到默认已经是不自动续费,所以我们也不要担心被自动续费的。当然,如果有被自动续费,我们确实不想续费的...

java贪吃蛇为你推荐
论坛源码求高手推荐一个好的论坛源码?要可以购买版权的那种,要便宜的weakhashmap在Java中ArrayList、LinkedList、HashMap的区别是什么空白代码html空格代码怎么写最开放的浏览器用的最多的三个浏览器是?arc是什么意思arcsin中arc是什么的缩写? 怎么读? ?欢迎页面怎样在开机制造欢迎页面?欢迎页面怎样取消“欢迎页面”?问卷星登陆你好,如果之前用微信登录了问卷星小程序,以后每次回答都不需要微信登录了吗?回答了会被知道个人信息吗51信用卡论坛51信用卡怎么样?jsindexofjavascript 中indexof 的用法
便宜的虚拟主机 出租服务器 网通vps 查询ip地址 备案域名出售 新通用顶级域名 sharktech flashfxp怎么用 59.99美元 gomezpeer 淘宝双十一2018 小米数据库 dd444 坐公交投2700元 php空间申请 创梦 空间论坛 bgp双线 工信部icp备案号 吉林铁通 更多