gpt4 book ai didi

java - 服务器端 客户端 JAVA 游戏 Action

转载 作者:行者123 更新时间:2023-12-01 23:12:25 26 4
gpt4 key购买 nike

我是服务器-客户端编码的新手。我有一个制作 3 石子游戏的项目,我应该在客户端和服务器之间建立连接。我将客户端连接到服务器,但我不知道如何将客户端的移动(点的坐标)传递到服务器,然后将正确的消息从服务器返回到客户端。我不知道什么是 byte[] 数据以及 BUFFSize你能解释一下为什么我必须使用 byte[] 和 BUFFSIZE 吗?我怎样才能让服务器客户端将石头放在棋盘上?客户端:

public class ThreeStonesGameClientSide {

private static final int BUFSIZE = 32;
private final static org.slf4j.Logger LOG = LoggerFactory.getLogger(ThreeStonesGameClientSide.class);
private String ip;
private int port;

public ThreeStonesGameClientSide(String ip, int port) {
this.ip = ip;
this.port = port;
}
public void connectToServer() throws IOException {
Socket socket = new Socket(this.ip, this.port);
LOG.info("Connected to the server");
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();

Point recivedPoint = new Point();
int x = (int) recivedPoint.getX();
int y = (int) recivedPoint.getY();

byte[] data = new byte[BUFSIZE];
// Receive the same string back from the server
int totalBytesRcvd = 0; // Total bytes received so far
int bytesRcvd; // Bytes received in last read
while (totalBytesRcvd < data.length) {
if ((bytesRcvd = in.read(data, totalBytesRcvd,
data.length - totalBytesRcvd)) == -1) {
throw new SocketException("Connection closed prematurely");
}
totalBytesRcvd += bytesRcvd;
} // data array is full

System.out.println("Received: " + new String(data));

socket.close(); // Close the socket and its streams

}

}

这是服务器端

public class ThreeStonesGameClientSide {

private static final int BUFSIZE = 32;
private final static org.slf4j.Logger LOG = LoggerFactory.getLogger(ThreeStonesGameClientSide.class);
private String ip;
private int port;

public ThreeStonesGameClientSide(String ip, int port) {
this.ip = ip;
this.port = port;
}
public void connectToServer() throws IOException {
Socket socket = new Socket(this.ip, this.port);
LOG.info("Connected to the server");
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();

Point recivedPoint = new Point();
int x = (int) recivedPoint.getX();
int y = (int) recivedPoint.getY();

byte[] data = new byte[BUFSIZE];
// Receive the same string back from the server
int totalBytesRcvd = 0; // Total bytes received so far
int bytesRcvd; // Bytes received in last read
while (totalBytesRcvd < data.length) {
if ((bytesRcvd = in.read(data, totalBytesRcvd,
data.length - totalBytesRcvd)) == -1) {
throw new SocketException("Connection closed prematurely");
}
totalBytesRcvd += bytesRcvd;
} // data array is full

System.out.println("Received: " + new String(data));

socket.close(); // Close the socket and its streams

}

}

这是 Board 类

public class Board implements Serializable {

public final IntegerProperty numOfWhiteStones;
public final IntegerProperty numOfBlackStones;
public final ObjectProperty<Stone[][]> board;

private Point lastPoint;

public Board(Player p1, Player p2) {
this.numOfBlackStones = new SimpleIntegerProperty();
this.numOfWhiteStones = new SimpleIntegerProperty();
this.board = new SimpleObjectProperty<Stone[][]>(new Stone[11][11]);
}

/**
* Checks if chosen point is along the same x and y axis as the last placed point.
* @param placementPoint
* @return
*/
public boolean checkSlot(Point placement) {
Stone[][] board = getBoard();
int x = placement.x;
int y = placement.y;
// Check if placement is within the limits of the inner arry
if ((x < 0 || x > board.length - 1) && (y < 0 || y > board.length - 1)) {
return false;
}
// Check if place on board is empty
if (board[x][y] != Stone.EMPTY) {
return false;
}
if (lastPoint == null){
return true;
}
// Check if placement is within the same colum or row as the last played stone
return (x == lastPoint.x ^ y == lastPoint.y);

}

public void placeStone(Point placement, Stone stone) {
Stone[][] board = getBoard();
int x = placement.x;
int y = placement.y;
board[x][y] = stone;
if (stone == Stone.BLACK) {
numOfBlackStones.add(1);
} else {
numOfWhiteStones.add(1);
}
lastPoint = placement;
}

public int calculatePointsFor(Stone stone) {
Stone[][] board = this.board.get();
int counter = 0;
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board.length; j++) {
for (int k = 0; k < 4; k++) {
if (directionCheck(stone, new Point(i, j), k)){
counter++;
}
}
}
}
return counter;
}

boolean directionCheck(Stone stone, Point coord, int direction) {
Stone[][] board = getBoard();
int x = coord.x;
int y = coord.y;
switch (direction) {
case 0:
if (coord.x + 2 < board.length) {
return (board[x][y] == board[x + 1][y] && board[x + 1][y] == board[x + 2][y]);
}
break;
case 1:
if ((coord.x + 2 < board.length) && (coord.y + 2 < board.length)) {
return (board[x][y] == board[x + 1][y + 1] && board[x + 1][y + 1] == board[x + 2][y + 2]);
}
break;
case 2:
if (coord.y + 2 < board.length) {
return (board[x][y] == board[x][y + 1] && board[x][y + 1] == board[x][y + 2]);
}
break;
case 3:
if ((coord.x - 2 >= 0) && (coord.y + 2 < board.length)) {
return (board[x][y] == board[x - 1][y + 1] && board[x - 1][y + 1] == board[x - 2][y + 2]);
}
break;

}
return false;
}

public final Stone[][] getBoard() {
return board.get();
}

public void setBoard(final Stone[][] isbn) {
this.board.set(isbn);
}

public final ObjectProperty boardProperty() {
return board;
}

public final int getNumOfWhiteStones() {

return numOfWhiteStones.get();
}

public final IntegerProperty numOfWhiteStonesProperty() {
return numOfWhiteStones;
}

public final int getNumOfBlackStones() {
return numOfBlackStones.get();
}

public final IntegerProperty numOfBlackStonesProperty() {
return numOfBlackStones;
}

public final Point getLastPoint() {
return lastPoint;
}

}

最佳答案

对于你的问题,恕我直言:

  1. 所有通过网络发送的数据都应该是字节数组,它涉及字节顺序(Endianness),您可以在 Wiki 中查看更多定义。 。如果它是字节数组,你可以采取一些技巧来使其尽可能小。在网络中,可能会出现很多问题,因此数据传输越少,丢失就越困难。对于字节数据传输,你可以在这里查看我的小函数:Pack data with Msgpack libraries Endianness converting

  2. 您创建的服务器应该处理游戏中的所有逻辑,客户端仅用于查看。例如:当客户端进行移动时,他只发送他的操作(移动对象的 ID、新对象的目标……)。之后,服务器必须确认消息的信息,自行计算并将结果返回给所有相应的客户端。我编写了一个小项目,因此您可以查看示例以了解更多详细信息:NIO java server game framework with examples

关于java - 服务器端 客户端 JAVA 游戏 Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58368188/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com