-7 / 22 / 4
Регистрация: 07.03.2013
Сообщений: 229
1

Морской бой

17.06.2013, 02:02. Показов 13758. Ответов 26

Author24 — интернет-сервис помощи студентам
Привет всем,
Читаю книгу Сьерра и Бейтса, уже на 150-ой где то странице они вбамбурили консольную игру под названием "морской бой" типа как для новичков что ли?
Я посмотрел и слегка так покрывшись потом принялся разбирать код.
Процентов 30% этой жути для меня так и осталось загадкой(может потому что разбираться дальше в дебрях хаоса не хватило сил, хотя моментами все было очень просто, а моментами тихий ужас, в итоге я закрыл книгу).
После этого "морского боя" для новичков, который не в конце книги был размещен, а уже на 150 странице, я усомнился стоит ли мне ее дальше читать, и усомнился стоит ли мне ВООБЩЕ что либо, связанное с джава программированием, читать

Скажите, это действительно является легкой программкой для новичков, и это просто я на столько безнадежный что не понял?
или она все таки сложновата и в том что я не смог ее реализовать у себя в текстпаде после 3-х раз прочтения кода нет ничего ужасного?


Разобрать ее это еще куда не шло, уж ладно, но реализовать по памяти добавив те знания по джаве которые недавним временем получил, мне не удалось

Собственно код:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
//import helpers.GameHelper;
import java.util.*;
 
public class DotComBust {
    private GameHelper helper = new GameHelper();
    private ArrayList<DotCom> dotComsList = new ArrayList<DotCom>();
    private int numOfGuesses = 0;
    //----------------------------------------------------------------
    private void setUpGame() {
        DotCom one = new DotCom();
        one.setName("Pets.com");
        DotCom two = new DotCom();
        two.setName("eToys.com");
        DotCom three = new DotCom();
        three.setName("Go2.com");
        dotComsList.add(one);
        dotComsList.add(two);
        dotComsList.add(three);
        
        System.out.println("Your goal is to sink three dot coms.");
        System.out.println("Pets.com, eToys.com, Go2.com");
        System.out.println("Try to sink them all in the fewest number of guesses");
        
        for (DotCom dotComSet : dotComsList) {
            ArrayList<String> newLocation = helper.placeDotCom(3);
            dotComSet.setLocationCells(newLocation);
        }
    }
 
    private void startPlaying() {
        while (!dotComsList.isEmpty()) {
            String userGuess = helper.getUserInput("Enter a guess");
            checkUserGuess(userGuess);
        }
        finishGame();
    }
    
    private void checkUserGuess(String userGuess)
    {
        numOfGuesses++;
        String result = "miss";
        
        for (DotCom dotComToTest : dotComsList)
        {
            result = dotComToTest.checkYourself(userGuess);
            if (result.equals("hit"))
            {
                break;
            }
            if (result.equals("kill"))
            {
                dotComsList.remove(dotComToTest);
                break;
            }
        }
        System.out.println(result);
    }
    
    private void finishGame() {
        System.out.println("All Dot Coms are dead!  Your stock is now worthless");
        if (numOfGuesses <= 18) {
            System.out.println("It only took you " + numOfGuesses + " guesses");
            System.out.println("You got out before your options sank.");
        }
        else
        {
            System.out.println("Took you long enough. " + numOfGuesses + " guesses.");
            System.out.println("Fish are dancing with your options.");
        }
    }
    
    public static void main(String[] args) {
        DotComBust game = new DotComBust();
        game.setUpGame();
        game.startPlaying();
    }
}

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import java.io.*;
import java.util.*;
 
public class GameHelper {
 
  private static final String alphabet = "abcdefg";
  private int gridLength = 7;
  private int gridSize = 49;
  private int [] grid = new int[gridSize];
  private int comCount = 0;
 
 
  public String getUserInput(String prompt) {
     String inputLine = null;
     System.out.print(prompt + "  ");
     try {
       BufferedReader is = new BufferedReader(
     new InputStreamReader(System.in));
       inputLine = is.readLine();
       if (inputLine.length() == 0 )  return null; 
     } catch (IOException e) {
       System.out.println("IOException: " + e);
     }
     return inputLine.toLowerCase();
  }
 
  
  
