工程文件
Data类
package Final_traning. snake;
import java. net. *;
import javax. swing. *;
public class Data {
public static URL upURL = Data. class . getResource ( "/Final_traning/snake/statics/up.png" ) ;
public static URL downURL = Data. class . getResource ( "/Final_traning/snake/statics/down.png" ) ;
public static URL leftURL = Data. class . getResource ( "/Final_traning/snake/statics/left.png" ) ;
public static URL rightURL = Data. class . getResource ( "/Final_traning/snake/statics/right.png" ) ;
public static ImageIcon up = new ImageIcon ( upURL) ;
public static ImageIcon down = new ImageIcon ( downURL) ;
public static ImageIcon left = new ImageIcon ( leftURL) ;
public static ImageIcon right = new ImageIcon ( rightURL) ;
public static URL bodyURL = Data. class . getResource ( "/Final_traning/snake/statics/body.png" ) ;
public static ImageIcon body = new ImageIcon ( bodyURL) ;
public static URL foodURL = Data. class . getResource ( "/Final_traning/snake/statics/food.png" ) ;
public static ImageIcon food = new ImageIcon ( foodURL) ;
}
游戏面板
package Final_traning. snake;
import javax. sql. DataSource;
import javax. swing. *;
import java. awt. *;
import java. awt. event. ActionEvent;
import java. awt. event. ActionListener;
import java. awt. event. KeyEvent;
import java. awt. event. KeyListener;
import java. util. Date;
import java. util. Random;
public class GamewPanel extends JPanel implements KeyListener , ActionListener {
int length;
int [ ] snakeX = new int [ 600 ] ;
int [ ] snakeY = new int [ 600 ] ;
String fx;
int foodX, foodY;
boolean isStart = false ;
boolean isFail = false ;
Random random = new Random ( ) ;
Timer timer = new Timer ( 100 , this ) ;
public GamewPanel ( ) {
init ( ) ;
this . setFocusable ( true ) ;
this . addKeyListener ( this ) ;
}
public void init ( ) {
length = 3 ;
snakeX[ 0 ] = 100 ; snakeY[ 0 ] = 100 ;
snakeX[ 1 ] = 75 ; snakeY[ 1 ] = 100 ;
snakeX[ 2 ] = 50 ; snakeY[ 2 ] = 100 ;
fx = "R" ;
timer. start ( ) ;
foodX = 25 + 25 * random. nextInt ( 34 ) ;
foodY = 75 + 25 * random. nextInt ( 24 ) ;
}
@Override
protected void paintComponent ( Graphics g) {
super . paintComponent ( g) ;
this . setBackground ( Color. BLACK) ;
Data. food. paintIcon ( this , g, foodX, foodY) ;
if ( fx. equals ( "R" ) ) {
Data. right. paintIcon ( this , g, snakeX[ 0 ] , snakeY[ 0 ] ) ;
} else if ( fx. equals ( "L" ) ) {
Data. left. paintIcon ( this , g, snakeX[ 0 ] , snakeY[ 0 ] ) ;
} else if ( fx. equals ( "U" ) ) {
Data. up. paintIcon ( this , g, snakeX[ 0 ] , snakeY[ 0 ] ) ;
} else if ( fx. equals ( "D" ) ) {
Data. down. paintIcon ( this , g, snakeX[ 0 ] , snakeY[ 0 ] ) ;
}
for ( int i= 1 ; i< length; i++ ) {
Data. body. paintIcon ( this , g, snakeX[ i] , snakeY[ i] ) ;
}
if ( isStart == false ) {
g. setColor ( Color. white) ;
g. setFont ( new Font ( "微软雅黑" , Font. BOLD, 40 ) ) ;
g. drawString ( "按下空格开始游戏" , 300 , 300 ) ;
}
if ( isFail) {
g. setColor ( Color. red) ;
g. setFont ( new Font ( "微软雅黑" , Font. BOLD, 40 ) ) ;
g. drawString ( "失败,按下空格重新开始" , 300 , 300 ) ;
}
}
@Override
public void keyPressed ( KeyEvent e) {
int keycode = e. getKeyCode ( ) ;
if ( keycode == KeyEvent. VK_SPACE) {
if ( isFail) {
isFail = false ;
init ( ) ;
} else {
isStart = ! isStart;
}
repaint ( ) ;
}
if ( keycode == KeyEvent. VK_UP) {
fx = "U" ;
} else if ( keycode == KeyEvent. VK_DOWN) {
fx = "D" ;
} else if ( keycode == KeyEvent. VK_LEFT) {
fx = "L" ;
} else if ( keycode == KeyEvent. VK_RIGHT) {
fx = "R" ;
}
}
@Override
public void keyReleased ( KeyEvent e) {
}
@Override
public void keyTyped ( KeyEvent e) {
}
@Override
public void actionPerformed ( ActionEvent e) {
if ( isStart && isFail== false ) {
if ( snakeX[ 0 ] == foodX && snakeY[ 0 ] == foodY) {
length++ ;
foodX = 25 + 25 * random. nextInt ( 34 ) ;
foodY = 75 + 25 * random. nextInt ( 24 ) ;
}
for ( int i= length- 1 ; i> 0 ; i-- ) {
snakeX[ i] = snakeX[ i- 1 ] ;
snakeY[ i] = snakeY[ i- 1 ] ;
}
if ( fx. equals ( "R" ) )
{
snakeX[ 0 ] = snakeX[ 0 ] + 25 ;
if ( snakeX[ 0 ] > 850 ) { snakeX[ 0 ] = 25 ; }
} else if ( fx. equals ( "L" ) )
{
snakeX[ 0 ] = snakeX[ 0 ] - 25 ;
if ( snakeX[ 0 ] < 25 ) { snakeX[ 0 ] = 850 ; }
} else if ( fx. equals ( "U" ) )
{
snakeY[ 0 ] = snakeY[ 0 ] - 25 ;
if ( snakeY[ 0 ] < 70 ) { snakeY[ 0 ] = 650 ; }
} else if ( fx. equals ( "D" ) )
{
snakeY[ 0 ] = snakeY[ 0 ] + 25 ;
if ( snakeY[ 0 ] > 650 ) { snakeY[ 0 ] = 75 ; }
}
if ( snakeX[ 0 ] == foodX && snakeY[ 0 ] == foodY)
{
length++ ;
foodX = 25 + 25 * random. nextInt ( 34 ) ;
foodY = 75 + 25 * random. nextInt ( 24 ) ;
}
for ( int i= 1 ; i< length; i++ )
{
if ( snakeX[ 0 ] == snakeX[ i] && snakeY[ 0 ] == snakeY[ i] )
isFail = true ;
}
repaint ( ) ;
}
timer. start ( ) ;
}
}
主页面
package Final_traning. snake;
import javax. swing. *;
public class StartGame {
public static void main ( String[ ] args) {
JFrame frame = new JFrame ( ) ;
frame. setBounds ( 10 , 10 , 900 , 720 ) ;
frame. setResizable ( false ) ;
frame. setDefaultCloseOperation ( WindowConstants. EXIT_ON_CLOSE) ;
frame. add ( new GamewPanel ( ) ) ;
frame. setLocation ( 100 , 100 ) ;
frame. setVisible ( true ) ;
}
}
游戏用到的素材: ps:模仿b站阿婆主 遇见狂神说所写