废话不多说,直接奉上代码:
Frame.java
패키지 뱀; 가져오기 java.awt.Graphics;가져오기 java.awt.Menu;가져오기 java.awt.MenuBar;가져오기 java.awt.MenuItem;가져오기 java.awt.event.ActionEvent;가져오기 java.awt.event.ActionListener;가져오기 java.awt .event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; 공용 클래스 Frame은 JFrame을 확장하여 KeyListener를 구현합니다. { /** * */ Boolean isAlive; 부울 isPause; 패널 패널; 캐릭터 방향; 개인 정적 최종 긴 serialVersionUID = 1L; public Frame(){ // TODO 자동 생성된 생성자 스텁 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(300,300); addKeyListener(this); 패널 = 새로운 패널(); 추가(패널); setVisible(참); isAlive = 사실; isPause = 거짓; 방향 = 새 문자('d'); MenuBar menuBar = 새로운 MenuBar(); 메뉴 메뉴 = new Menu("메뉴"); MenuItem 재설정 = new MenuItem("newgame"); MenuItem 일시중지= new MenuItem("일시중지"); Pause.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { // TODO 자동 생성 메서드 스텁 if(!isPause) isPause= true; else isPause= false; } }); Reset.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { // TODO 자동 생성 메서드 스텁 Reset(); } }); menu.add(재설정); menu.add(일시중지); menuBar.add(메뉴); setMenuBar(menuBar); } 공개 무효 재설정(){ panel.reset(); isAlive = 사실; } @Override public void keyTyped(KeyEvent e) { // TODO 자동 생성된 메서드 스텁 } @Override public void keyPressed(KeyEvent e) { // TODO 자동 생성된 메서드 스텁 if(e.getKeyCode()==KeyEvent.VK_UP ) 방향 = 'w'; if(e.getKeyCode()==KeyEvent.VK_DOWN) 방향 = 's'; if(e.getKeyCode()==KeyEvent.VK_LEFT) 방향 = 'a'; if(e.getKeyCode()==KeyEvent.VK_RIGHT) 방향 = 'd'; } @Override public void keyReleased(KeyEvent e) { // TODO 자동 생성된 메서드 스텁 } public void Paint(Graphics g){ panel.repaint(); } }
Launch.java
패키지 뱀; java.util.Timer 가져오기; java.util.TimerTask 가져오기; 공개 클래스 Launch 확장 TimerTask { 프레임 프레임 = 새 프레임(); public Launch() { // TODO 자동 생성 생성자 스텁 } 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; 그렇지 않으면 false를 반환합니다. } voidinitial(){frame.panel.snake.add(newBody()); 프레임.패널.음식 = newBody(); } @Override public void run() { // TODO 자동 생성된 메서드 스텁 if(frame.panel.snake.isEmpty())initial(); if(frame.isAlive) if(!frame.isPause){ if(goStraight()) 프레임.isAlive = false; 프레임.다시 그리기(); } if(crashWall()) 프레임.isAlive = false; } SnakeBody newBody(){ SnakeBody sb = new SnakeBody(); 부울 오버랩 = 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; } sb를 반환; } void eat(SnakeBody sb){frame.panel.snake.addFirst(sb); } 부울 goStraight(){ 부울 결과 = false; SnakeBody sb =new SnakeBody(frame.panel.snake.getFirst()); 프레임.패널.스네이크.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; } 프레임.panel.snake.addFirst(sb); if(sb.equals(frame.panel.food)){ if(frame.direction=='w') 프레임.panel.food.turnUp(); if(frame.direction=='s') 프레임.panel.food.turnDown(); if(frame.direction=='a') 프레임.panel.food.turnLeft(); if(frame.direction=='d') 프레임.panel.food.turnRight(); 먹다(frame.panel.food); 프레임.패널.음식 = newBody(); } 결과를 반환합니다. } public static void main(String[] args){ // TODO 자동 생성된 메서드 스텁 실행 타이머태스크 = new Launch(); 타이머 타이머 = new Timer(); 타이머.스케줄(타이머태스크,0,500); } }
Panel.java
패키지 뱀; java.awt.Color 가져오기; java.awt.Graphics 가져오기; java.util.LinkedList 가져오기; import javax.swing.JPanel; 공용 클래스 패널 확장 JPanel { /** * */ private static final long serialVersionUID = 1L; 공개 LinkedList<SnakeBody> snake = new LinkedList<SnakeBody>(); 정적 최종 int LINE = 10; SnakeBody 음식 = new SnakeBody(-99,-99); public Panel() { // TODO 자동 생성 생성자 스텁 } public void Reset(){ snake.clear(); } public void 페인트(그래픽 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
패키지 뱀; 클래스 SnakeBody { int x; int y; public SnakeBody() { // TODO 자동 생성 생성자 스텁 x = 0; 와이 = 0; } 공개 SnakeBody(int a,int b){ x = a; y = b; } 공개 SnakeBody(SnakeBody sb){ this(sb.x,sb.y); } 공개 무효 턴업(){ y--; } 공개 무효 턴다운(){ y++; } 공개 무효 TurnLeft(){ x--; } 공개 무효 TurnRight(){ x++; } 부울 같음(SnakeBody s){ if((x==sx)&&(y==sy)) return true; 그렇지 않으면 false를 반환합니다. } }
以上所述就是本文给大家分享的贪吃蛇的모든부분은 현대적입니다.