Java贪吃蛇游戏
最近要考试了,但是还是抽出时间来做一个贪吃蛇玩玩,大概几天的时间吧,中途也遇到很多问题,但还是解决了,感谢狂神。
总结,开发需要一定的逻辑思维,分模块开发,把逻辑理清了,开发就不难了,希望多努力学习,
游戏的启动主类
package Snake ;
import javax. swing. * ;
public class Startgame {
public static void main ( String [ ] args) {
JFrame jFrame = new JFrame ( ) ;
jFrame. setBounds ( 10 , 10 , 900 , 720 ) ;
jFrame. setResizable ( false ) ;
jFrame. setDefaultCloseOperation ( WindowConstants . EXIT_ON_CLOSE) ;
jFrame. add ( new GamePanel ( ) ) ;
jFrame. setVisible ( true ) ;
}
}
存放数据图片的类
package Snake ;
import javax. swing. * ;
import java. net. URL;
public class Data {
public static URL ggURL = Data . class . getResource ( "SnakeData/gg.png" ) ;
public static ImageIcon head = new ImageIcon ( ggURL) ;
public static URL upURL = Data . class . getResource ( "SnakeData/up.png" ) ;
public static URL downURL = Data . class . getResource ( "SnakeData/down.png" ) ;
public static URL leftURL = Data . class . getResource ( "SnakeData/left.png" ) ;
public static URL rightURL = Data . class . getResource ( "SnakeData/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 ( "SnakeData/body.png" ) ;
public static ImageIcon body = new ImageIcon ( bodyURL) ;
public static URL foodURL = Data . class . getResource ( "SnakeData/food.png" ) ;
public static ImageIcon food = new ImageIcon ( foodURL) ;
}
面板类,包含游戏实现的细节
package Snake ;
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. Random ;
public class GamePanel extends JPanel implements KeyListener , ActionListener {
int length;
int [ ] snakeX = new int [ 600 ] ;
int [ ] snakeY = new int [ 500 ] ;
String direction= "R" ;
Timer timer = new Timer ( 100 , this ) ;
int foodx;
int foody;
Random random = new Random ( ) ;
boolean isFial = false ;
boolean isStart;
int score = 0 ;
public GamePanel ( ) {
init ( ) ;
this . setFocusable ( true ) ;
this . addKeyListener ( this ) ;
timer. start ( ) ;
}
public void init ( ) {
length = 3 ;
snakeX[ 0 ] = 100 ; snakeY[ 0 ] = 100 ;
snakeX[ 1 ] = 75 ; snakeY[ 1 ] = 100 ;
snakeX[ 2 ] = 50 ; snakeY[ 2 ] = 100 ;
isStart= false ;
foodx = 25 + 25 * ( random. nextInt ( 34 ) ) ;
foody = 75 + 25 * ( random. nextInt ( 24 ) ) ;
}
@Override
protected void paintComponent ( Graphics g) {
super . paintComponent ( g) ;
this . setBackground ( Color . WHITE) ;
Data . head. paintIcon ( this , g, 25 , 11 ) ;
g. fillRect ( 25 , 75 , 850 , 600 ) ;
if ( direction == "R" ) {
Data . right. paintIcon ( this , g, snakeX[ 0 ] , snakeY[ 0 ] ) ;
} else if ( direction == "L" ) {
Data . left. paintIcon ( this , g, snakeX[ 0 ] , snakeY[ 0 ] ) ;
} else if ( direction == "U" ) {
Data . up. paintIcon ( this , g, snakeX[ 0 ] , snakeY[ 0 ] ) ;
} else if ( direction == "D" ) {
Data . down. paintIcon ( this , g, snakeX[ 0 ] , snakeY[ 0 ] ) ;
}
g. setColor ( new Color ( 30 , 229 , 30 ) ) ;
g. setFont ( new Font ( "微软雅黑" , Font . BOLD, 18 ) ) ;
g. drawString ( "长度:" + length, 790 , 35 ) ;
g. drawString ( "积分:" + score, 790 , 56 ) ;
Data . food. paintIcon ( this , g, foodx, foody) ;
for ( int i = 1 ; i < length; i++ ) {
Data . body. paintIcon ( this , g, snakeX[ i] , snakeY[ i] ) ;
}
if ( isStart== false ) {
g. setColor ( new Color ( 248 , 246 , 246 ) ) ;
g. setFont ( new Font ( "微软雅黑" , Font . BOLD, 60 ) ) ;
g. drawString ( "按下空格键开始" , 240 , 350 ) ;
}
if ( isFial) {
g. setColor ( Color . RED) ;
g. setFont ( new Font ( "微软雅黑" , Font . BOLD, 60 ) ) ;
g. drawString ( "游戏失败,按下空格重新开始" , 70 , 350 ) ;
}
}
@Override
public void keyPressed ( KeyEvent e) {
int keycode = e. getKeyCode ( ) ;
if ( keycode == KeyEvent . VK_SPACE) {
if ( isFial== true ) {
isFial = false ;
init ( ) ;
} else {
isStart = ! isStart;
}
repaint ( ) ;
}
if ( keycode== KeyEvent . VK_UP) {
direction = "U" ;
} else if ( keycode== KeyEvent . VK_DOWN) {
direction = "D" ;
} else if ( keycode== KeyEvent . VK_LEFT) {
direction = "L" ;
} else if ( keycode== KeyEvent . VK_RIGHT) {
direction = "R" ;
}
for ( int i = length- 1 ; i > 0 ; i-- ) {
snakeX[ i] = snakeX[ i- 1 ] ;
snakeY[ i] = snakeY[ i- 1 ] ;
}
repaint ( ) ;
}
@Override
public void actionPerformed ( ActionEvent e) {
if ( isStart == true && isFial== false ) {
for ( int i = length - 1 ; i > 0 ; i-- ) {
snakeX[ i] = snakeX[ i - 1 ] ;
snakeY[ i] = snakeY[ i - 1 ] ;
}
if ( direction. equals ( "R" ) ) {
snakeX[ 0 ] = snakeX[ 0 ] + 25 ; if ( snakeX[ 0 ] > 850 ) { snakeX[ 0 ] = 25 ; }
} else if ( direction. equals ( "L" ) ) {
snakeX[ 0 ] = snakeX[ 0 ] - 25 ; if ( snakeX[ 0 ] < 25 ) { snakeX[ 0 ] = 850 ; }
} else if ( direction. equals ( "U" ) ) {
snakeY[ 0 ] = snakeY[ 0 ] - 25 ; if ( snakeY[ 0 ] < 75 ) { snakeY[ 0 ] = 650 ; }
} else if ( direction. equals ( "D" ) ) {
snakeY[ 0 ] = snakeY[ 0 ] + 25 ; if ( snakeY[ 0 ] > 650 ) { snakeY[ 0 ] = 75 ; }
}
if ( snakeX[ 0 ] == foodx&& snakeY[ 0 ] == foody) {
length += 1 ;
score+= 10 ;
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] ) {
isFial = true ;
score= 0 ;
}
}
repaint ( ) ;
timer. start ( ) ;
}
}
@Override
public void keyTyped ( KeyEvent e) { }
@Override
public void keyReleased ( KeyEvent e) { }
}
代码中存在注释,有用拿走,嘿嘿!!