JavaRush /وبلاگ جاوا /Random-FA /بازی کنسول چند نفره در جاوا
timurnav
مرحله

بازی کنسول چند نفره در جاوا

در گروه منتشر شد
سلام به همه، من خیلی وقت است که نوشتن بازی را تمام کرده ام، اما هنوز به نوشتن مقاله نرسیده ام، این ادامه منطقی این نوشته است . اگر هنوز سعی نکرده اید کار دیگری انجام دهید نسبت به وظایف JavaRush، پس آشنایی با بازی دقیقاً همان جایی است که می خواهید شروع کنید، باید برای کارهای آزمایشی یک پروژه واقعی آماده شوید، که من به شدت به همه توصیه می کنم در آن شرکت کنند. و به طور کلی، زمان آن رسیده است که برنامه نویس کروی در خلاء نباشید و شروع به یادگیری چیزی خارج از هسته جاوا کنید. برای اینکه بتوانید به سادگی بازی را تماشا کنید، باید MySQL را نصب کرده باشید، اگر هنوز از آن استفاده نکرده اید، شک نکنید - آن را نصب کنید، این یکی از آن بانک های اطلاعاتی است که در پروژه های کاری و شخصی خود از آن استفاده خواهید کرد! من توضیحی در مورد نصب و کار با پایگاه داده نمی دهم؛ آموزش ها و ویدیوهای زیادی در اینترنت وجود دارد؛ توصیه می کنم خودتان این را بفهمید، این نیز یکی از مهم ترین مهارت های یک برنامه نویس است - رقم زدن. آن را به تنهایی انجام دهید :) در زندگی، به توانایی نوشتن پرس و جو در sql، بومی، و از طریق JDBC، hibernate ، بهار، بهار داده نیاز دارید، شاید بتوان لیست را ادامه داد، اما دانش من به همین جا ختم می شود. اکنون خواندن این مقاله را متوقف کنید و 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;
}
بیایید یک سازنده خالی بدون پارامتر اضافه کنیم - برای کار با پایگاه داده و سازنده دیگری که با آن اشیاء ایجاد می کنیم. بیایید تنظیم کننده ها و دریافت کننده ها را برای همه فیلدها اضافه کنیم. حالا بیایید با hibernate کنار بیاییم :) ساعت به ساعت راحت تر نمی شود. این کمی پیچیده تر از MySQL است، من به سرعت ساختار کلی را مرور خواهم کرد. باز هم، همه چیز آنقدر پیچیده نیست، اصول اولیه را می توان از طریق هر آموزشی در چند ساعت یاد گرفت، و بهتر است در حین نوشتن پروژه های خود به طور عمیق مطالعه کنید. کار با پایگاه داده از JAVA شامل استفاده از JDBC است، در مورد آن در ویکی بخوانید . اما اگر از آن در نوشتن کد استفاده کنید، درد زیادی در مقعد به همراه خواهد داشت ، پیچیدگی در نوشتن کلاس های DAO ( همچنین یک ویکی )، hibernate وضعیت را کمی بهبود می بخشد، با آن شما تکرار بسیار کمتری خواهید داشت (قالب ) کد. برای اینکه hibernate کار کند، باید یک کتابخانه را به پروژه متصل کنید، این کار خیلی ساده انجام می شود: Ctrl+Alt+Shift+S(File-Project Structure)، به تب Libraries بروید، روی «+» کلیک کنید و یک عدد اضافه کنید. کتابخانه از پیش دانلود شده ( به عنوان یک گزینه، از اینجا ). برای پیوند دادن کلاس ها 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 و سطح خدمات. اگر همه چیز را به شرایط خلاء ساده کنیم، سپس کار با داده ها از سطح خدمات عبور می کند، این یکی از سطوح انتزاعی است، به شما امکان می دهد برنامه را مستقل تر کنید تا توسعه دهنده منطق بازی وارد جزئیات نشود. راه اندازی دسترسی به پایگاه داده یا مثلاً اگر ناگهان به جای hibernate ساده تصمیم گرفتیم از فنر استفاده کنیم، تغییرات از لایه سرویس فراتر نمی رود که بدون آن نیمی از برنامه باید بازنویسی شود! این یکی از الگوهای طراحی است. بیایید شروع به نوشتن سطح 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 است که ما به پروژه خود متصل کردیم. برای عملکرد صحیح، تنها چیزی که باقی می ماند پر کردن فایل پیکربندی 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که تمام منطق بازی و بررسی زمین بازی را توصیف کند. او ذخیره تمام تغییرات در زمین بازی و آمار بازیکنان بعد از بازی را به لایه سرویس واگذار می کند. یک ویژگی جالب وجود دارد: ما زمین بازی را در قالب آرایه ها داریم، آنها را می توان در پایگاه داده ذخیره کرد، اما در این مرحله تصمیم گرفتم چرخ را دوباره اختراع کنم و در پایگاه داده من این فیلد به عنوان یک int، یعنی یک 9 وجود دارد. عدد - رقمی که با استفاده از متدهای کلاس به دو صورت تجزیه می شود GameLogic، انجام این کار را توصیه نمی کنم، در نسخه های بعدی بازی بهبود خواهم یافت :) برای همه در یادگیری JAVA موفق باشید! می توانید پروژه را از اینجا دانلود کنید .
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION