2016-10-29 6 views
1

Mein Code nur Drucke genannt:C# Constructor nicht

welcome to battleship 

aber das Schiff koordiniert oder Schiff erstellt und sogar das Ende „Drücken Sie eine beliebige Taste, um zu beenden“ nicht gedruckt wird.

Mein Verdacht geht an den Konstruktor, sieht aus wie sein nicht genannt, aber warum mein Programm zählt und nicht abstürzt?

Im Ausführen des Codes auf einem Mac mit Xamarin Studio.

Code:

using System; 
using System.Collections.Generic; 

namespace battleship 
{ 
    class MainClass 
    { 
     public static void Main(string[] args) 
     { 
      Console.WriteLine("welcome to battleship"); 

      EnumShipClassification.ShipClassification cruiser = EnumShipClassification.ShipClassification.theCruiser; 
      Coordinate startCoordinate = new Coordinate(5, 5); 
      EnumDirection.Direction direction = EnumDirection.Direction.west; 

      Ship ship = new Ship(cruiser, startCoordinate, direction); 
      Console.WriteLine("ship created"); // @debug 
      Console.WriteLine("all coords: " + ship.coordinates); 

      //@end 
      Console.WriteLine("Press any key to exit."); 
      Console.ReadLine(); 
     } 
    } 

    public class Ship 
    { 
     public int size; // values from wikipedia 
     public int amount; // values from wikipedia 
     public List<Coordinate> coordinates = new List<Coordinate>(); 

     public EnumShipClassification.ShipClassification classification; 
     public Ship(EnumShipClassification.ShipClassification classification, Coordinate startCoordinate, EnumDirection.Direction toDirection) 
     { 
      Console.WriteLine("Ship Constructor called "); // @debug 
      this.classification = classification; 
      Console.WriteLine("classification added"); // @debug 

      switch (classification) 
      { 
       case EnumShipClassification.ShipClassification.theBattleship: size = 5; amount = 1; break; 
       case EnumShipClassification.ShipClassification.theCruiser: size = 4; amount = 2; break; 
       case EnumShipClassification.ShipClassification.theDestroyer: size = 3; amount = 3; break; 
       case EnumShipClassification.ShipClassification.theSubmarine: size = 2; amount = 4; break; 
       default: break; 
      } 

      Console.WriteLine("switch ended with size {0} and amout {1}", size, amount); 

      for (int i = 0; i < size; i++) 
      { 
       coordinates.Add(startCoordinate.advancedBy(i, toDirection)); 
       Console.WriteLine("i is: " + i); // @debug 
      } 
     } 
    } 

public class EnumDirection 
{ 
    public enum Direction 
    { 
     north, south, east, west // + all (Direction[] array with content [.n, .s, .e, .w] 
    } 

    public Direction[] all = { Direction.north, Direction.south, Direction.east, Direction.west }; 
} 

    public class EnumShipClassification 
    { 
     public enum ShipClassification // numbers: BoatSize 
     { 
      theBattleship = 5, theCruiser = 4, theDestroyer = 3, theSubmarine = 2 
     } 
    } 


public class Coordinate 
    { 
     public int row; 
     public int column; 

     private int fieldSize = 10; 

     public void init() 
     { 
      row = 0; 
      column = 0; 
     } 

     public Coordinate invalid = new Coordinate(-1, -1); 

     public Coordinate(int row, int column) 
     { 
      this.row = row; 
      this.column = column; 
     } 

     public Coordinate getRandomCoordinate(int betweenX, int Y) 
     { 
      Random r = new Random(fieldSize); 
      return new Coordinate(r.Next(), r.Next()); 
     } 

     public Coordinate neighbor(EnumDirection.Direction inDirection) 
     { 
      return advancedBy(1, inDirection: inDirection); 
     } 

     public Coordinate advancedBy(int displacement, EnumDirection.Direction inDirection) 
     { 
      switch (inDirection) 
      { 
       case EnumDirection.Direction.north: return new Coordinate(column: column, row: row + displacement); 
       case EnumDirection.Direction.south: return new Coordinate(column: column, row: row - displacement); 
       case EnumDirection.Direction.east: return new Coordinate(column: column + displacement, row: row); 
       case EnumDirection.Direction.west: return new Coordinate(column: column - displacement, row: row); 

       default: break; // never happens 
      } 
      return null; // never happens 
     } 

     public string description 
     { 
      get 
      { 
       return "column: " + column + ", row: " + row; 
      } 
     } 

     public override bool Equals(object obj) 
     { 
      if (ReferenceEquals(null, obj)) return false; 
      if (ReferenceEquals(this, obj)) return true; 

      try 
      { 
       Coordinate _obj = (Coordinate)obj; 
       return _obj.row == this.row && _obj.column == this.column; 
      } 
      catch 
      { 
       return false; 
      } 
     } 

     public override int GetHashCode() 
     { 
      return 1; // TODO: return a real value 
     } 

     public static bool operator ==(Coordinate lhs, Coordinate rhs) 
     { 
      return lhs.row == rhs.row && lhs.column == rhs.column; 
     } 

     public static bool operator !=(Coordinate lhs, Coordinate rhs) 
     { 
      return lhs.row != rhs.row && lhs.column != rhs.column; 
     } 
    } 
+2

Sie haben hier eine Menge Code geschrieben - aber nicht genug, um das Problem reproduzieren zu können. Bitte reduziere dies auf [mcve]. Darüber hinaus wäre jetzt ein guter Zeitpunkt, den .NET-Namenskonventionen zu folgen. –

Antwort

2

ändern

public Coordinate invalid = new Coordinate(-1, -1); 

Um

public static Coordinate invalid = new Coordinate(-1, -1); 

public Coordinate invalid = new Coordinate(-1, -1); Ursachen Überlauf stapeln. Das liegt daran, dass die neue Koordinate innerhalb der Koordinatenklasse initialisiert wurde, sodass jedes Mal eine neue Koordinate erstellt werden muss. Machen Sie das Feld statisch, so dass es einmal erstellt wird und für alle Instanzen verwendet werden kann.

Sie können auch das Schlüsselwort readyonly hinzufügen, wenn sich die Referenz nicht ändern soll.

public readonly static Coordinate invalid = new Coordinate(-1, -1); 
+0

es funktionierte, ich schaute Stunden auf den Ship Code und Sie fanden es so schnell (es ist eines meiner ersten Projekte in C#) –

+1

Debugger verwenden. es wird Ihnen helfen, das Problem schneller zu finden. Visual Studio Community statt Xamarin Studio. und lesen Sie Tutorials, wie Sie Ihren Code debuggen können. @MikeVarelas –