Найти броненосца


Это моя первая попытка что-нибудь в C#.

Он основан на линкоры, но есть только один игрок и только один корабль.

Игровой процесс очень прост: просто пытаться найти корабль... гадать, пока вы не нашли его.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FirstApplication
{
    class Battleship
    {
        public int shipPosition;
        public string board = "-------------\n| 1 | 2 | 3 |\n-------------\n| 4 | 5 | 6 |\n-------------\n| 7 | 8 | 9 |\n-------------";
        public bool shipIsHit = false;

        public void PositionShip()
        {
            Random randomNumber = new Random();
            shipPosition = randomNumber.Next(1, 10); // random number between 1 and 9
        }
        public void HitPosition(int hit)
        {
            if (hit == shipPosition)
            {
                board = board.Replace(hit.ToString(),"X");
                shipIsHit = true;
            }
            else
            {
                board = board.Replace(hit.ToString(), "-");
            }
        }  
    }
    class Program
    {
        static void Main(string[] args)
        {
            Battleship game = new Battleship();
            int guess;
            bool isInteger;

            game.PositionShip();

            Console.WriteLine("You are playing battleship... Try to find the ship!");

            do
            {
                Console.WriteLine("\n\nEnter a number between 1 and 9");
                Console.WriteLine("Board: \n{0}", game.board);

                isInteger = Int32.TryParse(Console.ReadLine(), out guess);

                if (isInteger && (guess >= 1 && guess <= 9))
                { 
                    game.HitPosition(guess);
                }
                else
                {
                    Console.WriteLine("That's not a valid number!");
                }

                if (!game.shipIsHit)
                {
                    Console.WriteLine("You missed!");
                }
            }
            while (!game.shipIsHit);

            Console.WriteLine("\n\nBoard: \n{0}", game.board);
            Console.WriteLine("BOOM! You found the battleship at position {0}", game.shipPosition);
            Console.ReadKey();
        }
    }
}

Я с нетерпением жду, добавляя больше функциональности, как я прогрессировать. Если у вас есть какие-либо предложения мне было бы интересно услышать их!



1007
7
задан 23 марта 2018 в 04:03 Источник Поделиться
Комментарии
1 ответ

Извините, ошиблись номером


  • Пеналы - это может быть добросовестное опечатка. И допустимый диапазон должен отображаться Вт/ сообщение об ошибке.

Редактировать

Это редактирование о перемещении функциональности Main() и в Battleship класс, где она принадлежит. Темы строгой инкапсуляции, используя игровую терминологию и единый принцип ответственности.


Battleship.Fire()

Battleship океан карта, так что имеет смысл, это должна быть одна проверка "в серии" выстрелы.

public string Fire(int shot) {
if(!InRange(shot) return string.Format("Shot is over-board. Grid range is {0} - {1}", game.lowLimit, game.highLimit);
if(!IsHit(shot) return "You missed!";
return "It's a hit!";
}


Battleship.InRange()

protected bool InRange(int shot) { 
return (shot >= lowLimit && shot <= highLimit);
}

// set in constructor, let's say
public int lowLimit {get, protected set};
public int highLimit { get, protected set} ;


protected bool IsHit(int shot) {
shipIsHit = shot == shipPosition;
return shipIsHit;
}


В do while петли:

 do
{
Console.WriteLine("\n\nEnter a number between {0} and {1}", game.lowLimt, game.highLimit);
Console.WriteLine("Board: \n{0}", game.board);

Console.WriteLine(game.Fire(Console.ReadLine()));

}
while (!game.shipIsHit);

Может Fire() должны вернуть то, что и как 'удар' Boolean и сообщение пользователя. Возможно out параметров будет достаточно. Мне очень не нравится, что водитель должен знать о внутреннем государственного имущества.

Внутренние Battleshipсоздать Board class чтобы обернуть все эти теряют питание-определенные свойства и дать им контекст.

Обратите внимание на изменения структуры

Код проще в целом! Fire() читает очень высоком уровне и это просто слишком мило! Это невидимая рука ОО программирования на работе.

конец редактирования


Теперь Что?

Где/что бы вы хотели развиваться? Не очень еще, чтобы сказать, без этого видения. Тем не менее, вот мои "первые мысли":

Нажмите против докатились

В do while должно заканчиваться корабль затонул. Это хорошее место, чтобы начать новый код, потому что он затрагивает суть государственного управления в игре. Получив базовые основы права глубоко влияет на всю код приложения и структуры. И "удар против просели" обязательно мотивирует структурные изменения объектов в игре. Мой непосредственный мысль-это сам корабль.

Стрельбы

Инкапсулировать генерации случайных чисел в метод, который раскрывает идею стрельбы из пистолета.

Я думаю, нет смысла конкретного обстрела корабля. Что может быть видно на самом деле, играя в "морской бой", но такого рода вещи должны быть явными.

Класс Корабля

Должны знать, сколько хитов он может взять, и сколько она принимала. Тот факт, что судно имеет 1 или 20 "хит-поинтов" не должны попадать в петли или где-нибудь еще. Судно может знать, где он находится в океане (каждый корабль имеет навигатор не так ли?) - так он может сказать, если его ударили.


Обратите внимание на изменения структуры кода

Вызовы метода и игровых объектов следует читать, как "мы играем в морской бой". В do while не буду спрашивать "что это за число?", но только "был корабль попал?"

Class Battleship начнете выглядеть и вести себя, как Игр драйвер - это является игрой. Main() будет сделать немного больше, чем начать игру.

Все, что выше старта желательно распаривание позволяя дальнейшей эволюции кода. Например Battlship класс не будет терять половину своей функциональности, потому что Main() имеет его. И огневые петли логика будет стабильным без того, чтобы иметь дело с деталями, которые содержатся в Ship класс - и все Fleet; больше классов, чтобы прийти ...!

4
ответ дан 23 марта 2018 в 09:03 Источник Поделиться