JavaRush /جاوا بلاگ /Random-SD /جاوا ۾ ملٽي پليئر ڪنسول گيم
timurnav
سطح

جاوا ۾ ملٽي پليئر ڪنسول گيم

گروپ ۾ شايع ٿيل
هيلو سڀني کي، مون گهڻو وقت اڳ ئي راند کي ختم ڪري ڇڏيو آهي، پر مون اڃا تائين هڪ مضمون لکڻ جي چوڌاري حاصل نه ڪيو آهي، اهو هن لکڻ جي هڪ منطقي تسلسل آهي ، جيڪڏهن توهان اڃا تائين ڪجهه ڪرڻ جي ڪوشش نه ڪئي آهي. JavaRush ڪمن جي ڀيٽ ۾، پوءِ راند سان واقف ٿيڻ بلڪل اُتي ئي ٿيندو جتان توھان شروع ڪرڻ چاھيو ٿا توھان کي ھڪڙي حقيقي منصوبي جي ٽيسٽ ٽاسڪ لاءِ تياري شروع ڪرڻي پوندي، جنھن ۾ مان سڀني کي شرڪت ڪرڻ جي سختي سان صلاح ڏيان ٿو. ۽ عام طور تي، اهو وقت آهي هڪ خلا ۾ هڪ گولائي پروگرامر ٿيڻ کي روڪڻ ۽ جاوا-ڪور کان ٻاهر ڪجهه سکڻ شروع ڪرڻ جو. صرف راند کي ڏسڻ لاءِ، توھان وٽ لازمي آھي MySQL انسٽال ٿيل آھي، جيڪڏھن توھان اڃا تائين استعمال نه ڪيو آھي، سنکوڪ نه ڪريو - ان کي انسٽال ڪريو، ھي انھن ڊيٽابيس مان ھڪڙو آھي جيڪو توھان پنھنجي ڪم ۽ ذاتي منصوبن ۾ استعمال ڪندا! مان ڊيٽابيس کي انسٽال ڪرڻ ۽ ان سان ڪم ڪرڻ جي تفصيل نه ڏيندس؛ انٽرنيٽ تي ڪيترائي سبق ۽ وڊيوز آهن؛ مان ان کي پاڻ ئي سمجهڻ جي صلاح ڏيان ٿو، اهو پڻ هڪ پروگرامر جي سڀ کان اهم صلاحيتن مان هڪ آهي. اهو توهان جي پنهنجي طور تي :) زندگي ۾، توهان کي sql ۾ سوالن کي لکڻ جي صلاحيت جي ضرورت پوندي، اصلي طور تي، ۽ JDBC، hibernate ، spring، spring data، شايد فهرست جاري رکي سگهجي، پر منهنجي ڄاڻ اتي ختم ٿي. ھاڻي ھن آرٽيڪل کي پڙھڻ بند ڪريو ۽ MySQL جو اندازو لڳايو، اھو اصل ۾ ڪجھ به ڏکيو ناھي، توھان کي سرور پاڻ انسٽال ڪرڻو پوندو، صرف سيٽنگون آھن لاگ ان ۽ پاسورڊ. پوءِ پڙهو ته ڪم ڪرڻ وقت ڪهڙن حڪمن کي استعمال ڪيو ويندو آهي. سرور سان ڪم ڪرڻ لاءِ ڪمانڊ: create , show, use, and others , command help- ڪمانڊن جي مڪمل فهرست ڏيندو. مخصوص جدول سان ڪم ڪرڻ جا سوال: select , insert, delete۽ ٻيا. تمام گهڻي اونهي نه وڃو، اتي هڪ موقعو آهي ته صرف حڪم پڙهڻ کان صرف ننڍڙو حصو ياد ڪيو ويندو. توهان وقت سان گڏ سڀ ڪجهه سکندا. توھان MySQL ٽرمينل ۾ راند ڪري سگھو ٿا، ڊيٽابيس ٺاھيو، ٽيبل ٺاھيو، انھن کي ڀريو، ڊيٽا کي ڊسپلي ڪرڻ لاءِ درخواست ڪريو، سوالن جا معيار شامل ڪريو. گهڻو ڪري، اهو توهان کي 2-3 ڪلاڪن کان وڌيڪ نه وٺندو؛ جيڪڏهن اهو ڊگهو آهي، پريشان نه ڪريو، تجربي سان توهان نئين مواد کي تيزيء سان مهارت حاصل ڪندا. جيڪڏهن توهان کي بيز سان ڪو مسئلو ناهي، ته پوء توهان راند کي ترقي ڪرڻ شروع ڪري سگهو ٿا، انهي راند جي بنياد تي جيڪا مون اڳ ۾ ئي ٽڪ-ٽيڪ ٽو بابت لکيو آهي.. تمام گهڻي وقت تائين مان سمجهي نه سگهيو آهيان ته ملٽي پليئر کي ڪيئن لاڳو ڪجي، مون هڪ ڊيٽابيس استعمال ڪرڻ ۾ هڪ حل ڳولي لڌو. راند جو عمل فرض ڪري ٿو ته رانديگرن کي موڙ وٺي، راند ۾ سڀ تبديليون ڊيٽابيس ۾ رڪارڊ ٿيل آهن. اڳ ۾ ئي ان جي بنياد تي، اسان سمجهون ٿا ته اسان وٽ هڪ پليئر آهي ۽ اتي هڪ راند جو ميدان آهي جنهن ۾ رانديگرن جا لنڪ شامل آهن، اهو راند جي ميدان ۾ آهي ته منطق کي ڳنڍڻ گهرجي جنهن ۾ هڪ رانديگر ٻئي رانديگر جي هلڻ جو انتظار ڪري رهيو آهي. ۽ جنهن کان پوءِ انهن جا ڪردار بدلجن ٿا ۽ پهريون پليئر هڪ حرڪت ڪري ٿو، ۽ ٻيو انتظار ڪري ٿو. ۽ جيئن ته سڀني تبديلين کي ڊيٽابيس ۾ نقل ڪيو وڃي، هر حرڪت کان پوء اسان کي فيلڊ کي بچائڻ جي ضرورت آهي. تنهنڪري اسان پهرين نتيجي تي پهتاسين، ڊيٽابيس ۾ راند جو ميدان هجڻ ضروري آهي ۽ جيئن ته اسان ملٽي پليئر بابت ڳالهائي رهيا آهيون، اسان کي اتي رانديگرن کي شامل ڪرڻ جي ضرورت آهي. اچو ته MySQL ۾ ٽيبل ٺاهيون، مون ان کي مقامي طور تي ڪيو، mysql ٽرمينل ونڊو ذريعي. راند جي ميدان ۾ رانديگرن جون لنڪس شامل آهن، تنهنڪري اهو منطقي هوندو ته پهريان رانديگرن سان گڏ ٽيبل ٺاهيو. اسان جا رانديگر آهن:
  • id- ترتيب نمبر، اسان ان کي بنيادي ڪنجي ٺاهيندا آهيون؛
  • name- عام نالو، تار؛
  • wins- فتوحات جو تعداد؛
  • loses- زخمن جو تعداد؛
  • games- راند ڪيل راندين جو ڪل تعداد.
