gpt4 book ai didi

java - 我该如何用游戏计数器填充我的棋盘?

转载 作者:行者123 更新时间:2023-12-02 06:20:42 27 4
gpt4 key购买 nike

spacebattle

到目前为止,我能够使用 jlabel 制作一个由图 block 组成的板。游戏的下一步是让红色玩家和蓝色玩家轮流选择他们最初控制的行星(通过单击行星图 block )。一旦玩家点击一个星球,一个米波计数器就会被放置在该星球的顶部。

行星的数组数据也应该更新,以便知道行星的所有者。现在,我不知道如何将我的 jlabel 磁贴与我的变量链接起来。

如果您能为我指明正确的方向,我将不胜感激。谢谢。

package SpaceBattle;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;

//import javax.smartcardio.Card;
import javax.swing.*;

public class spacebattle2 extends JFrame {

JLabel[] tilelabel = new JLabel[31];
JLabel[] hexlabel = new JLabel[31];



ImageIcon tileicon, hexicon;

int rownum, colnum;
int c, r, xloc, yloc, hexctr, tilectr;
int energy, ore, capacity;
String labelname;
String type;

int numtiles = 31;
int deckctr = 26;


String[] tiledeck = new String[numtiles];
int[] tilexloc = new int[numtiles];
int[] tileyloc = new int[numtiles];

int tileenergy[] = new int[numtiles];
int tileore[] = new int[numtiles];
int tilecapacity[] = new int[numtiles];
String tiletype[] = new String[numtiles];
String tilename[] = new String[numtiles];
int tilemeeple[] = new int[numtiles];



String[] hexnum = new String[numtiles];
int[] hexxloc = new int[numtiles];
int[] hexyloc = new int[numtiles];
String[] hexempty = new String[numtiles];

int hexenergy[] = new int[numtiles];
int hexore[] = new int[numtiles];
int hexcapacity[] = new int[numtiles];
String hextype[] = new String[numtiles];
String hexname[] = new String[numtiles];
String hexplayer[] = new String[numtiles];

String[] players = new String[6];
String playerturn;

int startingplanets = 2;
int bluemaxplanet = startingplanets;
int redmaxplanet = startingplanets;

int numplanets = 7;
int numspace = 24;
int nonplayertiles = numplanets + numspace;

String planetCode;
String planetselected = "none";

//selectPlanet
String player = "Red";

int i;




public spacebattle2() {

setLayout(null);

createDeck();
shuffleDeck();
drawBoard();
//selectPlanet();

}


private void selectPlanet() {
// TODO Auto-generated method stub

for(i = 0; i < numtiles; i++) {

tilelabel[i].addMouseListener(new MouseListener() {

public void mouseClicked(MouseEvent e) {


System.out.println(i);


}


public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub


}

public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub

}

public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub

}

public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub

}
});
}
}









private void shuffleDeck() {
// TODO Auto-generated method stub

System.out.println("shuffling deck...");

Random r = new Random();
int swapIndex;

String temp;

for(int startIndex = 0; startIndex < numtiles; startIndex++) {

System.out.println(startIndex + " startIndex " + tiledeck[startIndex]);

swapIndex = r.nextInt(numtiles);
System.out.println(swapIndex + " swapIndex " + tiledeck[swapIndex]);

if(swapIndex != startIndex) {

temp = tiledeck[swapIndex];

tiledeck[swapIndex] = tiledeck[startIndex];
System.out.println("Moving " + startIndex + " " + tiledeck[startIndex] + " startIndex to " + swapIndex + " swapIndex");

tiledeck[startIndex] = temp;
System.out.println("Moving " + temp + " temp to " + startIndex + " startIndex");
}
}
}





private void createDeck() {
// TODO Auto-generated method stub

int s, p, xloc = 667, yloc = 10;




/*******************************
*
* Create Space tiles
*
******************************/

System.out.println("creating space tiles...");

tilectr = 0;

for(s= 0; s < numspace; s++) {

tiledeck[tilectr] = "000";

System.out.println(tilectr + " " + tiledeck[tilectr]);

tilectr++;
}


/**************************
*
* Create Planet tiles
*
*************************/

System.out.println("creating planet tiles...");

for(p = 0; p < numplanets; p++) {

energy = (int) (Math.random()*3 + 1);
ore = (int) (Math.random()*3 +1);
capacity = (int) (Math.random()*3 +1);


StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("");
stringBuffer.append(energy);
stringBuffer.append(ore);
stringBuffer.append(capacity);

String planetCode = stringBuffer.toString();

tiledeck[tilectr] = planetCode;

System.out.println(tilectr + " " + tiledeck[tilectr]);
tilectr++;
}

}



private void drawBoard() {
// TODO Auto-generated method stub
int xloc = 10;
int yloc = 61;
int hexctr = 0;


int colnum = 7;
int rownum = 4;

xloc = 10;
yloc = 61;
hexctr = 0;


colnum = 7;
rownum = 4;

int row = 0, col = 0, numtiles = 31;

for(int c = 0; c < numtiles; c ++) {
if(tiledeck[c] == "000") {
System.out.println(c + " " + tiledeck[c] + " tile is space");
tileenergy[c] = 0;
tileore[c] = 0;
tilecapacity[c] = 0;
tiletype[c] = "space";
tilename[c] = "space";

tileicon = new ImageIcon(getClass().getResource("/000.png"));
tilelabel[c] = new JLabel();
tilelabel[c].setIcon(tileicon);

tilelabel[c].setBounds(xloc, yloc, 115, 100);

add(tilelabel[c]);

yloc = yloc + 102;
row++;

if(row == rownum) {
xloc = xloc + 88;
row = 0;
col++;
if(col % 2 == 0) {
yloc = 61;
rownum = rownum - 1;
}
else {
yloc = 10;
rownum = rownum + 1;
}
}
}



else {
System.out.println(c + " " + tiledeck[c] + " tile is planet");
tileenergy[c] = Integer.parseInt(tiledeck[c].substring(0, 1));
tileore[c] = Integer.parseInt(tiledeck[c].substring(1, 2));
tilecapacity[c] = Integer.parseInt(tiledeck[c].substring(2, 3));
tiletype[c] = "planet";
tilemeeple[c] = 0;

tileicon = new ImageIcon(getClass().getResource("/" + tiledeck[c] + ".png"));
tilelabel[c] = new JLabel();
tilelabel[c].setIcon(tileicon);
tilelabel[c].setBounds(xloc, yloc, 115, 100);
add(tilelabel[c]);

yloc = yloc + 102;
row++;

if(row == rownum) {
xloc = xloc + 88;
row = 0;
col++;
if(col % 2 == 0) {
yloc = 61;
rownum = rownum - 1;
}
else {
yloc = 10;
rownum = rownum + 1;
}
}
}
}
}
private Object i(int numtiles2, int i) {
// TODO Auto-generated method stub
return null;
}


public static void main(String[] args) {
// TODO Auto-generated method stub
spacebattle2 board = new spacebattle2();
board.setSize(900, 600);
board.setResizable(false);
board.setTitle("Space Battle");
board.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
board.setVisible(true);
}//End void main

}

最佳答案

我建议重构程序以使用“tile”类来保存与给定图 block 相关的所有信息。拥有一个了解图 block 集合以及它们之间如何相互关联的“图 block 管理器”类也很有帮助。

对于您的程序来说,图 block 类可能如下所示。我试图不改变任何功能,只是重新组织事物。您应该能够将所有内容与您的原始程序相匹配。

class TileInfo {
TileManager manager;

public JLabel label = new JLabel();
public JLabel hexlabel = new JLabel();

int xloc;
int yloc;
int energy;
int ore;
int capacity;
String type;
String name;
int meeple;

String hexnum;
int hexxloc;
int hexyloc;
String hexempty;
// etc...

public TileInfo(Icon tileicon, int x, int y, TileManager manager) {
this.manager = manager;
label.setIcon(tileicon);
label.setBounds(x, y, 115, 100);
label.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
manager.clickedTile(TileInfo.this);
};
});
}
};

然后您可以为“空间”和“行星”图 block 扩展此基类:

class SpaceTile extends TileInfo {
public SpaceTile(Icon icon, int x, int y, TileManager manager) {
super(icon, x, y, manager);
energy = 0;
ore = 0;
capacity = 0;
type = "space";
name = "space";
}
};

class PlanetTile extends TileInfo {
public PlanetTile(Icon icon, int x, int y,
int energy, int ore, int capacity, TileManager manager) {
super(icon, x, y, manager);
this.energy = energy;
this.ore = ore;
this.capacity = capacity;
type = "planet";
meeple = 0;
}
};

在您的示例中,子类并不是严格必需的,但每种情况下的图 block 结构都略有不同,这有助于保持它们的直线性。

每个 TileInfo 创建自己的鼠标监听器,但将事件传递到图 block 管理器。磁贴管理器就像一个容器并保存数组:

class TileManager {
public int numtiles;
public TileInfo[] tile;
public String tiledeck[];

public TileManager(int numtiles) {
this.numtiles = numtiles;
this.tile = new TileInfo[numtiles];
this.tiledeck = new String[numtiles];
System.out.printf("TileManager(%d): tile[%d]\n", numtiles, numtiles);
}

public void clickedTile(TileInfo tile) {
if (tile instanceof SpaceTile) {
System.out.println("clicked space tile " + tile.label.getBounds());
} else if (tile instanceof PlanetTile) {
System.out.println("clicked planet tile " + tile.label.getBounds());
}
}
};

请注意,现在您只需要一个数组。如果您更喜欢的话,TileManager 可以覆盖 ArrayList;我想尽可能地坚持你原来的计划。 clickedTile() 方法处理图 block 上的鼠标点击,但由于它位于图 block 管理器中,因此它可以看到所有图 block ,而不仅仅是一个图 block 。例如,如果您想在单击图 block B 时取消选择图 block A,则需要能够看到这两个图 block 。

拥有单独的图 block 管理器并不是绝对必要的;您可以将此功能保留在 spacebattle2 类中。我喜欢有一个管理器类来将创建、操作和绘制图 block 组的功能与游戏玩法分开。它的行为有点像“图 block 库”。

最后,这一切如何适合您的主类。为了清楚起见,省略了大量代码。

public class spacebattle2 extends JFrame {
TileManager tiles = new TileManager(31);

// didn't change anything except tiledeck[] now lives inside tiles
// this method could be moved into the TileManager
private void shuffleDeck() {
for(int startIndex = 0; startIndex < tiles.numtiles; startIndex++) {
swapIndex = r.nextInt(tiles.numtiles);
if(swapIndex != startIndex) {
temp = tiles.tiledeck[swapIndex];
tiles.tiledeck[swapIndex] = tiles.tiledeck[startIndex];
tiles.tiledeck[startIndex] = temp;
}
}
}

void createTile(String deck, int xloc, int yloc) {
tileicon = new ImageIcon(getClass().getResource("/" + deck + ".png"));
if (deck.equals("000")) {
tiles.tile[c] = new SpaceTile(tileicon, xloc, yloc, tiles);
} else {
int energy = Integer.parseInt(deck.substring(0, 1));
int ore = Integer.parseInt(deck.substring(1, 2));
int capacity = Integer.parseInt(deck.substring(2, 3));
tiles.tile[c] = new PlanetTile(tileicon, xloc, yloc, 0, 0, 0, tiles);
}
add(tiles.tile[c].label);
}

private void drawBoard() {
/* ... */

for(int c = 0; c < tiles.numtiles; c ++) {
createTile(tiles.tiledeck[c], xloc, yloc);

yloc = yloc + 102;
row++;
if(row == rownum) {
xloc = xloc + 88;
row = 0;
col++;
if(col % 2 == 0) {
yloc = 61;
rownum = rownum - 1;
} else {
yloc = 10;
rownum = rownum + 1;
}
}
}
}
}

简化了drawBoard()中的循环;它有很多重复的代码,因此我将其排除在外,并添加了一个 createTile() 方法来创建两种类型的图 block 。

还有一些可以改进的地方。我不认为具有公共(public) TileInfo 变量的公共(public)数组是访问数据的理想方式,但不想对其进行太大更改,以致无法识别。

这并不是最终设计,而是建议一种组织代码的方法,使其更易于使用,并回答您有关如何将数据与图 block 关联的问题。

关于java - 我该如何用游戏计数器填充我的棋盘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55835150/

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