- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在这里收到一个空指针异常,我不确定为什么。
import cs251.lab2.GomokuGUI;
import cs251.lab2.GomokuModel;
public class Gomoku implements GomokuModel {
public Square[][] gameBoard;
public static void main(String[] args) {
Gomoku game = new Gomoku();
if (args.length > 0) {
game.setComputerPlayer(args[0]);
}
GomokuGUI.showGUI(game);//This calls newGame().
}
@Override
public void newGame() { //Generic constant values.
this.gameBoard = new Square[NUM_HSQUARES][NUM_VSQUARES];
// For every block
for (Square[] s : gameBoard)
// And every element of that block
for (Square ss : s)
// Reset to empty.
{ss = Square.EMPTY;}
}
@Override
public String boardString() {
String output = "";
//This is where the problem is!!
for (Square[] s : this.gameBoard) // For every block
{
//output appends either " ", "x" or "o" accordingly.
for (Square ss : s)//For every element of the block.
{output += ss.toChar();}
// Must be time for a new row already!
output += "\n";
}
//output should now be some big nasty string of love xoxo\n baby.
return output;
}
}
存在以下几行,并通过 GomokuGUI.class 调用
public static void showGUI(final GomokuModel model) {
// For thread safety, invoke GUI code on event-dispatching thread
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new GomokuGUI(model);
}
});
}
..........
private GomokuGUI ( GomokuModel gomokuModel ) {
model = gomokuModel;
model.newGame ( );
//Buncha GUI code...
}
如果我删除这个。引用我仍然收到错误。也许我误解了这个?我想通过在 newGame() 中创建大小,我创建了一个与这个游戏实例相关联的唯一对象 gameBoard,并且通过调用 game.gameBoard(这是函数内的 this.gameBoard)我可以查看它的元素。
package cs251.lab2;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/**
* This is the graphical user interface for the Gomoku game.
*/
public class GomokuGUI {
/**
* Class used to display the Gomoku game board
*/
private class BoardPanel extends JPanel {
/** Used to shut up the compiler */
private static final long serialVersionUID = 1L;
/**
* Draws the x's and o's on the game board in the right places.
* @param g Graphics context for the component
*/
public void drawBoard ( Graphics2D g ) {
// Read the string from the model so I know what to draw,
// convert to lowercase just in case.
String s = model.boardString().toLowerCase();
// Split board into rows
String[] rowStrings = s.split("\\n");
// Figure out number of rows and columns
int numRows = rowStrings.length;
int numCols = rowStrings[0].length();
// Use a somewhat wide pen based on size of box
int offset = SQUARE_SIZE / 5;
int x2offset = 2 * offset;
g.setStroke ( new BasicStroke ( offset ) );
// Draw the signs on the board (within the squares)
for ( int row = 0; row < numRows; row++ ) {
for ( int col = 0; col < numCols; col++ ) {
// Choose what to do depending on the character in the string I got
switch ( rowStrings[row].charAt(col) ) {
case 'o': // Draw a ring
g.setColor ( Color.BLUE );
g.drawOval ( col * SQUARE_SIZE + offset,
row * SQUARE_SIZE + offset,
SQUARE_SIZE - x2offset,
SQUARE_SIZE - x2offset );
break;
case 'x': // Draw an X
g.setColor ( Color.RED );
g.drawLine ( col * SQUARE_SIZE + offset,
row * SQUARE_SIZE + offset,
( col + 1 ) * SQUARE_SIZE - offset,
( row + 1 ) * SQUARE_SIZE - offset );
g.drawLine ( ( col + 1 ) * SQUARE_SIZE - offset,
row * SQUARE_SIZE + offset,
col * SQUARE_SIZE + offset,
( row + 1 ) * SQUARE_SIZE - offset );
break;
}
}
}
}
/**
* Mainly used to redraw the grid on the board, so that it's always there.
*/
@Override
public void paintComponent ( Graphics g ) {
g.setColor ( Color.BLACK );
int width = getWidth ( );
int height = getHeight ( );
for ( int row = 0; row <= GomokuModel.NUM_VSQUARES; row++ ) {
int line = row * SQUARE_SIZE;
// Draw the vertical lines
g.drawLine ( 0, line, width, line );
// Draw the horizontal lines
g.drawLine ( line, 0, line, height );
}
// Then draw the contents
drawBoard ( (Graphics2D) g );
}
}
/**
* Handles a mouse click on the board.
* @param x X position of the click
* @param y Y position of the click
*/
private void doMouseClick(int x, int y) {
int row = y / SQUARE_SIZE;
int col = x / SQUARE_SIZE;
boolean gameOver = true;
// Check current status and decide what to do
GomokuModel.Outcome outcome = model.doClick ( row, col );
// Better repaint so that the latest move shows up
boardFrame.repaint ( );
// If necessary present a dialog box
switch ( outcome ) {
case DRAW:
JOptionPane.showMessageDialog ( null, "Draw Game!", "Game Over",
JOptionPane.INFORMATION_MESSAGE );
break;
case CROSS_WINS:
JOptionPane.showMessageDialog ( null, "Cross Wins!", "Game Over",
JOptionPane.INFORMATION_MESSAGE );
break;
case RING_WINS:
JOptionPane.showMessageDialog ( null, "Ring Wins!", "Game Over",
JOptionPane.INFORMATION_MESSAGE );
break;
default:
// No action to take. Either game is over or someone clicked on the wrong spot.
gameOver = false;
break;
}
if ( gameOver ) {
// Question user about another game, and either quit or restart
int choice = JOptionPane.showConfirmDialog ( null, "Play again?", "Play again?",
JOptionPane.YES_NO_OPTION );
if ( choice == JOptionPane.NO_OPTION ) {
System.exit ( 0 );
} else {
model.newGame();
}
}
// Repaint after user choose a new game as otherwise we'll still see the old
// contents of the board, and that's no fun.
boardFrame.repaint();
}
/** Size in pixels of each square */
public static final int SQUARE_SIZE = 20;
/** Reference to the model class */
private final GomokuModel model;
/** Reference to my board */
private final JFrame boardFrame;
/**
* Constructor for the GUI.
* @param gomokuModel Reference to a model that correctly
* implements the interface, so that I know that all methods are
* there.
*/
private GomokuGUI ( GomokuModel gomokuModel ) {
model = gomokuModel;
model.newGame ( );
// Create the frame
boardFrame = new JFrame ( );
boardFrame.setTitle ( "Gomoku" );
// Create the board
BoardPanel boardPanel = new BoardPanel ( );
boardPanel.setPreferredSize ( new Dimension (
GomokuModel.NUM_HSQUARES * SQUARE_SIZE + 1,
GomokuModel.NUM_VSQUARES * SQUARE_SIZE + 1 ) );
boardPanel.addMouseListener ( new MouseAdapter() {
@Override
public void mouseClicked ( MouseEvent e ) {
int x = e.getX ( );
int y = e.getY ( );
doMouseClick(x, y);
}
});
// Create status panel for new game and quit buttons
JPanel statusPanel = new JPanel ( new FlowLayout ( ) );
statusPanel.setPreferredSize ( new Dimension (
GomokuModel.NUM_HSQUARES * SQUARE_SIZE, 50 ) );
// Create a new New Game Button
JButton newGameButton = new JButton ( "New Game" );
newGameButton.addActionListener ( new ActionListener ( ) {
public void actionPerformed ( ActionEvent e ) {
model.newGame ( );
boardFrame.repaint ( );
}
} );
statusPanel.add ( newGameButton );
// Create a nice quit button
JButton quitButton = new JButton ( "Quit" );
quitButton.addActionListener ( new ActionListener ( ) {
public void actionPerformed ( ActionEvent e ) {
System.exit ( 0 );
}
} );
statusPanel.add ( quitButton );
// Add the panels to the frame
boardFrame.add ( statusPanel, BorderLayout.NORTH );
boardFrame.add ( boardPanel, BorderLayout.CENTER );
// Make sure it looks good
boardFrame.pack ( );
boardFrame.setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE );
boardFrame.setLocationRelativeTo ( null );
boardFrame.setResizable ( false );
boardFrame.setVisible ( true );
}
/**
* Construct and display GUI for a Gomoku game
* @param model Reference to a model that correctly
* implements the interface, so that I know that all methods are
* there.
*/
public static void showGUI(final GomokuModel model) {
// For thread safety, invoke GUI code on event-dispatching thread
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new GomokuGUI(model);
}
});
}
}
最佳答案
// For every block
for (Square[] s : gameBoard)
for (Square ss : s)
// Reset to empty.
{ss = Square.EMPTY;}
这个循环什么都不做。它等同于:
// For every block
for (Square[] s : gameBoard) {
for(int i = 0; i < s.length; i++) {
Square ss;
ss = s[i];
ss = Square.EMPTY;
}
}
您可以看到,实际上并没有改变棋盘。
相反,这样做:
for(Square[] s : gameBoard)
for(int i = 0; i < s.length; i++)
s[i] = Square.EMPTY;
或者这个:(并导入 java.util.Arrays)
for(Square[] s : gameBoard)
Arrays.fill(s, Square.EMPTY);
关于java - 需要帮助在我的 Java 应用程序中查找 Nullpointer 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21819264/
我正在尝试用 C 语言编写一个使用 gstreamer 的 GTK+ 应用程序。 GTK+ 需要 gtk_main() 来执行。 gstreamer 需要 g_main_loop_run() 来执行。
我已经使用 apt-get 安装了 opencv。我得到了以下版本的opencv2,它工作正常: rover@rover_pi:/usr/lib/arm-linux-gnueabihf $ pytho
我有一个看起来像这样的 View 层次结构(基于其他答案和 Apple 的使用 UIScrollView 的高级 AutoLayout 指南): ScrollView 所需的2 个步骤是: 为 Scr
我尝试安装 udev。 udev 在 ./configure 期间给我一个错误 --exists: command not found configure: error: pkg-config and
我正在使用 SQLite 3。我有一个表,forums,有 150 行,还有一个表,posts,有大约 440 万行。每个帖子都属于一个论坛。 我想从每个论坛中选择最新帖子的时间戳。如果我使用 SEL
使用 go 和以下包: github.com/julienschmidt/httprouter github.com/shwoodard/jsonapi gopkg.in/mgo.v2/bson
The database仅包含 2 个表: 钱包(100 万行) 事务(1500 万行) CockroachDB 19.2.6 在 3 台 Ubuntu 机器上运行 每个 2vCPU 每个 8GB R
我很难理解为什么在下面的代码中直接调用 std::swap() 会导致编译错误,而使用 std::iter_swap 编译却没有任何错误. 来自 iter_swap() versus swap() -
我有一个非常简单的 SELECT *用 WHERE NOT EXISTS 查询条款。 SELECT * FROM "BMAN_TP3"."TT_SPLDR_55E63A28_59358" SELECT
我试图按部分组织我的 .css 文件,我需要从任何文件访问文件组中的任何类。在 Less 中,我可以毫无问题地创建一个包含所有文件导入的主文件,并且每个文件都导入主文件,但在 Sass 中,我收到一个
Microsoft.AspNet.SignalR.Redis 和 StackExchange.Redis.Extensions.Core 在同一个项目中使用。前者需要StackExchange.Red
这个问题在这里已经有了答案: Updating from Rails 4.0 to 4.1 gives sass-rails railties version conflicts (4 个答案) 关
我们有一些使用 Azure DevOps 发布管道部署到的现场服务器。我们已经使用这些发布管道几个月了,没有出现任何问题。今天,我们在下载该项目的工件时开始出现身份验证错误。 部署组中的节点显示在线,
Tip: instead of creating indexes here, run queries in your code – if you're missing any indexes, you
你能解释一下 Elm 下一个声明中的意思吗? (=>) = (,) 我在 Elm architecture tutorial 的例子中找到了它 最佳答案 这是中缀符号。实际上,这定义了一个函数 (=>
我需要一个 .NET 程序集查看器,它可以显示低级详细信息,例如元数据表内容等。 最佳答案 ildasm 是 IL 反汇编程序,具有低级托管元数据 token 信息。安装 Visual Studio
我有两个列表要在 Excel 中进行比较。这是一个很长的列表,我需要一个 excel 函数或 vba 代码来执行此操作。我已经没有想法了,因此转向你: **Old List** A
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想要改善这个问题吗?更新问题,以便将其作为on-topi
我正在学习 xml 和 xml 处理。我无法很好地理解命名空间的存在。 我了解到命名空间帮助我们在 xml 中分离相同命名的元素。我们不能通过具有相同名称的属性来区分元素吗?为什么命名空间很重要或需要
我搜索了 Azure 文档、各种社区论坛和 google,但没有找到关于需要在公司防火墙上打开哪些端口以允许 Azure 所有组件(blob、sql、compute、bus、publish)的简洁声明
我是一名优秀的程序员,十分优秀!