راند جي ٽيبل:
  • id- ترتيب نمبر، اسان ان کي بنيادي ڪنجي ٺاهيندا آهيون؛
  • x- پليئر کيڏڻ جي سڃاڻپ х- ثانوي ڪي؛
  • o- پليئر کيڏڻ جي سڃاڻپ o- ثانوي ڪي؛
  • field- فيلڊ پاڻ، ان جي فارميٽ هيٺ بيان ڪيو ويندو؛
  • status- اهو ضروري آهي ته ملٽي پليئر صحيح طريقي سان ڪم ڪرڻ لاءِ، اسٽيٽس راند جي حالت کي بيان ڪري ٿي:
    ٺاهيل، راند، راند ختم

  • current- ملٽي پليئر لاءِ پڻ، خاص طور تي راند دوران هي فيلڊ سنڀاليندو آهي جنهن جو موڙ هاڻي آهي،
    ۽ آخر کان پوءِ اهو اعلان ڪري ٿو فاتح يا ڊراءِ

اسان جدولن کي ترتيب ڏئي ڇڏيو آهي، هاڻي اسان کي جاوا ڪلاس ٺاهڻ جي ضرورت آهي لاڳاپيل شعبن سان - 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;
}
اچو ته هڪ خالي ڪنسٽرڪٽر شامل ڪريون بغير پيراميٽر جي - ڊيٽابيس سان ڪم ڪرڻ لاءِ ۽ ٻيو ڪنسٽرڪٽر جنهن سان اسان شيون ٺاهينداسين. اچو ته سڀني شعبن لاء سيٽرز ۽ حاصل ڪندڙن کي شامل ڪريو. هاڻي اچو ته هائبرنيٽ سان ڊيل ڪريو :) اهو ڪلاڪ کان ڪلاڪ تائين آسان ناهي. اهو MySQL جي ڀيٽ ۾ ٿورڙو وڌيڪ پيچيده آهي، آئون جلدي عام ڍانچي تي ويندس. ٻيهر، هر شيء ايترو پيچيده ناهي، بنياديات ڪنهن به ٽيوٽوريل ذريعي ڪجهه ڪلاڪن ۾ سکي سگهجي ٿو، ۽ اهو بهتر آهي ته توهان جي منصوبن کي لکڻ دوران گہرائي ۾ مطالعو ڪيو وڃي. JAVA جي ڊيٽابيس سان ڪم ڪرڻ ۾ JDBC استعمال ڪرڻ شامل آهي، ان بابت پڙهو وڪي تي . پر جيڪڏھن توھان ان کي ڪوڊ لکڻ ۾ استعمال ڪندا، اھو مقعد ۾ تمام گھڻو درد آڻيندو ، DAO ڪلاس لکڻ ۾ ڪجھ پيچيدگي ( پڻ ھڪڙو وڪي )، hibernate صورتحال کي ٿورو بهتر بڻائيندو، ان سان توھان کي تمام گھٽ بار بار ٿيندو ) ڪوڊ. ڪم ڪرڻ لاءِ hibernate لاءِ، توھان کي ھڪڙي لائبريريءَ کي پروجيڪٽ سان ڳنڍڻ جي ضرورت آھي، ھي ڪم بلڪل آسانيءَ سان ڪيو ويندو آھي: Ctrl+Alt+Shift+S(فائل-پروجيڪٽ جو ڍانچو)، وڃو لائبريريون ٽيب، ڪلڪ ڪريو "+" ۽ شامل ڪريو. اڳ ۾ ڊائون لوڊ ٿيل لائبريري ( هڪ اختيار جي طور تي، هتان کان ). ڪلاسن کي ڳنڍڻ لاءِ Userتوهان کي Gameتشريحون استعمال ڪرڻ گهرجن - اهي استعمال ڪرڻ بلڪل آسان آهن، انهن سان گڏ ڪوڊ هن طرح نظر اچي ٿو:
@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- چوي ٿو ته ڪلاس هڪ "اسٽريٽ" آهي، سادي لفظن ۾، اهو ڊيٽابيس ۾ ٽيبل سان ڳنڍيل آهي.
  • @Table(name="games")- چوي ٿو ڪهڙي ٽيبل، games- ڊيٽابيس ۾ ٽيبل جو نالو
  • @Id, @GeneratedValue, @Column(name = "id")- انهن ٽنهي تشريحن سان اسان اهو ظاهر ڪريون ٿا ته هي فيلڊ هڪ سڃاڻپ جي ميدان آهي، اهو خودڪار طور تي ٺاهيل آهي، ۽ ڊيٽابيس ۾ ڪالمن کي 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();
            }
        }
    }
}
ڊيٽابيس ۾ نئين استعمال ڪندڙ کي شامل ڪرڻ جو عمل ائين ئي نظر اچي ٿو. مهرباني ڪري نوٽ ڪريو ته صرف هڪ شئي جي ڪلاس جو طريقو پاس ڪيو ويو آهي؛ هتي ڪا به اضافي معلومات گهربل ناهي. انهي حقيقت کي يقيني بڻايو وڃي ٿو ته اسان حاصل ڪريون ٿا تيار ٿيل ڪميونيڪيشن سيشن سان گڏ ڊيٽابيس سان 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>
جيڪڏهن توهان ٽيگ تي نظر وجهو، اهو واضح ٿي ويندو ته اسان هتي ڇا ۽ ڪيئن ترتيب ڏئي رهيا آهيون. hibernate جي هڪ ٻي خاصيت اها آهي ته جيڪڏهن اسان اوچتو ئي 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);
    }

}
ڊيٽابيس سان ڪم ڪرڻ لاءِ ڪوڊ مڪمل ٿي چڪو آهي، اسان تبديلين کي مدنظر رکندي راند جي منطق کي ٻيهر لکون ٿا. پهرين، اچو ته مکيه لانچنگ طريقي کي الڳ ڪلاس ۾ الڳ ڪريون Main، اهو صرف هڪ ڪنٽرول ڪلاس هوندو - هڪ راند مينيو جنهن ۾ توهان راند شروع ڪري سگهو ٿا يا انگ اکر ڏسي سگهو ٿا. اچو ته ھڪڙو ڪلاس ٺاھيو GameLogicجيڪو راند جي سڀني منطق کي بيان ڪندو ۽ راند جي ميدان کي جانچيندو. هو راند جي ميدان تي سڀني تبديلين جي بچت ۽ راند کان پوءِ پليئر جي انگن اکرن کي سروس پرت ڏانهن موڪليندو. هتي هڪ دلچسپ خصوصيت آهي: اسان وٽ راندين جي ميدان تي مشتمل آهي arrays جي صورت ۾، اهي ڊيٽابيس ۾ محفوظ ٿي سگهن ٿا، پر هن مرحلي ۾ مون فيصلو ڪيو ته ڦيٿي کي ٻيهر ٺاهيو ۽ منهنجي ڊيٽابيس ۾ فيلڊ هڪ int جي طور تي مشتمل آهي، يعني هڪ 9. -ڊجيٽ نمبر، جيڪو ڪلاس جي طريقن کي استعمال ڪندي ٻن ذريعي پارس ڪيو ويو آهي GameLogic، مان ائين ڪرڻ جي سفارش نه ٿو ڪريان، مان راند جي ايندڙ رليز ۾ بهتر ڪندس :) JAVA سکڻ ۾ سڀني کي سٺي قسمت! توھان ڊائون لوڊ ڪري سگھو ٿا پروجيڪٽ هتي .
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION