JavaRush /Java блогы /Random-KK /Java тіліндегі көп ойыншыға арналған консоль ойыны
timurnav
Деңгей

Java тіліндегі көп ойыншыға арналған консоль ойыны

Топта жарияланған
Баршаңызға сәлем! Мен ойынды жазуды көп уақыт бұрын аяқтадым, бірақ әлі мақала жазуға үлгермедім, бұл осы жазбаның логикалық жалғасы . Егер сіз әлі басқа ештеңе жасауға тырыспаған болсаңыз JavaRush тапсырмаларына қарағанда, ойынмен танысу дәл сіз бастағыңыз келетін жерде болады, сізге нақты жобаның тест тапсырмаларына дайындықты бастау керек, мен барлығына қатысуды ұсынамын. Жалпы, вакуумда сфералық бағдарламашы болуды тоқтатып, java-ядросынан тыс нәрсені үйренуді бастаудың уақыты келді. Ойынды жай ғана көру үшін сізде MySQL орнатылған болуы керек, егер сіз оны әлі пайдаланбаған болсаңыз, тартынбаңыз - оны орнатыңыз, бұл сіздің жұмысыңызда және жеке жобаларыңызда қолданылатын деректер базаларының бірі! Мен дерекқорды орнату және онымен жұмыс істеу сипаттамасын бермеймін; Интернетте көптеген оқулықтар мен бейнелер бар; Мен мұны өз бетіңізше анықтауға кеңес беремін, бұл да бағдарламашының ең маңызды дағдыларының бірі - фигуралар оны өз бетінше шығара аласыз :) Өмірде сізге сұрауларды sql тілінде, жергілікті түрде және JDBC, hibernate , көктем, көктем деректері арқылы жазу мүмкіндігі қажет болады, мүмкін тізімді жалғастыруға болады, бірақ менің білімім сонда аяқталады. Енді осы мақаланы оқуды тоқтатыңыз және MySQL-ті анықтаңыз, бұл мүлдем қиын емес, serverдің өзін орнату керек, жалғыз параметрлер логин мен пароль. содан кейін жұмыс кезінде қандай командалар қолданылатыны туралы оқыңыз. Сервермен жұмыс істеуге арналған командалар: create , show, use, және басқалары, команда help– командалардың толық тізімін береді. Белгілі бір кестемен жұмыс істеуге арналған сұраныстар: select , insert, deleteжәне т.б. Тым тереңге түспеңіз, командаларды оқудың кішкене бөлігі ғана есте қалуы мүмкін. уақыт өте келе бәрін үйренесіз. MySQL терминалында ойнауға, деректер қорын жасауға, кестелер жасауға, оларды толтыруға, деректерді көрсетуге сұраныс жасауға, сұрау критерийлерін қосуға болады. Сірә, бұл сізге 2-3 сағаттан аспайды, егер ұзағырақ болса, алаңдамаңыз, тәжірибе арқылы сіз жаңа материалды тезірек меңгересіз. Егер сізде дерекқормен проблемалар болмаса, мен Tic Tac Toe туралы жазған ойынға негізделген ойынды әзірлеуге кірісуге болады.. Ұзақ уақыт бойы мен мультипликаторды қалай енгізу керектігін біле алмадым, дерекқорды пайдаланудың шешімін таптым. Ойын процесі ойыншылардың кезекпен жүруін болжайды, ойындағы барлық өзгерістер деректер базасында жазылады. осыған сүйене отырып, бізде ойыншы бар екенін және ойыншыларға сілтемелер бар ойын алаңы бар екенін түсінеміз, ойын өрісінде бір ойыншы екінші ойыншының қозғалыс жасауын күтетін логика байланысты болуы керек. содан кейін олардың рөлдері өзгереді және бірінші ойыншы қимыл жасайды, ал екіншісі күтеді. Және барлық өзгертулер дерекқорда қайталануы керек болғандықтан, әрбір қозғалыстан кейін өрісті сақтау керек. Сонымен, біз бірінші қорытындыға келдік, Дерекқорда ойын алаңы болуы керек және біз көп ойыншы туралы айтып отырғандықтан, ойыншыларды сол жерге қосу керек. MySQL-де кестелерді құрайық, мен оны MySQL терминалының терезесі арқылы жергілікті түрде жасадым. ойын өрісінде ойыншыларға сілтемелер бар, сондықтан алдымен ойыншылармен кесте жасау қисынды болар еді. Біздің ойыншыларымыз:
  • id– реттік нөмірі, біз оны бастапқы кілт жасаймыз;
  • name– жалпы атау, жол;
  • wins– жеңістер саны;
  • loses- зақымданулар саны;
  • games– ойналған ойындардың жалпы саны.
Ойын кестесі:
  • id– реттік нөмірі, біз оны бастапқы кілт жасаймыз;
  • x– ойнаушының идентификаторы х– қосалқы кілт;
  • o– ойнаушының идентификаторы o– қосалқы кілт;
  • field– өрістің өзі, оның форматы төменде сипатталатын болады;
  • status– бұл көп ойыншының дұрыс жұмыс істеуі үшін қажет, мәртебе ойынның күйін сипаттайды:
    құрылды, ойналуда, ойын аяқталды

  • current– сонымен қатар көп ойыншы үшін, атап айтқанда ойын кезінде бұл өріс енді кімнің кезегі екенін басқарады,
    ал аяқталғаннан кейін ол жеңімпазды жариялайды немесе ұтыс шығарады.

Біз кестелерді сұрыптадық, енді сәйкес өрістері бар Java сыныптарын жасау керек - Gameжәне User.
public class Game {
    private Integer id;
    private Integer x;
    private Integer y;
    private Integer field;
    private String status;
    private String current;
}
public class User {
    private Integer id;
    private String name;
    private Integer wins;
    private Integer loses;
    private Integer games;
    private Boolean busy;
}
Параметрлері жоқ бос конструкторды қосайық - деректер қорымен жұмыс істеу үшін және an objectілерді жасайтын басқа конструктор. Барлық өрістер үшін орнатушылар мен қабылдаушыларды қосамыз. Енді күту режимімен айналысайық :) бұл сағат сайын оңай емес. Бұл MySQL-ге қарағанда біршама күрделірек, мен жалпы құрылымды тез аралаймын. Тағы да, бәрі соншалықты күрделі емес, негіздерді кез келген оқулық арқылы бірнеше сағат ішінде үйренуге болады, және жобаларыңызды жазу кезінде тереңірек оқығаныңыз жөн. JAVA дерекқорымен жұмыс істеу JDBC пайдалануды қамтиды, бұл туралы викиден оқыңыз . Бірақ егер сіз оны codeты жазуда қолдансаңыз, ол ануста көп ауырсынуды тудырады , DAO сыныптарын жазудағы біршама күрделілік ( сонымен қатар вики ), гибернация жағдайды сәл жақсартады, онымен сізде қайталанулар әлдеқайда аз болады (үлгі). ) code. Күту күйі жұмыс істеуі үшін жобаға кітапхананы қосу керек, бұл өте қарапайым: Ctrl+Alt+Shift+S(Файл-жоба құрылымы), Кітапханалар қойындысына өтіп, «+» түймесін басыңыз және алдын ала жүктелген кітапхана ( опция ретінде, осы жерден ). Класстарды байланыстыру үшін annotationларды пайдалану Userкерек Game- оларды пайдалану өте оңай, олармен code келесідей болады:
@Entity
@Table(name="games")
public class Game {
    private Integer id;
    private Integer x;

    @Id
    @GeneratedValue
    @Column(name = "id")
    public Integer getId() {
        return id;
    }

    @Column(name = "x")
    public Integer getX() {
        return x;
    }
}
Бұл жерде қарапайым
  • @Entity– класстың «an objectі» екенін, қарапайым сөзбен айтқанда, мәліметтер қорындағы кестеге байланғанын айтады.
  • @Table(name="games")– қай кестені айтады, games– мәліметтер қорындағы кестенің атауы
  • @Id, @GeneratedValue, @Column(name = "id")– осы үш annotationмен біз бұл өрістің сәйкестендіру өрісі екенін, ол автоматты түрде құрылатынын және деректер қорындағы баған id деп аталады.
  • @Column(name = "x")– деректер қорындағы бағанның аты.
Әрі қарай, деңгейлерді құру керек - DAO деңгейі және қызмет көрсету деңгейі. Егер біз бәрін вакуумдық жағдайларға оңайлататын болсақ, онда деректермен жұмыс қызмет көрсету деңгейінен өтеді, бұл абстракция деңгейлерінің бірі, ол ойын логикасын әзірлеуші ​​егжей-тегжейге кірмеуі үшін қосымшаның жұмысын тәуелсіз етуге мүмкіндік береді. дерекқорға қол жеткізуді орнату туралы немесе, мысалы, кенеттен біз қарапайым күту күйінің орнына көктемді пайдалануды шешсек, өзгерістер қызмет көрсету деңгейінен шықпайды, онсыз қосымшаның жартысын қайта жазуға тура келеді! бұл дизайн үлгілерінің бірі. DAO деңгейін жазуды бастайық.
public class UserDAO {

    public void addUser(User user) throws SQLException {
        Session session = null;
        try{
            session = HibernateUtil.getSessionFactory().openSession();
            session.beginTransaction();
            session.save(user);
            session.getTransaction().commit();
        } catch (Exception e){
            e.printStackTrace();
        } finally {
            if (session != null && session.isOpen()) {
                session.close();
            }
        }
    }
}
Дерекқорға жаңа пайдаланушыны қосу операциясы осылай көрінеді.Әдіске тек субъект класының an objectісі ғана берілетінін ескеріңіз, мұнда қосымша ақпарат қажет емес. Бұл HibernateUtil сыныбынан дерекқормен дайын байланыс сеансын алу арқылы қамтамасыз етіледі. Оны қарастырайық.
public class HibernateUtil {
    private static SessionFactory sessionFactory = null;

    static {
        try {

            sessionFactory = new Configuration().configure().buildSessionFactory();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}
Көріп отырғаныңыздай, мұнда бәрі өте қарапайым SessionFactory- бұл біз жобамызға қосылған күту кітапханасының интерфейсі. Дұрыс жұмыс істеу үшін hibernate.cfg.xml конфигурация файлын толтыру ғана қалады.
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/tictactoe</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>
        <property name="connection.pool_size">100</property>
        <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
        <property name="show_sql">false</property>
        <property name="hbm2ddl.auto">update</property>
        <property name="hibernate.connection.autocommit">false</property>
        <property name="current_session_context_class">thread</property>
        <property name="hibernate.enable_lazy_load_no_trans">true</property>
        <mapping class="entity.User" />
        <mapping class="entity.Game" />
    </session-factory>
</hibernate-configuration>
Tagтерге қарасаңыз, мұнда нені және қалай орнатып жатқанымыз анық болады. Күту режимінің тағы бір ерекшелігі, егер біз кенеттен деректер қорын MySQL-ден басқасына өзгерту туралы шешім қабылдасақ, property name="connection.driver_class" DAO қабаты тегіндегі драйверді өзгерту керек, қызмет көрсету деңгейін жасайық. Қызмет көрсету деңгейінде DAO нысандарын жасамау үшін біз зауыт үлгісін қолданамыз.
public class Factory {
    private static UserDAO userDAO = null;
    private static Factory instance = null;
    private Factory() {
    }

    public static synchronized Factory getInstance() {
        if (instance == null) {
            instance = new Factory();
        }
        return instance;
    }

    public UserDAO getUserDAO() {
        if (userDAO == null) {
            userDAO = new UserDAO();
        }
        return userDAO;
    }
}
Міне, қызмет көрсету деңгейінің әдістерінің бірі
public class UserService {
    static void setUserBusy(User user){
        user.setBusy(true); //делаем его занятым
        //и обновляем его в БД
        Factory.getInstance().getUserDAO().updateUser(user);
    }

}
Дерекқормен жұмыс істеу codeы аяқталды, біз өзгерістерді ескере отырып, ойын логикасын қайта жазамыз. Біріншіден, негізгі іске қосу әдісін бөлек сыныпқа бөлейік Main, ол тек бақылау класы болады - ойынды бастауға немесе статистиканы көруге болатын ойын мәзірі. GameLogicОйынның барлық логикасын сипаттайтын және ойын өрісін тексеретін сынып құрайық . Ол ойын алаңындағы барлық өзгерістерді және ойыннан кейін ойыншы статистикасын сақтауды қызмет көрсету деңгейіне тапсырады. Қызықты мүмкіндік бар: бізде массивтер түрінде ойын өрісі бар, оларды дерекқорда сақтауға болады, бірақ осы кезеңде мен дөңгелекті қайта ойлап табуды шештім және менің дерекқорымда өріс int ретінде қамтылған, атап айтқанда 9 -разрядты сан, ол класс әдістері арқылы екі талданады GameLogic, мен мұны істеуді ұсынбаймын, мен ойынның келесі шығарылымдарында жетілдіремін :) JAVA тілін үйренуде барлығына сәттілік! Жобаны мына жерден жүктеп алуға болады .
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION