📄 netsnake.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 + -