⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 snakecanvas.java

📁 贪吃蛇网络版 运行平台 LINUX/UNIX Macintosh Windows Server 2003 Windows 2000 Windows XP Windows CE Windows 9*/
💻 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 + -