package 贪吃蛇; |
import java.applet.Applet; |
import java.awt.Color; |
import java.awt.Font; |
import java.awt.Graphics; |
import java.awt.event.ActionEvent; |
import java.awt.event.ActionListener; |
import java.awt.event.KeyEvent; |
import java.awt.event.KeyListener; |
import java.io.File; |
import java.net.MalformedURLException; |
import java.util.Random; |
import javax.swing.ImageIcon; |
import javax.swing.JPanel; |
import javax.swing.Timer; |
public class SnakePanel extends JPanel implements KeyListener,ActionListener { |
|
ImageIcon up = new ImageIcon( "up.png" ); |
ImageIcon down = new ImageIcon( "down.png" ); |
ImageIcon right = new ImageIcon( "right.png" ); |
ImageIcon left = new ImageIcon( "left.png" ); |
ImageIcon title = new ImageIcon( "title.jpg" ); |
ImageIcon food = new ImageIcon( "food.png" ); |
ImageIcon body = new ImageIcon( "body.png" ); |
|
/* |
* 定义数组记录蛇头和蛇身体的坐标,变量len表示蛇的长度 |
* 变量方向表示蛇移动的方向 |
*/ |
int [] snakex = new int [ 750 ]; |
int [] snakey = new int [ 750 ]; |
|
Random rand = new Random(); |
int foodx = rand.nextInt( 34 )* 25 + 25 ; |
int foody = rand.nextInt( 24 )* 25 + 75 ; |
|
int len = 3 ; |
int score = 0 ; |
String fangxiang = "R" ; //R右、L左、U上、D下 |
|
boolean isStarted = false ; //判断游戏是否开始 |
boolean isFailed = false ; //判断是否死亡 |
|
//计时器:1.时间 2.时间到了去找的对象 |
Timer timer = new Timer( 300 , this ); |
|
public SnakePanel(){ |
this .setFocusable( true ); //取得焦点 |
this .addKeyListener( this ); |
setup(); |
timer.start(); |
} |
|
|
/* |
* Graphics图像 |
* public void paint(Graphics g) 以绘制组件。 |
* 应用程序不应直接调用 paint,而是应该使用 repaint 方法来安排重绘组件。 |
* 参数:g (相当于画笔)- 在其中进行绘制的 Graphics 上下文 |
*/ |
public void paint(Graphics g){ |
|
// super.paint(g); |
// this.setBackground(Color.WHITE); |
this .getRootPane().setBackground(Color.WHITE); |
|
/* |
* public void paintIcon(Component c,Graphics g,int x,int y) |
* 绘制图标。 |
* 图标的左上角在图形上下文 g 的坐标空间中的点 (x, y) 处绘制。 |
* 如果此图标没有图像观察者,则此方法使用 c 组件作为观察者。 |
* 参数:c(画布) - 用作观察者的组件,如果此图标没有图像观察者 |
g (画笔)- 图形上下文 |
x - 图标左上角的 X 坐标 |
y - 图标左上角的 Y 坐标 |
*/ |
title.paintIcon( this , g, 25 , 11 ); |
|
/* |
* void java.awt.Graphics.fillRect(int x, int y, int width, int height) |
* 填充指定的矩形。 |
* 该矩形左边和右边位于 x 和 x + width - 1。 |
* 顶边和底边位于 y 和 y + height - 1。 |
* 得到的矩形覆盖的区域宽度为 width 像素,高度为 height 像素。 |
* 使用图形上下文的当前颜色填充该矩形。 |
* 参数:x - 要填充矩形的 x 坐标。 |
y - 要填充矩形的 y 坐标。 |
width - 要填充矩形的宽度。 |
height - 要填充矩形的高度。 |
*/ |
g.fillRect( 25 , 75 , 850 , 600 ); |
|
//画蛇头,先判断蛇头的方向 |
if (fangxiang.equals( "R" )){ |
right.paintIcon( this , g, snakex[ 0 ], snakey[ 0 ]); |
} else if (fangxiang.equals( "L" )){ |
left.paintIcon( this , g, snakex[ 0 ], snakey[ 0 ]); |
} else if (fangxiang.equals( "U" )){ |
up.paintIcon( this , g, snakex[ 0 ], snakey[ 0 ]); |
} else if (fangxiang.equals( "D" )){ |
down.paintIcon( this , g, snakex[ 0 ], snakey[ 0 ]); |
} |
|
//画蛇的身体 |
for ( int i = 1 ; i < len; i++) { |
body.paintIcon( this , g, snakex[i], snakey[i]); |
} |
|
//游戏没有开始时,显示提示语(!isStarted) |
if (isStarted == false ){ |
g.setColor(Color.WHITE); |
g.setFont( new Font( "微软雅黑" ,Font.BOLD, 35 )); |
g.drawString( "Press Space to Start/Pause" , 250 , 350 ); |
} |
|
if (isFailed){ |
g.setColor(Color.WHITE); |
g.setFont( new Font( "微软雅黑" ,Font.BOLD, 35 )); |
g.drawString( "Game Over! Press Space to ReStart" , 200 , 350 ); |
} |
|
food.paintIcon( this , g, foodx, foody); |
|
//添加分数 |
g.setColor(Color.WHITE); |
g.drawString( "Score : " +score, 600 , 45 ); |
} |
|
public void setup(){ |
isStarted = false ; |
isFailed = false ; |
|
len = 3 ; |
snakex[ 0 ] = 100 ; |
snakey[ 0 ] = 100 ; |
snakex[ 1 ] = 75 ; |
snakey[ 1 ] = 100 ; |
snakex[ 2 ] = 50 ; |
snakey[ 2 ] = 100 ; |
|
} |
@Override |
public void keyPressed(KeyEvent e) { |
// TODO Auto-generated method stub |
int keyCode = e.getKeyCode(); |
|
//实现转向,不能实现反转 |
if (keyCode == KeyEvent.VK_SPACE){ |
if (isFailed) { |
// isStarted = false; |
// isFailed = false; |
setup(); |
} else { |
// isStarted = true; |
isStarted = !isStarted; //改变当前状态 |
// repaint(); |
} |
} else if (keyCode == KeyEvent.VK_UP && fangxiang != "D" ){ |
fangxiang = "U" ; |
} else if (keyCode == KeyEvent.VK_DOWN && fangxiang != "U" ){ |
fangxiang = "D" ; |
} else if (keyCode == KeyEvent.VK_RIGHT && fangxiang != "L" ){ |
fangxiang = "R" ; |
} else if (keyCode == KeyEvent.VK_LEFT && fangxiang != "R" ){ |
fangxiang = "L" ; |
} |
|
|
} |
|
@Override |
public void actionPerformed(ActionEvent e) { |
// TODO Auto-generated method stub |
//1.再定义个闹钟 |
timer.start(); |
//2.移动数据 |
|
if (isStarted && !isFailed) { |
//移动身体 |
for ( int i = len; i > 0 ; i--) { |
snakex[i] = snakex[i- 1 ]; |
snakey[i] = snakey[i- 1 ]; |
} |
//移动头 |
if (fangxiang.equals( "R" )){ |
snakex[ 0 ] = snakex[ 0 ] + 25 ; |
if (snakex[ 0 ] > 850 ) |
snakex[ 0 ] = 25 ; |
} else if (fangxiang.equals( "L" )){ |
snakex[ 0 ] = snakex[ 0 ] - 25 ; |
if (snakex[ 0 ] < 25 ) snakex[ 0 ] = 850 ; |
} else if (fangxiang.equals( "U" )){ |
snakey[ 0 ] = snakey[ 0 ] - 25 ; |
if (snakey[ 0 ] < 75 ) snakey[ 0 ] = 650 ; |
} else if (fangxiang.equals( "D" )){ |
snakey[ 0 ] = snakey[ 0 ] + 25 ; |
if (snakey[ 0 ] > 650 ) snakey[ 0 ] = 75 ; |
} |
} |
|
//吃食物 |
if (snakex[ 0 ] == foodx && snakey[ 0 ] == foody){ |
len ++; |
score ++; |
foodx = rand.nextInt( 34 )* 25 + 25 ; |
foody = rand.nextInt( 24 )* 25 + 75 ; |
} |
|
//判断身体相碰,游戏结束 |
for ( int i = 1 ; i < len; i++) { |
if (snakex[ 0 ] == snakex[i] && snakey[ 0 ] == snakey[i]) { |
isFailed = true ; |
} |
} |
|
//3.repaint() |
repaint(); |
} |
@Override |
public void keyReleased(KeyEvent e) { |
// TODO Auto-generated method stub |
} |
@Override |
public void keyTyped(KeyEvent e) { |
// TODO Auto-generated method stub |
} |
} |
package 贪吃蛇; |
import java.applet.Applet; |
import java.io.File; |
import java.net.MalformedURLException; |
import javax.swing.JFrame; |
public class Snake { |
public static void main(String[] args) { |
// TODO Auto-generated method stub |
JFrame frame = new JFrame(); |
frame.setBounds( 10 , 10 , 900 , 720 ); |
frame.setResizable( false ); |
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); |
|
SnakePanel panel = new SnakePanel(); |
frame.add(panel); |
|
frame.setVisible( true ); |
|
} |
} |
中级程序员
by: 宋清兆 发表于:2017-08-10 17:23:57 顶(0) | 踩(0) 回复
不错,很经典
回复评论