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

📄 netsnake.java

📁 是一个贪吃蛇的游戏
💻 JAVA
字号:
package NetPlayer;


import java.awt.*;
import java.awt.event.*;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.*;
import javax.swing.*;

import Login.Client;

public class NetSnake implements KeyListener {
	JFrame mainFrame;
	Canvas paintCanvas;
	JLabel myScoreLabel;
	JLabel youScoreLabel;
	JLabel mySpeedLabel;
	NetSnakeModel snakeModel = null;

	/*
	 * 客户端的游戏界面的大小和蛇身的宽高
	 */
	int canvasWidth;
	int canvasHeight;
	int nodeWidth;
	int nodeHeight;

	/*
	 * 设置蛇的初始位置
	 */
	int snakeX, snakeY;

	Socket s;
	ObjectInputStream ois;
	ObjectOutputStream oos;
	String ip="";
	public NetSnake(int snakeX, int snakeY,String ip) {
		this.ip=ip;
		try {
			InetAddress ia = InetAddress.getByName(ip);
			s = new Socket(ia, 5555);
			/*
			 * 从服务器接收 游戏界面的大小和蛇身的宽高
			 */
			ois = new ObjectInputStream(s.getInputStream());
			try {
				canvasWidth = Integer.parseInt(ois.readObject().toString());
				canvasHeight = Integer.parseInt(ois.readObject().toString());
				nodeWidth = Integer.parseInt(ois.readObject().toString());
				nodeHeight = Integer.parseInt(ois.readObject().toString());
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}


		this.snakeX = snakeX;
		this.snakeY = snakeY;
		mainFrame = new JFrame("GreedSnake");
		Container cp = mainFrame.getContentPane();
		
		myScoreLabel = new JLabel("My Score:");
		mySpeedLabel=new JLabel("My Speed:");
		Panel p=new Panel();
		p.setLayout(new GridLayout(1,2));
		p.add(myScoreLabel);
		p.add(mySpeedLabel);
		cp.add(p, BorderLayout.NORTH);
		
		youScoreLabel = new JLabel("对手分数:");
		cp.add(youScoreLabel, BorderLayout.SOUTH);

		paintCanvas = new Canvas();
		paintCanvas.setSize(canvasWidth + 1, canvasHeight + 1);
		paintCanvas.addKeyListener(this);
		cp.add(paintCanvas, BorderLayout.CENTER);

		mainFrame.addKeyListener(this);
		mainFrame.pack();
		mainFrame.setResizable(false);
		mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		int width = Toolkit.getDefaultToolkit().getScreenSize().width;
		int height = Toolkit.getDefaultToolkit().getScreenSize().height;
		mainFrame.setLocation(width / 2 - canvasWidth / 2, height / 2
				- canvasHeight / 2);
		mainFrame.setVisible(true);
		begin();
		} catch (Exception e) {
			JOptionPane.showMessageDialog(null, "无法连接服务器,请确认服务器已启动!",
					"Error", JOptionPane.INFORMATION_MESSAGE);
			new Client();
		}
	}

	public void keyPressed(KeyEvent e) {
		int keyCode = e.getKeyCode();
		if (snakeModel.myRunning)
			switch (keyCode) {
			case KeyEvent.VK_UP:
				snakeModel.changeDirection(NetSnakeModel.UP);
				break;
			case KeyEvent.VK_DOWN:
				snakeModel.changeDirection(NetSnakeModel.DOWN);
				break;
			case KeyEvent.VK_LEFT:
				snakeModel.changeDirection(NetSnakeModel.LEFT);
				break;
			case KeyEvent.VK_RIGHT:
				snakeModel.changeDirection(NetSnakeModel.RIGHT);
				break;
			case KeyEvent.VK_ADD:
			case KeyEvent.VK_PAGE_UP:
				snakeModel.speedUp();
				break;
			case KeyEvent.VK_SUBTRACT:
			case KeyEvent.VK_PAGE_DOWN:
				snakeModel.speedDown();
				break;
			default:
			}
	}

	public void keyReleased(KeyEvent e) {
	}

	public void keyTyped(KeyEvent e) {
	}

	public void repaint() {
		Graphics g = paintCanvas.getGraphics();

		/*
		 * 设置面板颜色、画上面板
		 */
		g.setColor(Color.WHITE);
		g.fillRect(0, 0, canvasWidth, canvasHeight);

		/*
		 * 画出蛇的位置
		 */
		g.setColor(Color.blue);
		LinkedList qita = snakeModel.youNodeArray;
		Iterator it2 = qita.iterator();
		while (it2.hasNext()) {
			Node n = (Node) it2.next();
			drawNode(g, n);
		}

		g.setColor(Color.BLACK);
		LinkedList na = snakeModel.myNodeArray;
		Iterator it = na.iterator();
		while (it.hasNext()) {
			Node n = (Node) it.next();
			drawNode(g, n);
		}

		/*
		 * 画出食物位置
		 */
		if (snakeModel.food != null) {
			g.setColor(Color.RED);
			Node n = snakeModel.food;
			drawNode(g, n);
		}

		updateScore();
		updateSpeed();
	}

	
	  public void drawNode(Graphics g, Node n){
		  /*
		   * 转化为g2是为了画出的形状不会有粗糙的边
		   */
		Graphics2D g2 = (Graphics2D) g;
		RenderingHints rh = g2.getRenderingHints();
		rh.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		g2.setRenderingHints(rh);
	    g2.fillOval(n.x*nodeWidth,
	               n.y*nodeHeight,
	               nodeWidth-1,
	               nodeHeight-1);
	  }

	public void updateScore() {
		String my = "My Score: " + snakeModel.myScore;
		myScoreLabel.setText(my);
		String you = "You Score: " + snakeModel.youScore;
		youScoreLabel.setText(you);
	}
	
	public void updateSpeed()
	{
		String my="My Speed:"+snakeModel.mySpeed;
		mySpeedLabel.setText(my);
	}
	
	void begin() {
		if (snakeModel == null || !snakeModel.myRunning) {
			snakeModel = new NetSnakeModel(this, snakeX, snakeY, s);
			(new Thread(snakeModel)).start();
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -