Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> почти готовый морской бой. покритикуйте код плиз. почти готовый морской бой. покритикуйте  
:(
    Опции темы
isalex678
Дата 6.10.2011, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 6.10.2011

Репутация: нет
Всего: нет




Морской бой
1. код разделён на два пакета logic и swing
2. правильно ли я манипулирую данными: получаю, передаю, изменяю. ?
3. не работает пока ИИ (класс Robot) и завершение игры

user posted image

архив одним фалом: http://narod.ru/disk/27487072001/SeaBattle.zip.html

жду критики во всех отношениях
правильно организовал MVC. итп...

=== ЛОГИКА ===

Код

package ru.semikov.sea.logic;

public enum ElementStates {
    enEmpty, enWater, enBorder, enWell, enInjured, enKilled, enMissed
}


Код

package ru.semikov.sea.logic;

public class Element {
    public ElementStates state;
    public Ship ship;
    public boolean shuted;
    public int x, y;
    
    
    public Element(int x, int y) {
        this.state=ElementStates.enWater;
        this.shuted = false;
        this.x = x;
        this.y = y;
    }
}


Код

package ru.semikov.sea.logic;

public enum ShipStates {
    enWell, enInjured, enKilled
}



Код

package ru.semikov.sea.logic;

import java.util.ArrayList;
import java.util.Random;


public class Ship {
    public int x, y;
    private int dx, dy;
    public int size;
    public int health;
    public ShipStates state;
    public FieldShip field;
    public ArrayList<Element> elements;
    
    /**
     * создание коробля
     * @param size - количество палуб
     */
    public Ship(FieldShip field, int size) {
        this.size = size;
        this.health = size;
        this.field = field;
        this.state = ShipStates.enWell;
        
        do {
            this.GetPlace();
        } while (!this.CheckPlace());

        this.elements = new ArrayList<Element>();
        this.SetShip();
    }

    /**
     * Генерирует случайное положение корабля и его направление
     */
    private void GetPlace() {
        Random rand = new Random();
        this.x = rand.nextInt(10);
        this.y = rand.nextInt(10);
        this.dx = 0;
        this.dy = 0;
        if (rand.nextInt(2) == 1) {
            this.dx = 1;
        } else {
            this.dy = 1;
        }
    }
    
    /**
     * Функция обхода корабля и его окружения
     * 
     * @return
     */
    private boolean ByPass(TrigerShip tp) {
        int i, m, n;
        
        // корабль
        for(i = 0; i < size; i++) {
            m = y+i*dy;
            n = x+i*dx;
            if (tp.Ship(m,n) == false) {
                return false;
            }
        }
        // площадка сверху и снизу корабля
        for(i=0; i < size; i++) {
            m = y+i*dy-dx;
            n = x+i*dx-dy;
            if (tp.Border(m, n) == false) {
                return false;
            }
            m = y+i*dy+dx;
            n = x+i*dx+dy;
            if (tp.Border(m, n) == false) {
                return false;
            }
        }
        // площадка слева и справа корабля
        for(i = -1; i < 2; i++) {
            m = y+i*dx-dy;
            n = x+i*dy-dx;
            if (tp.Border(m, n) == false) {
                return false;
            }
            m = y+i*dx+(dy*size);
            n = x+i*dy+(dx*size);
            if (tp.Border(m, n) == false) {
                return false;
            }
        }
        return true;
    }

    /**
     * Проверка корректности нахождения корабля на поле
     * @return
     */
    private boolean CheckPlace() {
        return ByPass(new TrigerShipCheck(this));
    }

    /**
     * Установка на поле корабля и его окружения 
     */
    private void SetShip() {
        ByPass(new TrigerShipSet(this));
    }
}


Код

package ru.semikov.sea.logic;

public abstract class TrigerShip {
    public FieldShip field;
    
    public TrigerShip(Ship ship) {
        this.field = ship.field;
    }
    
    abstract public boolean Ship(int m, int n);
    abstract public boolean Border(int m, int n);
}


Код

package ru.semikov.sea.logic;

public class TrigerShipCheck extends TrigerShip {

    public TrigerShipCheck(Ship ship) {
        super(ship);
    }

    @Override
    public boolean Ship(int m, int n) {
        ElementStates state = field.GetElement(m, n);
        return (state == ElementStates.enWater);
    }

    @Override
    public boolean Border(int m, int n) {
        ElementStates state = field.GetElement(m, n);
        return (state == ElementStates.enBorder) || 
                (state == ElementStates.enWater) || 
                    (state == ElementStates.enEmpty);
    }
}


Код

package ru.semikov.sea.logic;

public class TrigerShipSet extends TrigerShip {
    
    private Ship ship;
    
    public TrigerShipSet(Ship ship) {
        super(ship);
        this.ship = ship;
    }
    
    @Override
    public boolean Ship(int m, int n) {
        field.SetElement(m, n, ElementStates.enWell);
        ship.elements.add(field.elements[m][n]);
        field.elements[m][n].ship = ship;
        return true;
    }
    
    @Override
    public boolean Border(int m, int n) {
        field.SetElement(m, n, ElementStates.enBorder);
        return true;
    }
}


Код

package ru.semikov.sea.logic;

import java.util.ArrayList;

public class FieldShip {
    public Element[][] elements;
    public ArrayList<Ship> ships;

    /**
     * создание поля с кораблями
     */
    public FieldShip() {
        // заполняем поле элементами воды
        elements = new Element[10][10]; 
        for(int j=0; j<10; j++) {
            for(int i=0; i<10; i++) {
                elements[i][j]=new Element(i, j);
            }
        }
        this.PutShip();
    }

    /**
     * Заполняем поле водой и расставляем корабли
     */
    public void PutShip() {

        // заполняем поле водой
        for(int j=0; j<10; j++) {
            for(int i=0; i<10; i++) {
                Element element = elements[i][j];
                element.state = ElementStates.enWater;
                element.shuted = false;
            }
        }
        
        // заполняем поле короблями
        ships = new ArrayList<Ship>(); 
        for(int i=4; i>0; i--) {
            for(int j=(5-i); j>0; j--) {
                Ship ship=new Ship(this,i);
                ships.add(ship);
            }
        }
        
        // удаляем окружение коробля
        for(int j=0; j<10; j++) {
            for(int i=0; i<10; i++) {
                Element element = elements[i][j];
                if (element.state == ElementStates.enBorder) {
                    element.state = ElementStates.enWater;
                }
            }
        }
        
    }
    
    /**
     * Сделать выстрел
     * @param x
     * @param y
     * @return
     * Возвращает результат выстрела
     */
    public boolean doShot(int x, int y) {
        boolean shot = false;
        
        ElementStates state = this.GetElement(x, y);
        elements[x][y].shuted = true;
        if (state == ElementStates.enWell) {
            shot = true;
            Ship ship = elements[x][y].ship; 
            if (ship.health != 0) {
                ship.health--;
                if (ship.health == 0) {
                    ship.state = ShipStates.enKilled;
                    for(Element e : ship.elements) {
                        e.state = ElementStates.enKilled;
                    }
                } else {
                    ship.state = ShipStates.enInjured;
                    elements[x][y].state = ElementStates.enInjured;
                }
            }
        } else {
            if ( (state == ElementStates.enBorder) || 
                        (state == ElementStates.enWater)) {
                this.SetElement(x, y, ElementStates.enMissed);
            }
        }
        return shot;
    }
    
    /**
     * Проверка координат в пределах поля 
     * @param x
     * @param y
     * @return - boolean
     */
    public boolean isBound(int x, int y) {
        return !( (x<0) || (x>9) || (y<0) || (y>9) );
    }
    
    /**
     * Получить по координатам тип элемента 
     * 
     * @param x
     * @param y
     * @return
     */
    public ElementStates GetElement(int x, int y) {
        if (isBound(x,y)) {
            return elements[x][y].state;
        } else {
            return ElementStates.enEmpty;
        }
    }
    
    /**
     * Установить по координатам тип элемента
     * @param x
     * @param y
     * @param state
     */
    public boolean SetElement(int x, int y, ElementStates state) {
        if (isBound(x,y)) {
            elements[x][y].state = state;
        }
        return true;
    }
    
    /**
     * отрисовка поля
     */
    public void Draw() {
        for(int j=0; j<10; j++) {
            for(int i=0; i<10; i++) {
                System.out.print(elements[i][j].toString());
            }
            System.out.println();
        }
    }
    
}


Код

package ru.semikov.sea.logic;

import java.util.ArrayList;
import java.util.Random;

/**
 * Исскуственный интелект  
 */
public class Robot {

    public FieldShip field;
    public int x, y;
    Random rand;
    
    /**
     * Создание робота для выполнения хода
     * создаётся для определённого поля  
     */
    public Robot(FieldShip field) {
        this.field = field;
        this.rand = new Random();
    }
    
    
    /**
     * Попытка сделать выстрел
     * @return
     */
    public boolean tryShot() {
        ArrayList<Element> list = new ArrayList<Element>();
        
        for (int j = 0; j < 10; j++) {
            for (int i = 0; i < 10; i++) {
                Element e = field.elements[i][j];
                if (!e.shuted) { 
                    list.add(e);
                }
            }
        }
        Element e = list.get(rand.nextInt(list.size()));
        return field.doShot(e.x, e.y);
    }
    
    /**
     * сделать ход
     */
    public boolean move() {
        boolean finded = false;
        // ищём раненный элемент корабля
        first: for (int j = 0; j < 10; j++) {
            for (int i = 0; i < 10; i++) {
                Element element = field.elements[i][j];
                if (element.state == ElementStates.enInjured) {
                    // нашли раненный элемент корабля
                    finded = true;
                    x = i;
                    y = j;
                    break first;
                }
            }
        }
/*        
        if (finded) {
            //TODO добавить здесь анализатор
            System.out.printf("finded> %s,%s\n", x, y);
            
            ArrayList<Element> list = new ArrayList<Element>();
            
            // пробуем стрелять вокруг раненого корабля
            // выбрал случайную позицию
            for(int j = 0; j < 2; j++) {
                int a = x;
                int b = y + j*2-1;
                if ( (b < 0) || (b>9) ) {
                    continue;
                }
                if (!field.elements[a][b].shuted) {
                    list.add(field.elements[a][b]);
                    System.out.printf("> %s,%s\n", a, b);
                }
            }
            for(int i = 0; i < 2; i++) {
                int a = x + i*2-1;
                int b = y;
                if ( (a < 0) || (a>9) ) {
                    continue;
                }
                if (!field.elements[a][b].shuted) {
                    list.add(field.elements[a][b]);
                    System.out.printf("> %s,%s\n", a, b);
                }
            }
            Element e = list.get(rand.nextInt(list.size()));
            return field.doShot(e.x, e.y);
        }
*/
        return tryShot();
    }
    
    /**
     * Получить координуту X
     * @return
     */
    public int getX() {
        return this.x;
    }

    /**
     * Получить координуту Y
     * @return
     */
    public int getY() {
        return this.y;
    }
    
}


=== ОТОБРАЖЕНИЕ ===

(находится в архиве - скачать в начале)


извините за полный код. smile




Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  SeaBattle.zip 32,02 Kb
PM MAIL   Вверх
dorogoyIV
Дата 6.10.2011, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 3
Всего: 46



привет, извини, но не нужно было называть свой класс именем "Robot"
я, правда не стал все смотреть, ...
PM MAIL   Вверх
toxx
Дата 6.10.2011, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: 1
Всего: 13



1.Названия методов в джаве с маленькой буквы, классов с большой.
2.Всякие константы типа 100 10 1 0 должны быть в константах соответствующих объектов.
3.Имена полей класса удобно начинать с mFieldEtc
4.Стэйты свои тожебы в константы засунул
5.Булевские поля начинаются с mIsField

эт что в глаза бросилось, остальное лениво =)
PM MAIL   Вверх
dorogoyIV
Дата 6.10.2011, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 3
Всего: 46



toxx, по сути верно, но немного не так, мне кажется...
откуда то литера m взялась... ???

Цитата(toxx @  6.10.2011,  16:30 Найти цитируемый пост)
5.Булевские поля начинаются с mIsField

в джава, конечно, не так, а так...
Код

 isField(...)



toxx, не обращай внимания, это я просто соскучился по форуму...  smile 
PM MAIL   Вверх
GZep
Дата 6.10.2011, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

Репутация: нет
Всего: 32



Я бы объеденил классы ElementStates и Element:

Код

package ru.semikov.sea.logic;
public class Element {

    public static final int STATE_EMPTY = 0;
    public static final int STATE_WATER = 1;
    //остальные константы в том же духе...

    private int state;
    
    public Element(int x, int y) {
    }

    public int getState() {
        return this.state;
    }
}

использовать так:
Код

if (element.getState() == Element.STATE_WATER) {
   //если вода...
}



--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
toxx
Дата 6.10.2011, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: 1
Всего: 13



dorogoyIV
хмм, по моему опыту работы используем для приватных полей класса префикс m, если это булева переменная то mIs, гетеры сетеры конечно без этих ухищрений, просто используется вродебы широко + удобно в эклипсе нажал m + ctrl + enter и видишь все приватные поля класса =)
PM MAIL   Вверх
dorogoyIV
Дата 7.10.2011, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 3
Всего: 46



toxx, ааа, понятно, я не пользуюсь эклипсом  smile 
PM MAIL   Вверх
isalex678
Дата 7.10.2011, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 6.10.2011

Репутация: нет
Всего: нет



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

PM MAIL   Вверх
toxx
Дата 7.10.2011, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: 1
Всего: 13



dorogoyIV
Все это прямиком из андроида, эклипс думаю не причем)
PM MAIL   Вверх
dorogoyIV
Дата 7.10.2011, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 3
Всего: 46



toxx, для андроида отдельная ветка есть на форуме, так, что, извини, boolean isField() (без m)  smile 
ой, что то я тут флеймом занялся... сорри  smile 
PM MAIL   Вверх
toxx
Дата 7.10.2011, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: 1
Всего: 13



dorogoyIV
поле называется с m, гетер без него, андроид напрямую связан с джавой, так что извольте принять =) 
PM MAIL   Вверх
dorogoyIV
Дата 7.10.2011, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 3
Всего: 46



toxx, ну ты меня развеселил  smile 
то, что, андроид связан с джавой, не значит, что, джава должна подстраиваться под него.
я все никак не могу добраться до андроида (времени не хватает), поэтому не могу спорить с тобой!
но классика, это - без "м"
 smile 
PM MAIL   Вверх
toxx
Дата 7.10.2011, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: 1
Всего: 13



dorogoyIV
Ну есть разные кодовые аннотации(вроде так верно) так что какую использовать выбирать вам, точнее вашему тим лиду)
PM MAIL   Вверх
GZep
Дата 7.10.2011, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

Репутация: нет
Всего: 32



Простите, но зачем этот "m" нужен? Для андройда пишу на нетбинсе и без всяких префиксов, "по классическому". не пойму откуда такая тенденция вообще...


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
dorogoyIV
Дата 8.10.2011, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 3
Всего: 46



GZep, я так думаю - бустрый вызов у него так настроен. ну типа как у меня Ctrl+F8 или Ctrl+F10 (вызов служебных программ разных),
а у него Ctrl+Enter+m
но это Windows, и к программированию никакого отношения не имеет...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0594 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.