JavaRush /جاوا بلاگ /Random-UR /جاوا میں ملٹی پلیئر کنسول گیم
timurnav
سطح

جاوا میں ملٹی پلیئر کنسول گیم

گروپ میں شائع ہوا۔
سب کو ہیلو، میں نے گیم لکھنا کافی عرصہ پہلے ہی ختم کر دیا ہے، لیکن میں ابھی تک مضمون لکھنے کے لیے تیار نہیں ہوا، یہ اس تحریر کا ایک منطقی تسلسل ہے ۔ اگر آپ نے ابھی تک کچھ اور کرنے کی کوشش نہیں کی ہے۔ JavaRush کے کاموں کے مقابلے میں، پھر گیم سے واقف ہونا بالکل وہی ہوگا جہاں سے آپ شروع کرنا چاہتے ہیں، آپ کو ایک حقیقی پروجیکٹ کے ٹیسٹ ٹاسکس کی تیاری شروع کرنے کی ضرورت ہوگی، جس میں میں ہر ایک کو حصہ لینے کی پرزور سفارش کرتا ہوں۔ اور عام طور پر، اب وقت آگیا ہے کہ خلا میں کروی پروگرامر بننا چھوڑ دیں اور جاوا کور سے باہر کچھ سیکھنا شروع کریں۔ صرف گیم دیکھنے کے لیے، آپ کے پاس MySQL انسٹال ہونا ضروری ہے، اگر آپ نے اسے ابھی تک استعمال نہیں کیا ہے، تو ہچکچاہٹ نہ کریں - اسے انسٹال کریں، یہ ان ڈیٹا بیس میں سے ایک ہے جسے آپ اپنے کام اور ذاتی پروجیکٹس میں استعمال کریں گے! میں ڈیٹا بیس کو انسٹال کرنے اور اس کے ساتھ کام کرنے کی تفصیل نہیں دوں گا؛ انٹرنیٹ پر بہت سارے ٹیوٹوریلز اور ویڈیوز موجود ہیں؛ میں آپ کو خود اس کا اندازہ لگانے کا مشورہ دیتا ہوں، یہ بھی ایک پروگرامر کی سب سے اہم مہارتوں میں سے ایک ہے۔ اسے اپنے طور پر باہر نکالیں :) زندگی میں، آپ کو sql میں، مقامی طور پر، اور JDBC، hibernate ، spring، spring data کے ذریعے سوالات لکھنے کی صلاحیت کی ضرورت ہوگی، شاید فہرست کو جاری رکھا جا سکتا ہے، لیکن میرا علم وہیں ختم ہوتا ہے۔ اب اس آرٹیکل کو پڑھنا بند کریں اور MySQL کا پتہ لگائیں، یہ درحقیقت مشکل نہیں ہے، آپ کو سرور خود انسٹال کرنا ہوگا، وہاں صرف لاگ ان اور پاس ورڈ موجود ہیں۔ پھر اس کے بارے میں پڑھیں کہ کام کرتے وقت کون سے کمانڈ استعمال ہوتے ہیں۔ سرور کے ساتھ کام کرنے کے لیے کمانڈز: create , show, use, اور دیگر، کمانڈ 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 کلاسز ( ایک وکی بھی ) لکھنے میں کچھ پیچیدگیاں ہوں گی ، ہائبرنیٹ سے صورت حال میں کچھ بہتری آئے گی، اس کے ساتھ آپ کو دہرائے جانے والے بہت کم ہوں گے۔ ) کوڈ۔ ہائبرنیٹ کے کام کرنے کے لیے، آپ کو ایک لائبریری کو پروجیکٹ سے جوڑنے کی ضرورت ہے، یہ بہت آسانی سے کیا جاتا ہے: 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 کی سطح اور سروس کی سطح۔ اگر ہم ویکیوم حالات میں ہر چیز کو آسان بناتے ہیں، تو ڈیٹا کے ساتھ کام سروس لیول سے گزرتا ہے، یہ تجریدی سطحوں میں سے ایک ہے، یہ آپ کو ایپلی کیشن کو مزید آزادانہ کام کرنے کی اجازت دیتا ہے، تاکہ گیم لاجک کا ڈویلپر تفصیلات میں نہ جائے۔ ڈیٹا بیس تک رسائی کو ترتیب دینے کا، یا مثال کے طور پر، اگر اچانک ہم نے سادہ ہائبرنیٹ کے بجائے موسم بہار کو استعمال کرنے کا فیصلہ کیا، تو تبدیلیاں سروس لیئر سے آگے نہیں بڑھیں گی، جس کے بغیر آدھی درخواست کو دوبارہ لکھنا پڑے گا! یہ ڈیزائن پیٹرن میں سے ایک ہے. آئیے ڈی اے او لیول لکھنا شروع کریں۔
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();
            }
        }
    }
}
ڈیٹا بیس میں نئے صارف کو شامل کرنے کا عمل ایسا لگتا ہے۔ براہ کرم نوٹ کریں کہ صرف entity کلاس کی ایک چیز کو طریقہ میں پاس کیا جاتا ہے؛ یہاں کسی اضافی معلومات کی ضرورت نہیں ہے۔ یہ اس حقیقت سے یقینی ہے کہ ہمیں 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 لیئر تیار ہے، آئیے ایک سروس لیئر بنائیں۔ سروس لیئر میں ڈی اے او آبجیکٹ بنانے سے بچنے کے لیے، ہم فیکٹری پیٹرن کا استعمال کرتے ہیں۔
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جو کھیل کی تمام منطق اور کھیل کے میدان کی جانچ پڑتال کو بیان کرے گی۔ وہ کھیل کے میدان میں ہونے والی تمام تبدیلیوں اور کھیل کے بعد کھلاڑی کے اعدادوشمار کی بچت سروس لیئر کو دے گا۔ ایک دلچسپ خصوصیت ہے، ہم کھیل کے میدان کو صفوں کی شکل میں رکھتے ہیں، انہیں ڈیٹا بیس میں محفوظ کیا جا سکتا ہے، لیکن اس مرحلے پر میں نے وہیل کو دوبارہ ایجاد کرنے کا فیصلہ کیا اور اپنے ڈیٹا بیس میں یہ فیلڈ ایک int کے طور پر موجود ہے، یعنی ایک 9۔ - ہندسوں کا نمبر، جسے کلاس کے طریقوں کا استعمال کرتے ہوئے دو کے ذریعے پارس کیا جاتا ہے GameLogic، میں ایسا کرنے کی سفارش نہیں کرتا، میں گیم کی اگلی ریلیز میں بہتری لاؤں گا :) JAVA سیکھنے میں سب کے لیے گڈ لک! آپ یہاں پراجیکٹ کو ڈاؤن لوڈ کر سکتے ہیں ۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION