2017-03-28 18 views
-1

プログラムの再構成が必要です。クラスコンストラクタメソッドを使用する必要があります。それは戦艦のゲームです。どのクラスやコンストラクタやメソッドが必要なのかはあまり明確ではありません。プログラムをオブジェクト指向設計に変更する

import java.util.Scanner; 

public class BattleshipLab { 

    Scanner input = new Scanner(System.in); 
    public static final boolean DEBUG = false; 

    public static void breakln() { 
     System.out.println("_____________________________________"); 
     System.out.println(""); 
    } 

    public static void createBoard(String[][] board) { 
     for (String[] board1 : board) { 
      for (int c = 0; c < board[0].length; c++) { 
       board1[c] = "~"; 
      } 
     } 
    } 

    public static void showBoard(String[][] board) { 
     breakln(); 
     for (String[] board1 : board) { 
      if (DEBUG == true) { 
       for (int c = 0; c < board[0].length; c++) { 
        System.out.print(" " + board1[c]); 
       } 
       System.out.println(""); 
      } else { 
       for (int c = 0; c < board[0].length; c++) { 
        if (board1[c].equals("S")) { 
         System.out.print(" " + "~"); 
        } else { 
         System.out.print(" " + board1[c]); 
        } 
       } 
       System.out.println(""); 
      } 
     } 
     breakln(); 
    } 

    public static void createShip(String[][] board, int size) { 
     if (Math.random() < 0.5) { 
      int col = (int) (Math.random() * 5); 
      int row = (int) (Math.random() * 7); 
      for (int i = 0; i < size; i++) { 
       board[row][col + i] = "S"; 
      } 
     } else { 
      int col = (int) (Math.random() * 7); 
      int row = (int) (Math.random() * 5); 
      for (int i = 0; i < size; i++) { 
       board[row + i][col] = "S"; 
      } 
     } 
    } 

    public static int userFire(String[][] board, int hits, int torps) { 
     Scanner input = new Scanner(System.in); 
     int row, col; 
     System.out.println("You have: " + torps + " torpedos left!"); 
     System.out.println("Select a row to fire in: "); 
     row = input.nextInt(); 
     while (row > 8 || row < 1) // Error checking for row 
     { 
      System.out.println("Enter a valid row (1 -> 8)"); 
      row = input.nextInt(); 
     } 
     System.out.println("Select a column to fire in: "); 
     col = input.nextInt(); 
     while (col > 8 || col < 1) // Error checking for column 
     { 
      System.out.println("Enter a valid col (1 -> 8)"); 
      col = input.nextInt(); 
     } 
     if (board[row - 1][col - 1].equals("S")) { 
      hits++; 
      System.out.println("~~~~~~~ HIT ~~~~~~~"); 
      board[row - 1][col - 1] = "!"; 
     } else { 
      System.out.println("~~~~~~~ MISS ~~~~~~~"); 
      board[row - 1][col - 1] = "M"; 
     } 
     return hits; 
    } 

    public static void finall(int hits, int torps) { 
     if (hits < 4) { 
      System.out.println("Sorry, but you lost because you didn't sink the ship."); 
     } 
     if (torps < 1) { 
      System.out.println("You have lost all your torpedos"); 
     } else if (hits >= 4) { 
      System.out.println("You have beaten the game battleship, Thanks for playing!"); 
     } 
     System.out.println("Good game, well played!"); 
    } 

    public static void main(String[] arg) { 
     String[][] board = new String[8][8]; 
     createBoard(board); 
     createShip(board, 4); 
     int torps = 15; 
     int hits = 0; 
     /// Starting real stuff 
     while (torps > 0 && hits < 4) { 
      showBoard(board); 
      hits = userFire(board, hits, torps); 
      torps--; 
     } 
     finall(hits, torps); 
    } 
} 
+1

この種の質問はあまりにも広すぎて、SOに基づいた意見は、http://stackoverflow.com/help/how-to-askとhttps://stackoverflow.com/help/on-topicを参照してください。 – pvg

+0

コードの見直しについては、http://codereview.stackexchange.com/ –

+0

を参照してください。Noah、実際にpvgが提供するリンクを読むべきです。私はあなたに答えとして少しアドバイスをしますが、それはあなたの質問が非常に幅広くあるために保留になる可能性が高いという事実を変えるものではありません。クラスを作成した後の – domsson

答えて

1

ようこその新しいインスタンスを作成します!発言の

最初のカップル:

    質問のこの種は、通常、あなたがdownvotesとあなたの質問の閉鎖をを求め、および/または 広すぎるので、期待しているもの不明確と考えられている
  1. 。あなたは本当にhow to ask a good questionを読んでください。
  2. コードデザインに苦労している場合は、ペンと紙を借りて概要を草案するのが良い考えです。既存のプログラムをOOPに変換する具体的な作業のために、class diagramは本当に良い出発点になります。

今では道の外だと、私はあなたがオーバーフローをスタックに新しいしていることを見て、あなたは正しい方向へのノッチのビットを与えるでしょう。あなたのコードで

、我々は2つの興味深い方法を見つけることができます。

  • createBoard
  • createShip

お知らせを両者がcreateで始まりますか?これは、それはおそらく良いアイデアは、少なくともこれら二つのオブジェクトのクラスを記述するということは非常に、非常に強力なヒントです:

  • Board
  • Ship

それは方法に来るとき、あなたの現在コードは再び私たちにいくつかのポインタを与えます。私は魚雷の発射についてはわかりませんが、をBoardクラスのshowの方法に変えたいと思っているかのように見えます。

あなたが本当に必要とする他のクラスとメソッドは、そのゲームのルール(私はそれに精通していません)、あなたが望む機能、そしてもちろんそれをどのように実装したいのかによって異なります。可能な他のクラスはTorpedoですが、それらはおそらくあなたのShipクラスのプリミティブ型メンバーになるでしょう。もう1つの候補者は、のようなもので、Boardの基本ビルディングブロックですか?

あなたはここからそれを取らなければなりません。 Java Lessons on Classes and Objectsが便利です。
私はこれがあなたを始めることを望みます。

+0

ボードクラスの中。私はゲームボードを作成するために8行とコルンの配列を使用します。それはクラスの方法でしょうか? –

+0

ボードは一度だけ生成され、それ以降はサイズが変わらないと思いますか?その場合、コンストラクタはボードを作成するのに適しています。あなたは空想的で、ゲームには意味があるとすれば、ボードのサイズを引数として渡すことができます: 'public board(int size){/ *ボード配列を初期化する* /}' – domsson

+0

いいえ、変わらない。ですから、私はコンストラクタでボードを作成し、そのボードをメソッドで表示します。 –

0

OOPをやっているときは、コードを作成する前に問題を分析し、分解してください。どの部分がゲームを構成しているのか、その機能と属性は何か、これらの部分はどのように相互作用していますか?私はあなたが始めるのを助け、ボードと細胞のクラス作りを検討します。

あなたはJavaが好きですが、あなたが定義するオブジェクト(クラス)の新しいインスタンスを作成する必要があります。それでは、あなたがクラスを作成したとしましょう:

class Shape { 
     int length, width; 
     String color =""; 
    } 

がメインでシェイプを使用するには、あなたがそれ

スタックオーバーフロー、ノアに
class Driver { 
     public static void main (String [] args){ 
       //First you specify the type as your object name, then name the  variable and lastly, you do new object. 
       Shape myShape = new Shape(); 
     } 
    } 
+0

メインでどのように使用しますか? –

+0

@Noah上の私の編集したコメントを確認してください – Jerum

関連する問題