[java]代码库
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) 回复
不错,很经典
回复评论