- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为我正在上的高中类(class)制作/创建一个基于 Java 的游戏,但我不知道它的逻辑。
我想做的目标是制作一个游戏,在 JPanel 上的 24x24 网格中随机生成一个“地形”方 block (因为我发现这是最常见的绘制对象),所有这些都靠它自己无需外部(用户)帮助。
我正在通过“for”循环尝试此操作,该循环将采用“coords[][]”并用值标记某个“虚构”位置,例如:floor。
但是当我运行它时,它所做的只是在 0,0 处绘制第一个 20x20 正方形。
现在我听说/读到 Java 内部没有像 Small Basic 那样的“多维”数组。但我不明白数组中的数组具体是做什么的。对于这方面的一些解释将不胜感激。
此外,任何可以使我的程序变得更容易/更流畅的替代建议将非常感激,因为我目前是一名新手程序员。
我在这些帖子中寻找问题的解决方案,但没有成功。
how to create dynamic two dimensional array in java?
How to insert values in two dimensional array programmaticaly?
how to automatically populate a 2d array with numbers
How to fill a two Dimensional ArrayList in java with Integers?
ArrayList.toArray() method in Java
How can I dynamically add items to a Java array?
Automatic adding of elements to an array
这是应该为我执行此操作但当前失败的代码块:
class gamePanel extends JPanel
{
public gamePanel()
{
setBounds(115,93,480,480);
setBackground(Color.white);
}
private Random generator = new Random();
int floor = 0; //initializes the variable floor to zero for later use
int dirt = 1;
int stone = 2;
int water = 3;
int lava = 4;
int iron = 5;
int gold = 6;
int emerald = 7;
int diamond = 8;
int bedrock = 9;
int width = 24;
int height = 24;
int x, y; // my x & y variables for coordinates
int[][] coords = new int[width][height]; //my array that I want to store the coordinates for later use in painting
int[] terrain = {floor, dirt, stone, water, lava, iron,
gold, emerald, diamond, bedrock}; //my terrain that will determine the color of the paint
public void mapGen() //what should mark/generate the JPanel
{
for(x = 0; x <= width; x++)
{
for(y = 0; y <= height; y++)
{
int z = generator.nextInt(20);// part of the randomization
if(z <= 11)
{
coords[x][y] = terrain[0]; //marks the coordinates as floor
}
else{};
}
}
coords[0][0] = terrain[0]; // sets coordinate 0,0 to floor //need to have these always be floor
coords[24][24] = terrain[0]; // sets coordinate 24,24 to floor //^^^^^^^^^^
}
@Override
public void paintComponent(Graphics g)//what will paint each 20x20 square on the grid what it is assigned
{
super.paintComponent(g);
if(coords[x][y] == terrain[floor])
{
g.setColor(new Color(46,46,46));
g.fillRect((x*20),(y*20),20,20);
}
else{};
}
}//end gamePanel
任何在 Java 编程中不被视为“基本”的术语/代码,如果在响应中得到解释,我们将不胜感激。
请在回复中尽可能详细和具体,因为我仍在学习 Java 及其工作原理。
<小时/>编辑
所以这段代码在某种程度上可以工作,但它没有完成它应该做的事情。
这个程序(至少部分)应该工作的方式是,随着循环的进行,每个单独的 20x20 方 block 都被标记为由“coords[x][y]”表示的特定坐标的特定地形
然后,在标记了坐标之后,它应该返回并分别为“paintComponent”中分配的“地形”绘制每个坐标
在执行此操作时,程序应该创建一个 map 供玩家通过。
相反,它的作用是仅用“terrain[dirt]”覆盖整个 JPanel,而没有其他内容
这是该程序的工作模型及其问题:
import java.awt.*;
import javax.swing.*;
import java.util.*;
public class gamePanel extends JPanel
{
public gamePanel()
{
setBounds(115,93,480,480);
setBackground(Color.white);
}
private Random generator = new Random();
int floor = 0; //initializes the variable floor to zero for later use
int dirt = 1;
int stone = 2;
int water = 3;
int width = 24;
int height = 24;
int x, y; // my x & y variables for coordinates
int[][] coords = new int[width][height]; //my array that I want to store the coordinates for later use in painting
int[] terrain = {floor, dirt, stone, water}; //my terrain that will determine the color of the paint
public void mapGen() //what should mark/generate the JPanel
{
for(x = 0; x <= width; x++)
{
for(y = 0; y <= height; y++)
{
int z = generator.nextInt(20);// part of the randomization
if(z <= 11)
{
coords[x][y] = terrain[0]; //should mark the coordinates as floor
}
if(z == 12)
{
coords[x][y] = terrain[3];//should mark the coordinates as water
}
if(z >= 13 && z <= 17)
{
coords[x][y] = terrain[2];//should mark the coordinates as stone
}
if(z >= 18 && z <= 20)
{
coords[x][y] = terrain[1];//should mark the coordinates as dirt
}
coords[0][0] = terrain[0]; // sets coordinate 0,0 to floor //need to have these always be floor
coords[24][24] = terrain[0]; // sets coordinate 24,24 to floor //^^^^^^^^^^
}
}
}
@Override
public void paintComponent(Graphics g)//what will paint each 20x20 square on the grid what it is assigned
{
super.paintComponent(g);
for(int x = 0; x < width; x++)
{
for(int y = 0; y < height; y++)
{
if(coords[x][y] == terrain[floor])//should paint the floor color at marked coordinates
{
g.setColor(new Color(46,46,46));
g.fillRect((x*20), (y*20), 20, 20);
}
if(coords[x][y] == terrain[dirt]);//should paint the dirt color at marked coordinates
{
g.setColor(new Color(135,102,31));
g.fillRect((x*20), (y*20), 20, 20);
}
if(coords[x][y] == terrain[stone])//should paint the stone color at marked coordinates
{
g.setColor(new Color(196,196,196));
g.fillRect((x*20),(y*20),20,20);
}
if(coords[x][y] == terrain[water])//should paint the water color at marked coordinates
{
g.setColor(new Color(85,199,237));
g.fillRect((x*20),(y*20),20,20);
}
}
}
}//end paintComponent
public static void main(String[] args)
{
gamePanel panel = new gamePanel();
JFrame frame = new JFrame();
frame.setSize(480,480);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(panel);
frame.setVisible(true);
}//end main
}// end gamePanel
最佳答案
两个要点:
paintComponent
被调用时,您需要重新绘制整个组件状态x
和y
不要改变你的paintComponent
,它们与 mapGen
后的值相同被称为相反,您的绘制方法可能看起来更像......
@Override
protected void paintComponent(Graphics g)//what will paint each 20x20 square on the grid what it is assigned
{
super.paintComponent(g);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
if (coords[x][y] == terrain[floor]) {
g.setColor(new Color(46, 46, 46));
g.fillRect((x * 20), (y * 20), 20, 20);
} else ... {
//...
}
}
}
}
参见Painting in AWT and Swing和 Performing Custom Painting了解更多详情
就个人而言,在 mapGen
,我会创建一个 BufferedImage
这是24*20
宽和24*20
高,将所有瓷砖涂在上面和 paintComponent
中方法,绘制图像
mapGen
从未被调用,因此 coord
中的值总是0
或`地板for (x = 0; x <= width; x++) {
和for (y = 0; y <= height; y++) {
将导致IndexOutOfBoundsException
因为数组是从零开始的 ( 0-23
)coords[24][24] = terrain[0];
将导致IndexOutOfBoundsException
出于与上述相同的原因。一旦更正,代码可以生成类似...的内容
关于java - 多维数组java的行和列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36852964/
猫f1.txt阿曼维沙尔阿杰贾伊维杰拉胡尔曼尼什肖比特批评塔夫林现在输出应该符合上面给定的条件 最佳答案 您可以在文件读取循环中设置一个计数器并打印它, 计数=0 读取行时做 让我们数一数++ if
我正在尝试查找文件 1 和文件 2 中的共同行。如果公共(public)行存在,我想写入文件 2 中的行,否则打印文件 1 中的非公共(public)行。fin1 和 fin2 是这里的文件句柄。它读
我有这个 SQL 脚本: CREATE TABLE `table_1` ( `IDTable_1` int(11) NOT NULL, PRIMARY KEY (`IDTable_1`) );
我有 512 行要插入到数据库中。我想知道提交多个插入内容是否比提交一个大插入内容有任何优势。例如 1x 512 行插入 -- INSERT INTO mydb.mytable (id, phonen
如何从用户中选择user_id,SUB(row, row - 1),其中user_id=@userid我的表用户,id 为 1、3、4、10、11、23...(不是++) --id---------u
我曾尝试四处寻找解决此问题的最佳方法,但我找不到此类问题的任何先前示例。 我正在构建一个基于超本地化的互联网购物中心,该区域分为大约 3000 个区域。每个区域包含大约 300 个项目。它们是相似的项
preg_match('|phpVersion = (.*)\n|',$wampConfFileContents,$result); $phpVersion = str_replace('"','',
我正在尝试创建一个正则表达式,使用“搜索并替换全部”删除 200 个 txt 文件的第一行和最后 10 行 我尝试 (\s*^(\h*\S.*)){10} 删除包含的前 10 行空白,但效果不佳。 最
下面的代码从数据库中获取我需要的信息,但没有打印出所有信息。首先,我知道它从表中获取了所有正确的信息,因为我已经在 sql Developer 中尝试过查询。 public static void m
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我试图在两个表中插入记录,但出现异常。您能帮我解决这个问题吗? 首先我尝试了下面的代码。 await _testRepository.InsertAsync(test); await _xyzRepo
这个基本的 bootstrap CSS 显示 1 行 4 列: Text Text Text
如果我想从表中检索前 10 行,我将使用以下代码: SELECT * FROM Persons LIMIT 10 我想知道的是如何检索前 10 个结果之后的 10 个结果。 如果我在下面执行这段代码,
今天我开始使用 JexcelApi 并遇到了这个:当您尝试从特定位置获取元素时,不是像您通常期望的那样使用sheet.getCell(row,col),而是使用sheet.getCell(col,ro
我正在尝试在我的网站上开发一个用户个人资料系统,其中包含用户之前发布的 3 个帖子。我可以让它选择前 3 条记录,但它只会显示其中一条。我是不是因为凌晨 2 点就想编码而变得愚蠢? query($q)
我在互联网上寻找答案,但找不到任何答案。 (我可能问错了?)我有一个看起来像这样的表: 我一直在使用查询: SELECT title, date, SUM(money) FROM payments W
我有以下查询,我想从数据库中获取 100 个项目,但 host_id 多次出现在 urls 表中,我想每个 host_id 从该表中最多获取 10 个唯一行。 select * from urls j
我的数据库表中有超过 500 行具有特定日期。 查询特定日期的行。 select * from msgtable where cdate='18/07/2012' 这将返回 500 行。 如何逐行查询
我想使用 sed 从某一行开始打印 n 行、跳过 n 行、打印 n 行等,直到文本文件结束。例如在第 4 行声明,打印 5-9,跳过 10-14,打印 15-19 等 来自文件 1 2 3 4 5 6
我目前正在执行验证过程来检查用户的旧密码,但问题是我无法理解为什么我的查询返回零行,而预期它有 1 行。另一件事是,即使我不将密码文本转换为 md5,哈希密码仍然得到正确的答案,但我不知道为什么会发生
我是一名优秀的程序员,十分优秀!