2017-06-08 20 views
-1

私は掃海艇プログラムに取り組んでいます。私は、プレーヤーが爆弾をクリックした後、ボード全体を公開するのに少し助けてください。ここでは、コードです:プレイヤーが失ったときにすべてのタイルの内容が明らかにされるように、それをしようとして掃海掲示板の掲示板

package narkalieutis; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.Optional; 
import javafx.scene.control.MenuBar; 
import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.scene.control.Alert; 
import javafx.scene.control.Alert.AlertType; 
import javafx.scene.control.ButtonType; 
import javafx.scene.control.Menu; 
import javafx.scene.control.MenuItem; 
import javafx.scene.layout.Pane; 
import javafx.scene.layout.StackPane; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Rectangle; 
import javafx.scene.text.Font; 
import javafx.scene.text.Text; 
import javafx.stage.Stage; 
import javafx.scene.layout.VBox; 

public class Narkalieutis extends Application { 

private int TILE_SIZE = 50; 
private static final int W = 500; 
private static final int H = 500; 

private int X_TILES = W/TILE_SIZE; 
private int Y_TILES = H/TILE_SIZE; 
private final String[] gameType = {"Easy", "Medium", "Hard", "Very Hard"}; 
private String difficulty; 

@FXML 
private Menu gameMenu; 

private Tile[][] grid = new Tile[X_TILES][Y_TILES]; 
private Scene scene; 

public MenuBar menu() { 
    gameMenu = new Menu("Difficulty"); 
    for(String game : gameType){ 
     MenuItem menuItem = new MenuItem(game); 
     menuItem.setUserData(game); 
     menuItem.setOnAction((ActionEvent event) -> { 
      selectGame(event); 
     }); 
     gameMenu.getItems().add(menuItem); 
    } 
    MenuBar menuBar = new MenuBar(gameMenu); 
    return menuBar; 
} 

private void selectGame(ActionEvent event) { 
    MenuItem menuItem = (MenuItem)event.getSource(); 
    difficulty = (String)menuItem.getUserData(); 
    switch (difficulty) { 
     case "Easy": 
      TILE_SIZE = 2*TILE_SIZE; 
      break; 
     case "Medium": 
      TILE_SIZE = 100; 
      break; 
     case "Hard": 
      TILE_SIZE = 50; 
      break; 
     case "Very Hard": 
      TILE_SIZE = 40; 
      break; 
     default: 
      break; 
    } 
} 

private Parent createContent() { 
    VBox root = new VBox(); 
    Pane content = new Pane(); 
    content.setPrefSize(W, H); 

    for (int y = 0; y < Y_TILES; y++) { 
     for (int x = 0; x < X_TILES; x++) { 
      Tile tile = new Tile(x, y, Math.random() < 0.2); 

      grid[x][y] = tile; 
      content.getChildren().add(tile); 
     } 
    } 

    for (int y = 0; y < Y_TILES; y++) { 
     for (int x = 0; x < X_TILES; x++) { 
      Tile tile = grid[x][y]; 

      if (tile.hasBomb) 
       continue; 

      long bombs = getNeighbors(tile).stream().filter(t ->  t.hasBomb).count(); 

      if (bombs > 0) 
       tile.text.setText(String.valueOf(bombs)); 
     } 
    } 
    root.getChildren().addAll(menu(), content); 

    return root; 
} 

private List<Tile> getNeighbors(Tile tile) { 
    List<Tile> neighbors = new ArrayList<>(); 

    int[] points = new int[] { 
      -1, -1, 
      -1, 0, 
      -1, 1, 
      0, -1, 
      0, 1, 
      1, -1, 
      1, 0, 
      1, 1 
    }; 

    for (int i = 0; i < points.length; i++) { 
     int dx = points[i]; 
     int dy = points[++i]; 

     int newX = tile.x + dx; 
     int newY = tile.y + dy; 

     if (newX >= 0 && newX < X_TILES 
       && newY >= 0 && newY < Y_TILES) { 
      neighbors.add(grid[newX][newY]); 
     } 
    } 

    return neighbors; 
} 

private class Tile extends StackPane { 
    private int x, y; 
    private boolean hasBomb; 
    private boolean isOpen = false; 

    private Rectangle board = new Rectangle(TILE_SIZE - 2, TILE_SIZE - 2); 
    private Text text = new Text(); 

    Alert alert = new Alert(AlertType.CONFIRMATION); 

    public Tile(int x, int y, boolean hasBomb) { 
     this.x = x; 
     this.y = y; 
     this.hasBomb = hasBomb; 

     board.setStroke(Color.LIGHTGRAY); 

     text.setFont(Font.font(18)); 
     text.setText(hasBomb ? "X" : ""); 
     text.setVisible(false); 

     getChildren().addAll(board, text); 

     setTranslateX(x * TILE_SIZE); 
     setTranslateY(y * TILE_SIZE); 

     setOnMouseClicked(e -> open()); 
    } 

    public void open() { 
     if (isOpen) 
      return; 

     if (hasBomb) { 
    board.setVisible(true); 
     Optional<ButtonType> result = alert.showAndWait(); 
      if (result.isPresent() && result.get() == ButtonType.OK) { 
       scene.setRoot(createContent()); 
      } 
      return; 
     } 

     isOpen = true; 
     text.setVisible(true); 
     board.setFill(null); 

     if (text.getText().isEmpty()) { 
      getNeighbors(this).forEach(Tile::open); 
     } 

     switch (text.getText()) { 
      case "1": 
       text.setFill(Color.BLUE); 
       break; 
      case "2": 
       text.setFill(Color.FORESTGREEN); 
       break; 
      case "3": 
       text.setFill(Color.RED); 
       break; 
      case "4": 
       text.setFill(Color.DARKBLUE); 
       break; 
      case "5": 
       text.setFill(Color.MAROON); 
       break; 
      case "6": 
       text.setFill(Color.AQUAMARINE); 
       break; 
      case "7": 
       text.setFill(Color.BLACK); 
       break; 
      case "8": 
       text.setFill(Color.GRAY); 
       break; 
      default: 
       break; 
     } 
    } 
} 

@Override 
public void start(Stage stage) throws Exception { 
    scene = new Scene(createContent()); 

    stage.setScene(scene); 
    stage.show();  
} 

public static void main(String[] args) { 
    launch(args); 
    } 
} 

イム。

答えて

0

あなたはあなたがどんな問題を抱えているのかを正確には説明していません。あなたがすでに達成したことに基づいて、それはすべてのタイルを明らかにする能力の範囲内にあるはずです。

createContent()では、すでにボード全体をカバーするforループとxループとyループがあります。この場合、彼らはタイルの値を設定します。

同じことを行うだけで、タイル値を設定するのではなく、単にタイルを表示するだけです。私はこれが灰色のタイルをその内部にあるものを表すアイコンに置き換えると想像します。

関連する問題