 public ArrayList<String> placeDotCom(int comSize) {                 // line 19
    ArrayList<String> alphaCells = new ArrayList<String>();
    String [] alphacoords = new String [comSize];      // holds 'f6' type coords
    String temp = null;                                // temporary String for concat
    int [] coords = new int[comSize];                  // current candidate coords
    int attempts = 0;                                  // current attempts counter
    boolean success = false;                           // flag = found a good location ?
    int location = 0;                                  // current starting location
    
    comCount++;                                        // nth dot com to place
    int incr = 1;                                      // set horizontal increment
    if ((comCount % 2) == 1) {                         // if odd dot com  (place vertically)
      incr = gridLength;                               // set vertical increment
    }
 
    while ( !success & attempts++ < 200 ) {             // main search loop  (32)
    location = (int) (Math.random() * gridSize);      // get random starting point
       // System.out.print(" try " + location);
    int x = 0;                                        // nth position in dotcom to place
        success = true;                                 // assume success
        while (success && x < comSize) {                // look for adjacent unused spots
          if (grid[location] == 0) {                    // if not already used
             coords[x++] = location;                    // save location
             location += incr;                          // try 'next' adjacent
             if (location >= gridSize){                 // out of bounds - 'bottom'
               success = false;                         // failure
             }
             if (x>0 & (location % gridLength == 0)) {  // out of bounds - right edge
               success = false;                         // failure
             }
          } else {                                      // found already used location
              // System.out.print(" used " + location);  
              success = false;                          // failure
          }
        }
    }                                                   // end while
 
    int x = 0;                                          // turn good location into alpha coords
    int row = 0;
    int column = 0;
    // System.out.println("\n");
    while (x < comSize) {
      grid[coords[x]] = 1;                              // mark master grid pts. as 'used'
      row = (int) (coords[x] / gridLength);             // get row value
      column = coords[x] % gridLength;                  // get numeric column value
      temp = String.valueOf(alphabet.charAt(column));   // convert to alpha
      
      alphaCells.add(temp.concat(Integer.toString(row)));
      x++;
 
      System.out.print("  coord "+x+" = " + alphaCells.get(x-1));
      
    }
    System.out.println("\n");
    
    return alphaCells;
   }
}

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import java.util.ArrayList;
 
public class DotCom {
    private ArrayList<String> locationCells;
    
    public void setLocationCells(ArrayList<String> loc)
    {
        locationCells = loc;
    }
    
    public String checkYourself(String userInput)
    {
        String result = "miss";
        int index = locationCells.indexOf(userInput);
        if (index >= 0) {
            locationCells.remove(index);
            if (locationCells.isEmpty()) {
                result = "kill";
            }
            else
            {
                result = "hit";
            }
        }
        return result;
    }
 
    //TODO:  all the following code was added and should have been included in the book
    private String name;
    public void setName(String string) {
        name = string;
    }
}

Извините за кучу писанины.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.06.2013, 02:02
Ответы с готовыми решениями:

Морской бой
Здравствуйте! Могли бы подсказать, пожалуйста! Пишу морской бой и возникла проблема, проверки...

Морской бой
Это программа про Морской бой. class Game главный класс. Не нравится компилятору 10 строчка или...

Морской бой
Всем привет! Могли бы Вы мне помочь, суть вопроса в следующем: Нужно частично реализовать игру...

Игра морской бой
Почему у меня не получается создать поле с рандомно расположенными кораблями? Задумка была такова,...

26
653 / 402 / 35
Регистрация: 19.02.2013
Сообщений: 1,072
Записей в блоге: 2
17.06.2013, 03:54 2
код смотреть лениво, но если очень хочется реализовать - пару недель назад на хабре было дофигища статей по сабжу
0
-7 / 22 / 4
Регистрация: 07.03.2013
Сообщений: 229
17.06.2013, 04:27  [ТС] 3
Да, вы видимо не читали о чем я писал.
Код в книге есть, он как бы для новичков, скопировать я скопировал, запустил - работает все прекрасно, разобрался в нем на 70 %, но что бы так взять, закрыть книгу, и начать писать ее с нуля не подглядывая - не получиться, слишком намудрили в некоторых местах.

Отсюда и вопрос, глядя на код, прокомментируйте как то уровень его сложности что ли, ЭТО Я НА СТОЛЬКО ДАЛЕКИЙ, ИЛИ ПРОГРАМКА НЕ СОВСЕМ ДЛЯ НАЧИНАЮЩИХ?
0
653 / 402 / 35
Регистрация: 19.02.2013
Сообщений: 1,072
Записей в блоге: 2
17.06.2013, 12:08 4
ну при беглом взгляде код не очень трудный но читабельность хромает. хотя скорее всего я просто отвык от реализации каких-то заумных математических алгоритмов)
0
-7 / 22 / 4
Регистрация: 07.03.2013
Сообщений: 229
18.06.2013, 03:18  [ТС] 5
все бы ничего еще, переходы, куча методов которые вызывают кучу методов, постные однообразные названия переменных, из за которых и путаешься местами.
НО, вот эта часть кода, просто шедевр, просто нобелевка плачет, все для новичков
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public ArrayList<String> placeDotCom(int comSize) {                 // line 19
    ArrayList<String> alphaCells = new ArrayList<String>();
    String [] alphacoords = new String [comSize];      // holds 'f6' type coords
    String temp = null;                                // temporary String for concat
    int [] coords = new int[comSize];                  // current candidate coords
    int attempts = 0;                                  // current attempts counter
    boolean success = false;                           // flag = found a good location ?
    int location = 0;                                  // current starting location
    comCount++;                                        // nth dot com to place
    int incr = 1;                                      // set horizontal increment
    if ((comCount % 2) == 1) {                         // if odd dot com  (place vertically)
      incr = gridLength;  }                             // set vertical increment
    while ( !success & attempts++ < 200 ) {             // main search loop  (32)
    location = (int) (Math.random() * gridSize);      // get random starting point
        System.out.print(" try " + location);
    int x = 0;                                        // nth position in dotcom to place
        success = true;                                 // assume success
        while (success && x < comSize) {                // look for adjacent unused spots
          if (grid[location] == 0) {                    // if not already used
             coords[x++] = location;                    // save location
             location += incr;                          // try 'next' adjacent
             if (location >= gridSize){                 // out of bounds - 'bottom'
               success = false;                         // failure
            }
             if (x>0 & (location % gridLength == 0)) {  // out of bounds - right edge
               success = false;                         // failure
             }
          } else {                                      // found already used location
              // System.out.print(" used " + location);  
              success = false;                          // failure
          }
        }
    }                                                   // end while
    int x = 0;                                          // turn good location into alpha coords
    int row = 0;
    int column = 0;
    // System.out.println("\n");
    while (x < comSize) {
      grid[coords[x]] = 1;                              // mark master grid pts. as 'used'
      row = (int) (coords[x] / gridLength);             // get row value
      column = coords[x] % gridLength;                  // get numeric column value
      temp = String.valueOf(alphabet.charAt(column));   // convert to alpha
      alphaCells.add(temp.concat(Integer.toString(row)));
      x++;
      System.out.print("  coord "+x+" = " + alphaCells.get(x-1));
  }
    System.out.println("\n");
    return alphaCells;
   }
0
653 / 402 / 35
Регистрация: 19.02.2013
Сообщений: 1,072
Записей в блоге: 2
18.06.2013, 06:22 6
наверно именно поэтому он на столько круто откоментирован)
0
77 / 33 / 9
Регистрация: 04.06.2013
Сообщений: 295
18.06.2013, 12:08 7
Также читаю эту книгу... Когда дошел до этого дела, то реализовал это все сам при том 2 версии (с 1 массивом и многомерным) но немного по другому... а так все работает могу скинуть исходы... При том они там используют свою библиотеку и заранее об этом говорят ! Вам нужно просто понять как работают те или иные аспекты данной темы , а остальное они сами уже представили....
0
-7 / 22 / 4
Регистрация: 07.03.2013
Сообщений: 229
18.06.2013, 12:29  [ТС] 8
самому и вправду будет намного проще написать код с нуля, чем по их шаблону питаться отобразить программно, и тем более питаться разобрать их код,
0
0 / 0 / 0
Регистрация: 19.06.2013
Сообщений: 2
19.06.2013, 10:37 9
Тоже читаю эту книгу)) Уже несколько дней пытаюсь сделать так, чтобы программа не учитывала многократные попадания в одну и ту же ячейку... Нифига не получается
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import java.io.*;
 
 
class SimpleDotCom {
    
