📄 snakecanvas.java
字号:
package logic;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.*;
import javax.imageio.ImageIO;
import ui.EndDialog;
public class SnakeCanvas extends Canvas implements Directable, Runnable {
private static final long serialVersionUID = 1L;
BufferStrategy strategy;
BufferedImage img;
Image image;
Hashtable snakes = new Hashtable();
private Food food;
private String[] playerNames;
private int playerNO = 2;
String host = "127.0.0.1";
int port = 5000;
Socket s;
DataInputStream dis;
DataOutputStream dos;
int ID;
KeySender keySender;
private String mapName = "The Heart of God.map"; // 默认地图
private WorldMap worldMap;
// the fields listed below are used by all kinds of draw method
private Image background;
private Image myPartImg;
private Image otherPartImg;
private Image treeImg;
private Image stoneImg;
private Image foodImg;
public SnakeCanvas() {
setFocusable(true);
loadImage();
}
public SnakeCanvas(Socket s, int ID, String mapName) {
this();
this.s = s;
this.ID = ID;
this.mapName = mapName;
try {
dis = new DataInputStream(s.getInputStream());
dos = new DataOutputStream(s.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
public void setWorldMap(WorldMap worldMap) {
this.worldMap = worldMap;
}
public String getMapName() {
return mapName;
}
public void loadImage() {
try {
background = ImageIO.read(new File("img/background.jpg"));
myPartImg = ImageIO.read(new File("img/mypartImg.jpg"));
otherPartImg = ImageIO.read(new File("img/otherpartImg.jpg"));
treeImg = ImageIO.read(new File("img/barrier.jpg"));
stoneImg = ImageIO.read(new File("img/barrier.jpg"));
foodImg = ImageIO.read(new File("img/foodImg.jpg"));
} catch (IOException e) {
e.printStackTrace();
System.out.println("load image error!");
}
}
public void init() {
addSnake(playerNO);
this.addKeyListener(new KeyHandler());
food = new Food(worldMap.getXFood(), worldMap.getYFood(), worldMap
.getMapWidth(), worldMap.getMapHeight());
drawWorld();
keySender = new KeySender(dos);
new Thread(this).start();
}
public void addSnake(int no) {
Vector snakeParts;
int x, y;
for (int i = 0; i < no; i++) {
x = Integer.parseInt(worldMap.getPlayerStartPosition(i * 2));
y = Integer.parseInt(worldMap.getPlayerStartPosition(i * 2 + 1));
snakeParts = new Vector();
snakeParts.addElement(new SnakePart(x, y));
snakeParts.addElement(new SnakePart(x, y));
snakeParts.addElement(new SnakePart(x, y));
snakes.put(new Integer(i), snakeParts);
}
}
public void setConnection() {
try {
s = new Socket(host, port);
System.out.println("Connected to " + s.getInetAddress());
dis = new DataInputStream(s.getInputStream());
dos = new DataOutputStream(s.getOutputStream());
ID = dis.read();
mapName = dis.readUTF();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void paintWorld() {
Graphics2D g2d = (Graphics2D) strategy.getDrawGraphics();
g2d.drawImage(img, 0, 0, worldMap.getMapWidth(), worldMap
.getMapHeight(), null);
strategy.show();
}
public void drawWorld() {
/*
* String mapInfo; int xBar, yBar, barType;
*/
setSize(worldMap.getMapWidth(), worldMap.getMapHeight());
// 画背景
createBufferStrategy(2);
strategy = getBufferStrategy();
img = new BufferedImage(worldMap.getMapWidth(),
worldMap.getMapHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics g = img.createGraphics();
g.drawImage(background, 0, 0, null);
/*
* g.setColor(Color.LIGHT_GRAY); g.fillRect(0, 0,
* worldMap.getMapWidth(), worldMap.getMapHeight());
*/
// 画食物
drawFood();
// 画蛇
drawSnake();
// 画障碍
drawBarrier();
/*
* for(Enumeration e = worldMap.getWorldMap();e.hasMoreElements();) {
*
* mapInfo = (String)e.nextElement(); xBar =
* Integer.parseInt(mapInfo.substring(0,mapInfo.indexOf(" "))); mapInfo =
* mapInfo.substring(mapInfo.indexOf(" ")+1); yBar =
* Integer.parseInt(mapInfo.substring(0,mapInfo.indexOf(" "))); barType =
* Integer.parseInt(mapInfo.substring(mapInfo.indexOf(" ")+1));
*
* drawBarrier(xBar, yBar, barType); }
*/
// Graphics bg = img.createGraphics();
// bg.drawImage(image, 0, 0, worldMap.getMapWidth(),
// worldMap.getMapHeight(), this);
img.flush();
paintWorld();
}
public void drawBackground() {
Graphics g = img.createGraphics();
g.drawImage(background, 0, 0, null);
img.flush();
}
// draw Barrier
public void drawBarrier() {
String mapInfo;
int xBar, yBar, barType;
Graphics g = img.createGraphics();
Hashtable hs;
worldMap = new WorldMap(worldMap.getMapName());
Enumeration e = worldMap.getWorldMap();
while (e.hasMoreElements()) {
mapInfo = (String) e.nextElement();
xBar = Integer.parseInt(mapInfo.substring(0, mapInfo.indexOf(" ")));
mapInfo = mapInfo.substring(mapInfo.indexOf(" ") + 1);
yBar = Integer.parseInt(mapInfo.substring(0, mapInfo.indexOf(" ")));
barType = Integer.parseInt(mapInfo
.substring(mapInfo.indexOf(" ") + 1));
// drawBarrier(xBar, yBar, barType);
g.drawImage(treeImg, xBar, yBar, null);
}
img.flush();
}
// 在指定坐标画指定类型的障碍物
public void drawBarrier(int xBar, int yBar, int barType) {
Graphics g = img.createGraphics();
/*
* if (barType == 1) g.setColor(Color.DARK_GRAY); else if (barType == 2)
* g.setColor(Color.GREEN); g.fill3DRect(xBar, yBar, 20, 20, true);
*/
g.drawImage(treeImg, xBar, yBar, null);
img.flush();
}
// 在新坐标处画食物,在旧坐标处擦去食物
public void drawFood(int oldX, int oldY, int newX, int newY, int id) {
Graphics f = img.createGraphics();
/*
* if (id == ID) f.setColor(Color.BLUE); else f.setColor(Color.ORANGE);
* f.fillRect(oldX, oldY, 20, 20); f.setColor(Color.RED);
* f.fill3DRect(newX, newY, 20, 20, true);
*/
f.drawImage(foodImg, newX, newY, null);
img.flush();
}
public void drawFood() {
Graphics f = img.createGraphics();
/*
* f.setColor(Color.RED); f.fill3DRect(food.getX(), food.getY(), 20, 20,
* true);
*/
f.drawImage(foodImg, food.getX(), food.getY(), null);
img.flush();
}
public void drawSnake(int tailX, int tailY, int headX, int headY, int id) {
Graphics s = img.createGraphics();
s.setColor(Color.LIGHT_GRAY);
s.fillRect(tailX, tailY, 20, 20);
if (id == ID)
s.setColor(Color.BLUE);
else
s.setColor(Color.ORANGE);
s.fill3DRect(headX, headY, 20, 20, true);
img.flush();
}
/*
* public void drawSnake() {
*
* int id = 0; Vector snakeParts; SnakePart snakePart; Graphics g =
* img.createGraphics();
*
*
* do { snakeParts = (Vector) snakes.get(new Integer(id)); snakePart =
* (SnakePart) snakeParts.firstElement(); if (id == ID)
* g.setColor(Color.BLUE); else g.setColor(Color.ORANGE);
* g.fill3DRect(snakePart.getX(), snakePart.getY(), 20, 20, true); } while
* (snakes.containsKey(new Integer(++id)));
*
* img.flush(); }
*/
public void drawSnake() {
int id = 0;
Vector snakeParts;
SnakePart snakePart;
Graphics g = img.createGraphics();
Iterator it;
do {
snakeParts = (Vector) snakes.get(new Integer(id));
// snakePart = (SnakePart) snakeParts.firstElement();
it = snakeParts.iterator();
while (it.hasNext()) {
snakePart = (SnakePart) it.next();
if (id == ID)
g.drawImage(myPartImg, snakePart.getX(), snakePart.getY(),
null);
else
g.drawImage(otherPartImg, snakePart.getX(), snakePart
.getY(), null);
}
} while (snakes.containsKey(new Integer(++id)));
img.flush();
}
public void run() {
String msg;
String par1, par2, par3;
SnakePart _sp, tailPart;
Vector _sps;
int tailX, tailY;
try {
while (!Thread.interrupted()) {
msg = dis.readUTF();
// 命令分为‘食物’‘移动’‘生长’三种,分别处理
if (msg.startsWith("Food")) {
msg = msg.substring(msg.indexOf("|") + 1);
par1 = msg.substring(0, msg.indexOf("|"));
msg = msg.substring(msg.indexOf("|") + 1);
par2 = msg.substring(0, msg.indexOf("|"));
par3 = msg.substring(msg.indexOf("|") + 1);
drawFood(food.getX(), food.getY(), Integer.parseInt(par1),
Integer.parseInt(par2), Integer.parseInt(par3));
food.setFoodPosition(Integer.parseInt(par1), Integer
.parseInt(par2));
} else if (msg.startsWith("Move")) {
msg = msg.substring(msg.indexOf("|") + 1);
par1 = msg.substring(0, msg.indexOf("|"));
msg = msg.substring(msg.indexOf("|") + 1);
par2 = msg.substring(0, msg.indexOf("|"));
par3 = msg.substring(msg.indexOf("|") + 1);
_sps = (Vector) snakes.get(new Integer(Integer
.parseInt(par1)));
tailPart = (SnakePart) _sps.lastElement();
tailX = tailPart.getX();
tailY = tailPart.getY();
/*
* drawSnake(tailX, tailY, Integer.parseInt(par2), Integer
* .parseInt(par3), Integer.parseInt(par1));
*/
drawSnake();
_sp = new SnakePart();
_sp.update(Integer.parseInt(par2), Integer.parseInt(par3));
_sps.insertElementAt(_sp, 0);
_sps.removeElementAt(_sps.size() - 1);
} else if (msg.startsWith("Grow")) {
par1 = msg.substring(msg.indexOf("|") + 1);
_sps = (Vector) snakes.get(new Integer(Integer
.parseInt(par1)));
_sp = (SnakePart) _sps.lastElement();
_sps.add(_sp);
} else if (msg.startsWith("Die")) {
par1 = msg.substring(msg.indexOf("|") + 1);
if (Integer.parseInt(par1) == ID)
new EndDialog(rank());
_sps = (Vector) snakes.get(new Integer(Integer
.parseInt(par1)));
_sps.clear();
}
// 每次处理完命令,重画
drawBarrier();
drawFood();
paintWorld();
drawBackground();
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
/**
* rank all player
*
* @return a string array with the player in ranked order
* @author hch
* @version 1.0
*/
public String[] rank() {
int[] playerSize = new int[playerNames.length];
int temp;
String tempName;
for (int i = 0; i < playerNames.length; i++) {
playerSize[i] = ((Vector) snakes.get(i)).size();
}
if (playerNames.length > 1) {
for (int i = 0; i < playerNames.length; i++) {
for (int j = 0; j < playerNames.length - i; j++) {
if (playerSize[j] < playerSize[j + 1]) {
temp = playerSize[j];
playerSize[j] = playerSize[j + 1];
playerSize[j + 1] = temp;
tempName = playerNames[j];
playerNames[j] = playerNames[j + 1];
playerNames[j + 1] = tempName;
}
}
}
}
return playerNames;
}
private class KeyHandler implements KeyListener {
public void keyPressed(KeyEvent event) {
int d = 0;
if (event.getKeyCode() == KeyEvent.VK_LEFT) {
d = LEFT;
}
if (event.getKeyCode() == KeyEvent.VK_RIGHT) {
d = RIGHT;
}
if (event.getKeyCode() == KeyEvent.VK_UP) {
d = UP;
}
if (event.getKeyCode() == KeyEvent.VK_DOWN) {
d = DOWN;
}
if (event.getKeyChar() == ' ') {
}
try {
// 若检测到合法按键,则添加至按键队列
keySender.add(d);
} catch (Exception e) {
e.printStackTrace();
}
}
public void keyReleased(KeyEvent event) {
}
public void keyTyped(KeyEvent event) {
}
}
public void setPlayerNames(String[] playerNames) {
this.playerNames = playerNames;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -