java編寫貪吃蛇小游戲
廢話不多說,直接奉上代碼:
Frame.java
package snake; import java.awt.Graphics; import java.awt.Menu; import java.awt.MenuBar; import java.awt.MenuItem; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; public class Frame extends JFrame implements KeyListener { /** * */ Boolean isAlive; Boolean isPause; Panel panel; Character direction; private static final long serialVersionUID = 1L; public Frame(){ // TODO Auto-generated constructor stub setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(300,300); addKeyListener(this); panel = new Panel(); add(panel); setVisible(true); isAlive = true; isPause = false; direction = new Character('d'); MenuBar menuBar = new MenuBar(); Menu menu = new Menu("menu"); MenuItem reset = new MenuItem("newgame"); MenuItem pause= new MenuItem("pause"); pause.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub if(!isPause) isPause= true; else isPause= false; } }); reset.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub reset(); } }); menu.add(reset); menu.add(pause); menuBar.add(menu); setMenuBar(menuBar); } public void reset(){ panel.reset(); isAlive = true; } @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub } @Override public void keyPressed(KeyEvent e) { // TODO Auto-generated method stub if(e.getKeyCode()==KeyEvent.VK_UP) direction = 'w'; if(e.getKeyCode()==KeyEvent.VK_DOWN) direction = 's'; if(e.getKeyCode()==KeyEvent.VK_LEFT) direction = 'a'; if(e.getKeyCode()==KeyEvent.VK_RIGHT) direction = 'd'; } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub } public void paint(Graphics g){ panel.repaint(); } }
Launch.java
package snake; import java.util.Timer; import java.util.TimerTask; public class Launch extends TimerTask { Frame frame = new Frame(); public Launch() { // TODO Auto-generated constructor stub } boolean crashWall(){ SnakeBody sb = frame.panel.snake.getFirst(); if((sb.x<0)||(sb.y<0)||(sb.x>=Panel.LINE)||(sb.y>=Panel.LINE)) return true; else return false; } void initial(){ frame.panel.snake.add(newBody()); frame.panel.food = newBody(); } @Override public void run() { // TODO Auto-generated method stub if(frame.panel.snake.isEmpty()) initial(); if(frame.isAlive) if(!frame.isPause){ if(goStraight()) frame.isAlive = false; frame.repaint(); } if(crashWall()) frame.isAlive = false; } SnakeBody newBody(){ SnakeBody sb = new SnakeBody(); boolean overlap = true; while(overlap){ overlap =false; sb.x = (int) (Math.random()*(Panel.LINE-2)+1); sb.y = (int) (Math.random()*(Panel.LINE-2)+1); if(!frame.panel.snake.isEmpty()) for(SnakeBody s : frame.panel.snake) if(sb.equals(s)) overlap =true; } return sb; } void eat(SnakeBody sb){ frame.panel.snake.addFirst(sb); } boolean goStraight(){ boolean result = false; SnakeBody sb =new SnakeBody(frame.panel.snake.getFirst()); frame.panel.snake.removeLast(); if(frame.direction=='w') sb.turnUp(); if(frame.direction=='s') sb.turnDown(); if(frame.direction=='a') sb.turnLeft(); if(frame.direction=='d') sb.turnRight(); for(SnakeBody s : frame.panel.snake){ if(sb.equals(s)) result = true; } frame.panel.snake.addFirst(sb); if(sb.equals(frame.panel.food)){ if(frame.direction=='w') frame.panel.food.turnUp(); if(frame.direction=='s') frame.panel.food.turnDown(); if(frame.direction=='a') frame.panel.food.turnLeft(); if(frame.direction=='d') frame.panel.food.turnRight(); eat(frame.panel.food); frame.panel.food = newBody(); } return result; } public static void main(String[] args){ // TODO Auto-generated method stub Launch timertask = new Launch(); Timer timer = new Timer(); timer.schedule(timertask,0,500); } }
Panel.java
package snake; import java.awt.Color; import java.awt.Graphics; import java.util.LinkedList; import javax.swing.JPanel; public class Panel extends JPanel { /** * */ private static final long serialVersionUID = 1L; public LinkedList<SnakeBody> snake = new LinkedList<SnakeBody>(); static final int LINE = 10; SnakeBody food = new SnakeBody(-99,-99); public Panel() { // TODO Auto-generated constructor stub } public void reset(){ snake.clear(); } public void paint(Graphics g){ g.setColor(Color.white); g.fillRect(0, 0, getWidth(), getHeight()); for(SnakeBody sb : snake){ g.setColor(Color.black); g.drawRect(sb.x*getWidth()/LINE,sb.y*getHeight()/LINE,getWidth()/LINE,getHeight()/LINE); g.setColor(Color.orange); g.fillRect(sb.x*getWidth()/LINE,sb.y*getHeight()/LINE,getWidth()/LINE,getHeight()/LINE); } g.setColor(Color.red); g.fillRect(food.x*getWidth()/LINE,food.y*getHeight()/LINE,getWidth()/LINE,getHeight()/LINE); } }
SnakeBody.java
package snake; class SnakeBody { int x; int y; public SnakeBody() { // TODO Auto-generated constructor stub x = 0; y = 0; } public SnakeBody(int a,int b){ x = a; y = b; } public SnakeBody(SnakeBody sb){ this(sb.x,sb.y); } public void turnUp(){ y--; } public void turnDown(){ y++; } public void turnLeft(){ x--; } public void turnRight(){ x++; } boolean equals(SnakeBody s){ if((x==s.x)&&(y==s.y)) return true; else return false; } }
以上所述就是本文給大家分享的貪吃蛇的全部代碼了,希望能夠?qū)Υ蠹沂炀氄莆誮ava有所幫助。
相關(guān)文章
Java 入門圖形用戶界面設(shè)計(jì)之復(fù)選框
圖形界面(簡(jiǎn)稱GUI)是指采用圖形方式顯示的計(jì)算機(jī)操作用戶界面。與早期計(jì)算機(jī)使用的命令行界面相比,圖形界面對(duì)于用戶來說在視覺上更易于接受,本篇精講Java語(yǔ)言中關(guān)于圖形用戶界面的復(fù)選框2022-02-02Java Comparable和Comparator對(duì)比詳解
這篇文章主要介紹了Java Comparable和Comparator對(duì)比詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11淺析java程序中hibernate的應(yīng)用總結(jié)
hibernate可以理解為是一個(gè)中間件它負(fù)責(zé)把java程序的sql語(yǔ)句接收過來發(fā)送到數(shù)據(jù)庫(kù),而數(shù)據(jù)庫(kù)返回來的信息hibernate接收之后直接生成一個(gè)對(duì)象傳給java2013-07-07Java簡(jiǎn)單使用redis-zset實(shí)現(xiàn)排行榜
這篇文章主要介紹了Java簡(jiǎn)單使用redis-zset實(shí)現(xiàn)排行榜,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12SpringBoot實(shí)現(xiàn)日志鏈路追蹤的項(xiàng)目實(shí)踐
在分布式系統(tǒng)中,由于請(qǐng)求的處理過程可能會(huì)跨越多個(gè)服務(wù),因此,對(duì)請(qǐng)求的追蹤變得尤為重要,本文主要介紹了SpringBoot實(shí)現(xiàn)日志鏈路追蹤的項(xiàng)目實(shí)踐,感興趣的可以了解一下2024-03-03Spring Cloud Config配置文件使用對(duì)稱加密的方法
Spring Cloud Config提供了兩種加密解密方式,一種是對(duì)稱加密,一種是非對(duì)稱加密。這篇文章將先展示如何使用對(duì)稱加密。感興趣的朋友跟隨腳步之家小編一起學(xué)習(xí)吧2018-05-05舉例講解Java的Spring框架中AOP程序設(shè)計(jì)方式的使用
這篇文章主要介紹了Java的Spring框架中AOP程序設(shè)計(jì)方式的使用講解,文中舉的AOP下拋出異常的例子非常實(shí)用,需要的朋友可以參考下2016-04-04springboot+dubbo啟動(dòng)項(xiàng)目時(shí)報(bào)錯(cuò) zookeeper not connect
這篇文章主要介紹了springboot+dubbo項(xiàng)目啟動(dòng)項(xiàng)目時(shí)報(bào)錯(cuò) zookeeper not connected的問題,本文給大家定位問題及解決方案,結(jié)合實(shí)例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下2023-06-06