    int[] locationCells;
    int numOfHits;
    
    
    public String checkYourself(String stringGuess) {
           
        int guess = Integer.parseInt(stringGuess);
        int[] playerHits = new int[3];
        playerHits[0] = -1;
        playerHits[1] = -1;
        
        String result = "Мимо";
     
          
        for (int cell : locationCells) {
            if (guess == cell & playerHits[0] == -1 & playerHits[1] == -1) {
                
                result = "Попал";
                playerHits[0] = cell;
                numOfHits++;
                
                
            } else {
                if (guess == cell & playerHits[0] != -1 & playerHits[1] == -1 & guess != playerHits[0] & guess != playerHits[1]) {
                    result = "Попал";
                    playerHits[1] = cell;
                    numOfHits++;
                    
                } 
        
            else {
                if(guess == cell & cell == playerHits[0] | cell == playerHits[1]){
                        result = "Палуба уже подбита";      
                }
                
                    }
                    }
        } 
    if (numOfHits == locationCells.length) {
            result = "Потопил";
    }
        System.out.println(result);
        System.out.println("Первый ход - " + playerHits[0]);
        System.out.println("Второй ход - " + playerHits[1]);
        System.out.println("");
        return result;
    }
    
    public void setLocationCells(int[] locations) {
        locationCells = locations; 
    }
}
 
 
 
public class Game {
    public static void main(String[] args) {
        int numOfGuesses = 0;
        GameHelper helper = new GameHelper();
        
        SimpleDotCom theDotCom = new SimpleDotCom();
        
        int randomNum = (int) (Math.random()* 5);
        
        int[] locations = {randomNum, randomNum+1, randomNum+2};
        theDotCom.setLocationCells(locations);
        boolean isAlive = true;
        
        while(isAlive == true) {
            String guess = helper.getUserInput("Введите число");
            
            String result = theDotCom.checkYourself(guess);
            numOfGuesses++;
            if(result.equals("Потопил")) {
                isAlive = false;
                System.out.println("Вам потребовалось " + numOfGuesses + " попыток(и)");
            }
        }
    }
}
 
class GameHelper {
 
  public String getUserInput(String prompt) {
     String inputLine = null;
     System.out.print(prompt + "  ");
     try {
       BufferedReader is = new BufferedReader(
     new InputStreamReader(System.in));
       inputLine = is.readLine();
       if (inputLine.length() == 0 )  return null; 
     } catch (IOException e) {
       System.out.println("IOException: " + e);
     }
     return inputLine;
  }
}
Это пока версия для одной строки. Попадания попытался записывать в отдельный массив и каждый раз проверять, содержится ли там уже этот ход. Но он пишет попадания постоянно в одну и ту же ячейку и не выводит результат "Мимо", если ход уже там содержится. Почему??)))
0
77 / 33 / 9
Регистрация: 04.06.2013
Сообщений: 295
19.06.2013, 11:44 10
Не знаю как вы там писали для 1 строки) Ну у меня для 1 строки в 2 раза меньше кода...
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package GameTest;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Random;
 
public class GameStart {
private String [] saytes = {"www.CyberForum.ru","www.Java.net",
                            "www.Oracle.com","www.Mail.ru"};
 
    public static void main(String[] args) throws IOException {
 
        GameStart game = new GameStart();
        game.start();
    
    }
 
    void start() throws IOException{
        int count = 0;
        int steps = 0;
        int random = new Random().nextInt(5);
        String out = null;
        int [] local = new int [3];
        local[0] = random;
        local[1] = ++random;
        local[2] = ++random;
        
        BufferedReader reader = new BufferedReader(
                new InputStreamReader(System.in));
        while(count < 3){
        System.out.println("Введите расположение сайта: ");
        out = reader.readLine();
        int temp = Integer.parseInt(out);
        for(int i = 0 ;i < local.length;i++){
            if(temp == local[i]){
                out = "Попали";
                count++;
                local[i] = -1;
                break;
            }
            else  out = "Промазали";
        }
        System.out.println(out);
        steps++;
    }
        random = new Random().nextInt(4);
        System.out.println("Вы потопили сайт: "+saytes[random] +" Число попыток: "+steps);
        
    }
    
}
Добавлено через 5 минут
И да насчет книги "Изучаем Java" кроссворды лучше пропускать или сразу смотреть ответы , так как не которые ответы просто бред) Помню пытался разгадать там слово ,так в ответе было слово значение которого я даже в гугле не нашел)
0
ɐwʎ ɔ vǝmоɔ dиw ɐʚонɔ
443 / 442 / 100
Регистрация: 14.10.2012
Сообщений: 1,146
Записей в блоге: 9
19.06.2013, 13:12 11
простите, но это 3.14-ц
Java
1
public ArrayList<String> placeDotCom(int comSize)
меня за возвращаемый тип отличный от List линейкой по рукам...
0
-7 / 22 / 4
Регистрация: 07.03.2013
Сообщений: 229
19.06.2013, 16:25  [ТС] 12
Цитата Сообщение от Care Посмотреть сообщение
И да насчет книги "Изучаем Java" кроссворды лучше пропускать или сразу смотреть ответы
а задачи в бассейне делаешь?
0
77 / 33 / 9
Регистрация: 04.06.2013
Сообщений: 295
19.06.2013, 16:31 13
Ага...
0
-7 / 22 / 4
Регистрация: 07.03.2013
Сообщений: 229
19.06.2013, 16:44  [ТС] 14
а я нет...
0
77 / 33 / 9
Регистрация: 04.06.2013
Сообщений: 295
19.06.2013, 16:46 15
Цитата Сообщение от Olllolll Посмотреть сообщение
а я нет...
Ну и зря)

Добавлено через 1 минуту
Olllolll, А сама книга как тебе?)
0
-7 / 22 / 4
Регистрация: 07.03.2013
Сообщений: 229
19.06.2013, 17:04  [ТС] 16
Цитата Сообщение от Care Посмотреть сообщение
А сама книга как тебе?)
моментами веселая
но они что то элементарное могут 3 страницы расписывать, а то что действительно важно либо мильком либо упустить вообще, а морской бой, хоть там и написано "напишите этот код и забудьте его до главы over999", но тоже вызвал бурю возмущений и нервный срыв на почве которого я повырывал все листы из той главы не смотря на то что книга была в электронном варианте.
Но книга действительно хорошая, буквально все на пальцах.
0
77 / 33 / 9
Регистрация: 04.06.2013
Сообщений: 295
19.06.2013, 17:09 17
Цитата Сообщение от Olllolll Посмотреть сообщение
моментами веселая
но они что то элементарное могут 3 страницы расписывать, а то что действительно важно либо мильком либо упустить вообще, а морской бой, хоть там и написано "напишите этот код и забудьте его до главы over999", но тоже вызвал бурю возмущений и нервный срыв на почве которого я повырывал все листы из той главы не смотря на то что книга была в электронном варианте.
Но книга действительно хорошая, буквально все на пальцах.
А ты попробуй почитать Шилда или Хорстмана или Философию в которой не понятно откуда примеры присабачили) Конечно книги эти хорошие , но только как справочник ИМХО)
0
-7 / 22 / 4
Регистрация: 07.03.2013
Сообщений: 229
19.06.2013, 17:38  [ТС] 18
Цитата Сообщение от Care Посмотреть сообщение
А ты попробуй почитать Шилда или Хорстмана или Философию в которой не понятно откуда примеры присабачили) Конечно книги эти хорошие , но только как справочник ИМХО)
не соглашусь с тобой,
Шилда начал читать до этой книги, он для понимания вполне адекватный, даже слишком.
Философию так же начал читать до этой, прочитал страниц 200, очень хорошая книга, хотя некоторые моменты, на то время, приходилось перечитывать по 2 раза
Ни ту ни другую до конца еще не прочитал естессна
возможно добью Сьерра и вернусь к ним
0
-7 / 22 / 4
Регистрация: 07.03.2013
Сообщений: 229
12.07.2013, 14:03  [ТС] 19
Цитата Сообщение от ElliotCoder Посмотреть сообщение
Есть пример морского боя попроще, без ООП и STL.
шедеврально, это уже практически с gui) жаль исходника нет, хотел бы посмотреть эту "войну и мир"
0
ɐwʎ ɔ vǝmоɔ dиw ɐʚонɔ
443 / 442 / 100
Регистрация: 14.10.2012
Сообщений: 1,146
Записей в блоге: 9
12.07.2013, 14:05 20
Цитата Сообщение от Olllolll Посмотреть сообщение
шедеврально, это уже практически с gui) жаль исходника нет, хотел бы посмотреть эту "войну и мир"
слово GitHub ничего не намекает?
https://github.com/ElliotCoder/SeafightCppConsole
0
12.07.2013, 14:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.07.2013, 14:05
Помогаю со студенческими работами здесь

Простой морской бой
Всем привет, помогите реализовать простенький морской бой. Морской бой Создать 2 двумерных...

Морской бой UTF8 смещение
Всем добра, пишу морской бой, хочу побаловаться с консолью пустые клетки вывожу квадратами, но вот...

Примитивнейшая игра морской бой
public class SimpleDotComGame { public static void main(String args) throws IOException { ...

Игра через сервер в морской бой
Игра по сети в «Морской бой». Игроки играют в игру, передавая координаты через сервер.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru