JavaRush /Java блогу /Random-KY /Javaдагы көп оюнчу консолу оюну
timurnav
Деңгээл

Javaдагы көп оюнчу консолу оюну

Группада жарыяланган
Баарыңарга салам, мен оюнду көптөн бери жазып бүттүм, бирок мен дагы эле макала жазууга жетише элекмин, бул бул жазуунун логикалык уландысы . Эгер сиз дагы башка эч нерсе кыла элек болсоңуз JavaRush тапшырмаларына караганда, анда оюн менен таанышуу сиз баштоону каалаган жерде болот, сиз чыныгы долбоордун тесттик тапшырмаларына даярданууну башташыңыз керек, ага мен баарына катышууну сунуштайм. Жалпысынан алганда, вакуумда сфералык программист болууну токтотуп, Java-өзөктөн тышкары бир нерсени үйрөнө баштоого убакыт келди. Оюнду жөн гана көрүү үчүн, сизде MySQL орнотулган болушу керек, эгер сиз аны колдоно элек болсоңуз, тартынбаңыз - аны орнотуңуз, бул сиз жумушуңузда жана жеке долбоорлоруңузда колдоно турган маалымат базаларынын бири! Мен маалымат базасын орнотуу жана аны менен иштөө боюнча түшүндүрмө бербейм; Интернетте көптөгөн окуу куралдары жана видеолор бар; Мен муну өз алдынча чечүүнү сунуштайм, бул дагы программисттин эң маанилүү жөндөмдөрүнүн бири - фигурациялоо аны өз алдынча чыгара аласыз :) Жашоодо сизге sql, жергorктүү жана JDBC, hibernate , жаз, жазгы маалыматтар аркылуу суроо жазуу жөндөмү керек болот, балким, тизмени улантууга болот, бирок менин бorмим ушуну менен бүтөт. Эми бул макаланы окууну токтотуңуз жана MySQLди түшүнүңүз, бул чындыгында кыйын эмес, serverдин өзүн орнотуу керек, бир гана орнотуулар логин жана пароль. анда иштегенде кандай командалар колдонулаарын окуп чыгыңыз. Сервер менен иштөө командалары: create , show, use, жана башкалар, команда help- командалардын толук тизмесин берет. Белгилүү бир table менен иштөө үчүн сурамдар: select , insert, deleteжана башкалар. Өтө тереңдеп кетпеңиз, буйруктарды жөн эле окуудан бир аз гана бөлүгү эсте калып калуу мүмкүнчүлүгү бар. убакыттын өтүшү менен баарын үйрөнөсүз. Сиз MySQL терминалында ойной аласыз, маалымат базасын түзө аласыз, tableларды түзө аласыз, аларды толтурсаңыз, маалыматтарды көрсөтүүгө өтүнүч жасай аласыз, суроо критерийлерин кошо аласыз. Кыязы, бул сизге 2-3 сааттан ашык эмес убакытты талап кылат, эгерде ал узак болсо, кабатыр болбоңуз, тажрыйба менен жаңы материалды тезирээк өздөштүрүп аласыз. Эгерде сизде базалар менен эч кандай көйгөйлөр жок болсо, анда мен tic-tac-toe жөнүндө жазган оюндун негизинде оюнду иштеп чыгууну баштасаңыз болот.. Узак убакыт бою мен мультиплеерди кантип ишке ашырууга болорун түшүнө алган жокмун, мен маалымат базасын колдонуунун жолун таптым. Оюн процесси оюнчулар кезектешип, оюндагы бардык өзгөрүүлөр маалымат базасына жазылат деп болжолдойт. буга таянсак, бизде оюнчу бар экенин жана оюнчуларга шилтемелерди камтыган оюн талаасы бар экенин түшүнөбүз, бул оюн талаасында логика бир оюнчу экинчи оюнчунун кадам жасоосун күтүп жаткан жерде байланышы керек. Ошондон кийин алардын ролдору өзгөрүп, биринчи оюнчу кыймыл жасайт, экинчиси күтөт. Жана бардык өзгөртүүлөр маалымат базасында кайталанышы керек болгондуктан, ар бир кыймылдан кийин биз талааны сактап турушубуз керек. Ошентип, биз биринчи жыйынтыкка келдик, маалымат базасында оюн талаасы болушу керек жана биз көп оюнчу жөнүндө сөз болуп жаткандыктан, биз ал жерге оюнчуларды кошушубуз керек. Келгиле, MySQLде tableларды түзөлү, мен аны MySQL терминалынын терезеси аркылуу жасадым. оюн талаасында оюнчуларга шилтемелер бар, андыктан алгач оюнчулар менен үстөл түзүү логикага ылайыктуу. Биздин оюнчулар бар:
  • id– катар номери, биз аны негизги ачкыч кылабыз;
  • name– жалпы аты, сап;
  • wins– жеңиштердин саны;
  • loses- жаралардын саны;
  • games– ойнолгон оюндардын жалпы саны.
Оюн столу:
  • id– катар номери, биз аны негизги ачкыч кылабыз;
  • x– ойноп жаткан оюнчунун id х– экинчи баскычы;
  • o– ойноп жаткан оюнчунун id o– экинчи баскычы;
  • field– талаанын өзү, анын форматы төмөндө сүрөттөлөт;
  • status– бул көп оюнчунун туура иштеши үчүн зарыл, статус оюндун абалын мүнөздөйт:
    түзүлгөн, ойноо, оюн бүттү

  • current- ошондой эле көп оюнчу үчүн, өзгөчө оюн учурунда бул талаа кимдин кезеги келерин көзөмөлдөйт
    жана аяктагандан кийин жеңүүчүнү жарыялайт же чүчүкулак чыгарат

Биз tableларды иреттеп чыктык, эми тиешелүү талаалар менен 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ди колдонууну камтыйт, ал жөнүндө wikiден окуңуз . Бирок, эгер сиз аны 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га байланганын айтат.
  • @Table(name="games")– кайсы table экенин айтат, games– базадагы tableнын аталышы
  • @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();
            }
        }
    }
}
Берorштер базасына жаңы колдонуучуну кошуу операциясы ушундай болот.Караңыз, методго an object классынын an objectи гана өткөрүлөт, бул жерде эч кандай кошумча маалымат талап кылынbyte. Бул 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>
Эгер тегдерди карап көрсөңүз, бул жерде эмнени жана кантип орнотуп жатканыбыз айкын болот. Күтүү режиминин дагы бир өзгөчөлүгү, эгерде биз күтүлбөгөн жерден маалымат базасын MySQLден башкасына өзгөртүүнү чечсек, property name="connection.driver_class" DAO катмарынын тегинин ичиндеги драйверди гана өзгөртүү керек болот, келгиле, тейлөө катмарын түзөлү. Тейлөө катмарында DAO an objectилерин жаратпоо үчүн биз фабрика үлгүсүн колдонобуз.
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 үйрөнүүдө баарына ийгorк! Долбоорду бул жерден жүктөп алсаңыз болот .
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION