私は、ネットワーク上でプレイするマルチプレイヤー スネーク ゲームを開発しています。正常に動作していますが、時々 java.util.ConcurrentModification Exception をスローします。これは私のゲームのメイン クラスの paintComponent() メソッドでスローされます。これがスローされるコードは
for (String name : map.keySet()) {
if (!map.get(name).gameover) {
for (int i = 0; i < map.get(name).length; i++) {
rect = new Rectangle2D.Double(map.get(name).p[i].x,
map.get(name).p[i].y, width, width);
g1.setColor(Color.black);
g1.draw(rect);
g1.setPaint(map.get(name).snakecolor);
g1.fill(rect);
}
}
}
Hashmap マップは、からのマッピングです。
HashMap<String,Snake>
Snake は、ヘビのすべての属性を持つクラスです。また、メイン クラスは、サーバーを介して他のクライアントからメッセージと更新を受信するために、スレッドを並行して実行します。
スレッド側の反復子も同じマップを使用します (そのクラスへの参照によって渡されます)。そのためのコードは以下のとおりです。この関数は、プレーヤーのスコアが特定のポイントに達した後、レベルがアップグレードされた場合に呼び出されます。
void levelUp(int level){
for(String name:map.keySet()){
map.get(name).level=level;
}
Game.speed=100/level;
}
オブジェクト書き込みの衝突はこれによるものだと思います。誰でもこの問題の解決策を提案できますか。
値をマップに入れるコードも以下に示します。
void populateMap() {
try {
try {
objin = new ObjectInputStream(socket.getInputStream());
} catch (StreamCorruptedException e) {
System.out.println("Stream Corrupted!");
}
Object name = objin.readObject();
if (((Snake) name).player.equals("food_coord")) {
Game.foodx = objin.readInt();
Game.foody = objin.readInt() + 35;
start = true;
System.out.println("Game Started");
return;
} else {
map.put(((Snake) name).player, (Snake) name);
System.out.println("Recieved: " + ((Snake) name).player);
}
} catch (java.net.SocketException s) {
JOptionPane.showMessageDialog(null, "Server Closed", "ERROR",
JOptionPane.ERROR_MESSAGE);
System.exit(0);
} catch (Exception e) {
e.printStackTrace();
}
}