Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Java]Покритикуйте код шахматной программы, Частично реализовал логику,но есть сомн. 
:(
    Опции темы
ЛунныйОборотень
Дата 20.4.2012, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Здравствуйте!

Для саморазвития и частично портфолио пишу шахматную программу под Андроид.
Частично написал логику программы.Но есть подозрение,что это криво###код...

Основная идея в том,чтобы создать интовский массив и в него писать значения-коды фигур,а также другую нужную информацию.
В процессе описания возможных ходов фигур выяснилось,что выхожу за границу массива,поэтому он был расширен и 
шахматная доска "вписана" в него.
Поначитался Макконела ,стараюсь следовать его советам.Но...

Прошу помощи в критике кода,а также в советах как правильно сделать .

Спасибо.

Код

/**
 * Файл создан 10.04.2012 14:07:46 TODO
 */
package com.wildchess.Logic;

import com.wildchess.ThirdSystems.ServiceFunctions;
import java.math.*;
/**
 * @author Konstantin
 *
 */
public class Logic {
    private int BOARD_SIZE=8;  
    private int Full_Board_Size=24;
    private boolean FlagOoutofBoard=false;
    private boolean FlagWhiteBlack=true; // для функции битых полей- true/false- белые/черные
    private int FireWhiteBlack=100;
    Logic logic=new Logic();
    ServiceFunctions service=new ServiceFunctions();
    private int board[][];  // описываем шахматную доску.
    private int FireBoard[][];  // обьявляем доску ,в которой описываются "простреливаемые" поля.
     
    public Logic() // 1.инициализировать доску фигурами.
                   // 2.заполнить остальное простарнство числом 666.                
    {
        setBoards(new int[getFull_Board_Size()][getFull_Board_Size()]);
        setBoards(ServiceFunctions.InitMass(0, 0)); //инициализируем доску.
        setFireBoard(new int[getFull_Board_Size()][getFull_Board_Size()]);
        
        // инициализация неактивной части доски числом выхода за границу доски-666.
        setFireBoard(ServiceFunctions.InitMass(8, 8, 666));
        setFireBoard(ServiceFunctions.InitMass(8, 16, 666));
        setFireBoard(ServiceFunctions.InitMass(16, 24, 666));
        setFireBoard(ServiceFunctions.InitMass(16, 8, 666));
        setFireBoard(ServiceFunctions.InitMass(24, 16, 666));
        //--------------------------------------------------------------------------
    }
    
    
    
    /*Функция создания "битых" полей.На вход получает доску с фигурами
     * на выход-доску с фигурами и битыми полями.
     * условные обозначения ,белых/черных
     * pawn=1/11;Knight=2/22;Bishop=3/33;Ladia=4/44;Qween=5/55;King=6/66
     * 100|111-поля,простреливаемые белыми/черными 
        boolean FlagWhiteBlack- флаг указания,для какого цвета фигур рассчитывать битые поля 
        и возможные ходы
     */
     public int[][] GetBattleField(int[][] board,int board_size,boolean FlagWhiteBlack)
     {    
     if (FlagWhiteBlack==false) // задаем флагом возвращяемые функцией значения битых полей для белых/черных
        {
        FireWhiteBlack=111;
        }
         for(int X=0;X<board_size;X++)
             for(int Y=0;Y<board_size;Y++)
             {
                 switch(board[X][Y]) {
                    // сделать проверку выхода за границу доски
                 // boolean isOutofBoard(int[][] board)
                    case 1:
                            
                           
                               
                           board[X+1][Y+1]=SetOutOfBoard(board[X+1][Y+1],X,Y);;//1 -для белой пешки
                           board[X-1][Y+1]=SetOutOfBoard(board[X-1][Y+1],X,Y);;
                           
                    case 2:   //  битые поля Коня.
                            
                                board[X-1][Y+2]=SetOutOfBoard(board[X-1][Y+2],X,Y);
                                board[X+1][Y+2]=SetOutOfBoard(board[X+1][Y+2],X,Y);
                                board[X-2][Y+1]=SetOutOfBoard(board[X-2][Y+1],X,Y);
                                board[X+2][Y+1]=SetOutOfBoard(board[X+2][Y+1],X,Y);
                                board[X-2][Y-1]=SetOutOfBoard(board[X-2][Y-1],X,Y);
                                board[X+2][Y-1]=SetOutOfBoard(board[X+2][Y-1],X,Y);
                            
                            
                    case 3:    // Слон    
                            int i=0; // переменная для перемещения влево-вправо от положения фигуры
                            while((X+i)>BOARD_SIZE+8)
                            {
                                X=X+1;
                                board[X][Y]=FireWhiteBlack;
                                i++;
                            }
                            while((X-i)<BOARD_SIZE)
                                {
                                X=X-1;
                                board[X][Y]=FireWhiteBlack;
                                i++;
                                }
                     case 4 : // Ладья
                            int i=0;
                            while((Y+i)>BOARD_SIZE+8)
                            {
                                Y=Y+1;
                                board[X][Y]=FireWhiteBlack;
                                i++;
                            }
                            while((X-i)<BOARD_SIZE)
                                {
                                Y=Y-1;
                                board[X][Y]=FireWhiteBlack;
                                i++;
                                }
                    case 5: // Ферзь
                            int i=0; // переменная для перемещения влево-вправо от положения фигуры
                            while((X+i)>BOARD_SIZE+8)
                            {
                                X=X+1;
                                board[X][Y]=FireWhiteBlack;
                                i++;
                            }
                            while((X-i)<BOARD_SIZE)
                                {
                                X=X-1;
                                board[X][Y]=FireWhiteBlack;
                                i++;
                                }
                            while((Y+i)>BOARD_SIZE+8)
                            {
                                Y=Y+1;
                                board[X][Y]=FireWhiteBlack;
                                i++;
                            }
                            while((X-i)<BOARD_SIZE)
                                {
                                Y=Y-1;
                                board[X][Y]=FireWhiteBlack;
                                i++;
                                }    
                    case 6: // King
                            int i=1; // переменная для перемещения влево-вправо от положения фигуры
                            while((X+i)>BOARD_SIZE+8)
                            {
                                X=X+1;
                                board[X][Y]=FireWhiteBlack;
                                break;
                            }
                            while((X-i)<BOARD_SIZE)
                                {
                                X=X-1;
                                board[X][Y]=FireWhiteBlack;
                                break;
                                }
                            while((Y+i)>BOARD_SIZE+8)
                            {
                                Y=Y+1;
                                board[X][Y]=FireWhiteBlack;
                                break;
                                
                            }
                            while((X-i)<BOARD_SIZE)
                                {
                                Y=Y-1;
                                board[X][Y]=FireWhiteBlack;
                                
                                break;
                                }    
                                
                 }
             }
         
         return board;
     }
    
     // проверяем,вышла ли фигура за границы доски.и все.
     /*
      * как проверить,вышла ли фигура за границы доски?
      * 1.увеличить массив до 24х24.
      * 2.вписать в него доску размером 8х8.таким образом,выхода за границу настоящего массива не будет.
      * 3.заполнить несуществующий массив кодовым числом ошибки выхода за границу доски-  -1.
      * 4.в функции int[][] GetBattleField(int[][] board) создаются битые поля фигур,выходящие за размеры доски,
      *   но входящие в поле массива.
      * 5.isOutofBoard проверяет ,вышли ли входные координаты за границу доски и возвращает true|false
      */
     public boolean isOutofBoard(int BOARD_SIZE,int X,int Y)
     {  
         if((X&Y)>BOARD_SIZE+8)
            {
            return false;
            }
         if((X&Y)<BOARD_SIZE)
            {
            return false;
            }
          
         return true;
     }
     
     /* на вход получаем доску и координты.
        на выход возвращаем или значение битого поля для белых/черных
        или возвращаем -1 -признак выхода за границу доски.
     
     */
     int SetOutOfBoard(int[][] board,int X,int Y)
                            {
                            if(isOutofBoard(BOARD_SIZE,X,Y)==true)
                                {
                                return FireWhiteBlack;
                                }
                            else return -1;
                            }
     
     
    public boolean getFlagOoutofBoard() {
        return FlagOoutofBoard;
    }
    public void setFlagOoutofBoard(boolean flagOoutofBoard) {
        FlagOoutofBoard = flagOoutofBoard;
    }
     


    
    
    
    
    
    
    /**
     * @return the boards
     */
    public int[][] getBoards() {
        return board;
    }
    /**
     * @param boards the boards to set
     */
    public void setFireBoard(int boards[][]) {
        this.FireBoard = boards;
    }
    public int[][] getFireBoard() {
        return FireBoard;
    }
    /**
     * @param boards the boards to set
     */
    public void setBoards(int boards[][]) {
        this.board = boards;
    }
    /*
     * 
     */
    /**
     * @return the bOARD_SIZE
     */
    public int getBOARD_SIZE() {
        return BOARD_SIZE;
    }
    /**
     * @param bOARD_SIZE the bOARD_SIZE to set
     */
    public void setBOARD_SIZE(int bOARD_SIZE) {
        BOARD_SIZE = bOARD_SIZE;
    }
    public int getFull_Board_Size()
    {
        return Full_Board_Size;
    }
    public void setFull_Board_Size(int myFull_Board_Size)
    {
        Full_Board_Size=myFull_Board_Size;
    }
    
    
    
    
    public int getFireWhiteBlack()
    {
        return FireWhiteBlack;
    }
    public void setFireWhiteBlack(int myFireWhiteBlack)
    {
        FireWhiteBlack=myFireWhiteBlack;
    }
    
}


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


Опытный
**


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

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



Константы? если да, то static final и с большой буквы
Код

private int BOARD_SIZE=8;  
    private int Full_Board_Size=24;

По умолчанию в классе фолс, можно без =фолс
Код

private boolean FlagOoutofBoard=false;

Попытка синглтона?не используется вроде нигде больше
Код

Logic logic=new Logic(); 

Мб лучше статический метод у класса сделать или синглтон.
Код

ServiceFunctions service=new ServiceFunctions();
...
setFireBoard(ServiceFunctions.InitMass(8, 8, 666));

if (!FlagWhiteBlack) мб?
Код

if (FlagWhiteBlack==false)

Не совсем ясно зачем в классе поле FlagWhiteBlack, если передается как параметр
Код

public int[][] GetBattleField(int[][] board,int board_size,boolean FlagWhiteBlack)

Наверно надо в константы, 8х8 поле? или board.length?
Код

board_size

1,2... сделатьбы лучше говорящие константы
Код

 case 2:   //  битые поля Коня.

Красивше тернарный оператор + объединить 2 условия в одно + в реторне 
Код

if((X&Y)>BOARD_SIZE+8)
            {
            return false;
            }
         if((X&Y)<BOARD_SIZE)
            {
            return false;
            }
          
         return true;

if(isOutofBoard(BOARD_SIZE,X,Y))
Тернарный оператор =) в реторне 
  
Код

if(isOutofBoard(BOARD_SIZE,X,Y)==true)
                                {
                                return FireWhiteBlack;
                                }
                            else return -1;


Это сообщение отредактировал(а) toxx - 20.4.2012, 14:25
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

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


 




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


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

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