JavaRush /Java blogi /Random-UZ /Yangi boshlanuvchilar uchun Java o'yin
timurnav
Daraja

Yangi boshlanuvchilar uchun Java o'yin

Guruhda nashr etilgan
Salom do'stlar va kelajakdagi hamkasblar! Yangi boshlanuvchilar uchun Java o'yini - 1Yaqinda men haqiqiy loyihada ishtirok etish uchun test topshirdim, uni topshirdim, lekin shunday bo'ldiki, shaxsiy sharoitlarim tufayli men RPning o'zida qatnasha olmadim. RP testi kabi qiziqarli muammolardan so'ng, odatdagi kurs muammolari kamroq jozibali o'yin-kulgiga aylandi, ayniqsa men ularning aksariyatini hal qilganim uchun. Shuning uchun, o'rganishni davom ettirish uchun mening iste'dodim behuda ketmasligi uchun men ko'p o'yinchi veb-o'yinini yaratishga qaror qildim. Boshqa o'yinlarga havolalar:
  1. ushbu maqolaning davomi
  2. 2048
Tic Tac Toe men uchun eng oddiy o'yin bo'lib tuyuldi, shuning uchun men vazifani bir nechta kichik vazifalarga ajratishga qaror qildim:
  1. O'yin mantiqini sinab ko'rish uchun konsol ilovasi
  2. Ko‘p o‘yinchi
  3. O'yinchi ma'lumotlar bazasini konsol ilovasiga biriktirish
  4. Frontend dizaynini yaratish, sahifa shablonlarini yozish, o'yin interfeysi
  5. Hammasini bir joyga qo'yish
Meni bunday ketma-ketlik uchun tanqid qilish ehtimoli bor va barcha jiddiy loyihalar butunlay boshqacha ketma-ketlikda qurilgan, men darhol javob beraman, bu haqda "yangi boshlanuvchilar uchun" post yozaman, shunda hamma (shu jumladan men) buni o'rganish mumkin :) Xo'sh, keling, konsol ilovasini yozishni boshlaylik! Men 20-darajali katta topshiriqlar bilan bir xil qadamlarni bajaraman. Tik-tak-toe o'yinida nima bor?!
  1. maydon
  2. navbatma-navbat ikkita o'yinchi, biri xoch qo'yadi, ikkinchisi nol. hammasi oddiy.
Biz maydonni standart 3x3 maydonga aylantiramiz. Bunday maydonni qanday saqlash mumkin? birinchi variant ikki o'lchovli massivdir. Ushbu massiv qanday elementlarni o'z ichiga olishi kerak? Javob shundaki, biz ushbu elementlar bilan nima qilishimiz haqida o'ylashimiz kerak, bu g'olibni topish uchun ko'rsatish va taqqoslashdir. Agar biz ularni faqat ekranda ko'rsatgan bo'lsak, ularni satr sifatida saqlash mantiqan to'g'ri bo'lar edi, keyin massivning o'zi va uni ekranda tsiklda ko'rsatish quyidagicha ko'rinadi:
String[][] strings = {{"O", "O", "_"},
                    {"_", "X", "O"},
                    {"X", "X", "X"},
for (String [] ss : strings){
    for (String s : ss) System.out.print(s + " ");
    System.out.println(); //для перевода строки
}
ekranda ko'rsatiladi:
O O _
_ X O
X X X
Ammo ko'rsatishdan tashqari, bizda qiymatlarni taqqoslash ham mavjud va bu erda variantlar allaqachon mumkin. Siz satrlarni solishtirishingiz mumkin, siz maxsus sanab sinfini yaratishingiz mumkin ( enum), lekin men raqamlarni solishtirishni va ularni faqat ekranda ko'rsatilganda "X" va "O" bilan almashtirishni afzal ko'raman. Masalan, 1 - "X", 2 - "O", 0 - "_" bo'lsin. Xo'sh, uchlik X yoki O mosligi uchun maydonni qanday tekshirish mumkin?
Birinchi algoritm butun maydonni tekshirishdir
int[][] canvas = {{00, 01, 02},
                 {10, 11, 12},
                 {20, 21, 22}}
G'olib kombinatsiyalar:
00-01-02, 10-11-12, 20-21-22, 00-10-20, 01-11-21, 02-12-22, 00-11-22, 20-11-02 — всего 8.
Raqamlarni solishtirish orqali tekshirish, lekin siz har safar BUTUN maydonni, barcha 8 kombinatsiyani tekshirishingiz kerak bo'ladi. Albatta, bu unchalik ko'p emas, bu 0 dan 1 milliardgacha bo'lgan Armstrong raqamlarini qidirish emas, bu erda hech qanday hisob-kitoblar yo'q, lekin siz hali ham butun maydonni tekshirishdan ko'ra maqbulroq narsani xohlaysiz. Menga kelgan ikkinchi fikr faqat oldingi harakatda belgilangan katakchani tekshirish edi, shuning uchun biz hali ham g'olibni aniqlashimiz mumkin, chunki bu harakatni kim amalga oshirganini bilib olamiz. Shunday qilib, barcha 8 kombinatsiya o'rniga biz hujayraga qarab atigi 2, 3 yoki 4 kombinatsiyani olamiz, rasmga qarang: Yangi boshlanuvchilar uchun Java o'yini - 2Endi biz qaysi kombinatsiyani ishga tushirish kerakligini aniqlashimiz kerakmi? Bu erda men ikki o'lchovli massivdan foydalanish unchalik qulay emasligini angladim. Men boshqa variantlarni ko'rib chiqishga qaror qildim. Avvaliga men maydonni to'qqiz xonali raqamda saqlash mumkin degan fikrga keldim, masalan, biz ekranda ko'rsatgan maydonni quyidagicha yozish mumkin: 220012111, men barmoqlarim bilan tushuntiraman Bu... Kod bir xil, 1 - “X”, 2 - “O” , 0 – " ", bu 220012111 = "OO__XOXXX" degan ma'noni anglatadi yoki har uchinchi raqamdan keyin qator uzilishi va bo'sh joy qo'shsangiz. aniqlik:
О О _
_ Х О
Х Х Х
bu erda yana saqlash uchun qulay, displey uchun qurilma ixtiro qilindi, lekin taqqoslash uchun noqulay! Yacheykalarni 1 dan 9 gacha raqamlaganimda yechim topildi, keyin o‘ylab qoldim, chunki dasturlashda ortga hisoblash 0 dan boshlanadi va rasmdagi kabi raqamlangan.. Yangi boshlanuvchilar uchun Java o'yini - 3Hech qanday o‘ziga xoslikni sezmadingizmi? agar siz yuqoridagi rasmga qarasangiz, 2 kombinatsiyadan iborat echimlar toq seriya raqamiga ega, 4 kombinatsiyada seriya raqami 4, 3 kombinatsiyada qolganlari borligi aniq bo'ladi. Shunday qilib, siz o'yin maydonini muntazam raqamlar qatorida saqlashingiz kerak degan xulosaga keldim: raqamlar orasidagi oddiy iteratsiya, tanlangan algoritmga muvofiq taqqoslash qobiliyati, ekranga oddiy chiqish. Taqqoslash algoritmining o'ziga kelsak. Keling, tartibda boraylik: barcha variantlarda qator va ustunni tekshirish mavjud, biz faqat ularni tekshiramiz. agar qidiruv natijasi bo'lmasa, biz hujayra raqamini juft/toq ekanligini tekshiramiz, agar u toq bo'lsa, biz o'yinga qaytamiz, keyingi tekshirishning ma'nosi yo'q, agar u juft bo'lsa, ushbu katakchada joylashgan yoki yo'qligini tekshiramiz. chap diagonal, 4 ga bo'linganda bu diagonalning raqamlari 0 qoldiqga ega. Agar u yolg'on bo'lsa, biz gugurtlarni tekshiramiz, agar moslik topilmasa, 4 raqamini tekshiramiz, agar topilmasa, o'yinga qaytamiz, agar ha, biz kod orqali davom etamiz va oxirgi diagonalni tekshirish natijasini qaytaramiz. Ehtimol, tayyor bo'lmagan odam uchun yuqoridagi harflar to'plamini o'qib chiqqandan keyin buni tushunish qiyin, lekin kimdir kodning o'zida juda ko'p harflar borligini aytishi mumkin, bu oddiyroq bo'lishi mumkin, men buni muhokama qilishdan xursand bo'laman. Biz maydonni saralab oldik, endi biz navbatma-navbat ishlaydigan ikkita foydalanuvchi bilan ishlashimiz kerak va ularning har biri o'z belgisiga ega, X yoki O. Birinchi bosqichda bizda ko'p foydalanuvchi funksiyasi yo'q, shuning uchun Eng oson yo'li piktogrammalarni birma-bir ishlatishdir. X har doim birinchi harakatni qiladi, O har doim ikkinchi qiladi, keyin yana X qiladi va hokazo. Bu tekshirilishini so'raydi ( rost/noto'g'ri ) va agar rost bo'lsa - joriy o'yinchi X, agar noto'g'ri bo'lsa - u holda O va har bir harakat boshida bayroq=!flag Bu qandaydir tarzda o'yinchilardan qaysi haqida signal olish uchun qoladi. ular tanlagan hujayra. Bu erda bizga unutilmas BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); o'yinchilar kerak bo'ladi konsolga hujayra raqamlarini kiritishadi va Enter tugmasini bosish harakatni amalga oshiradi. Kiritilgan raqamga mos keladigan katak yuqoridagi paragrafda muhokama qilingan katakchaning joriy holatiga qarab qiymatini 0 dan 1 yoki 2 ga o'zgartiradi. Hujayra allaqachon to'ldirilgan bo'lsa, hech kim X ni O ga o'zgartira olmasligi uchun kiritilgan ma'lumotlarni tekshirish muhim. :) O'yinchi konsolga nimani kiritishi mumkin?
  1. bo'sh qator
  2. harflar, tinish belgilari, qavslar... bir so'z bilan, raqamlar bo'lmagan
  3. noto'g'ri raqamlar - manfiy yoki massiv o'lchamidan tashqarida, ishg'ol qilingan hujayralar.
Satrdan raqam olishning standart usuli Integer sinfining statik parseInt usuli hisoblanadi.U berilgan satrdan raqam ololmasa, Integer.parseInt("2");istisno qiladi.Biz ushbu istisnoni ushlab turish orqali dastlabki ikki nuqtadan himoyani taʼminlay olamiz. NumberFormatExceptionUchinchi nuqta uchun men kiritilgan qiymatni tekshiradigan boshqa usulni yaratgan bo'lardim, lekin string so'rovini tekshirish amalga oshiriladigan alohida usulga o'tkazish eng to'g'ri bo'ladi va u faqat raqamni qaytaradi. Xulosa qilib aytadigan bo'lsak, biz maydon yaratdik, uni ko'rsatadigan usul yaratdik, "bu o'yinchi bir soat ichida g'alaba qozondimi?" Degan usulni yaratdik va kiritilgan raqamlarni tasdiqladik. Juda oz narsa qoldi, durang borligini tekshiring - massiv bo'ylab o'tadigan va 0 ni qidiradigan va o'yin natijalarini ko'rsatadigan alohida usul. Hammasi shu, kod tayyor, o'yin kichik bo'lib chiqdi, faqat bitta sinf, shuning uchun qattiq nusxa ko'chirish-pasterlar tushunmasdan, hamma narsani o'z loyihasiga nusxalashlari va o'zlari boshqarishlari mumkin, men o'zim ham shunday edim, lekin endi buni qilmaslikka harakat qilaman va hech kimga tavsiya qilmayman :) JAVA ni o'rganishda hammaga omad! ps qolgan nuqtalar - multiplayer va ma'lumotlar bazasi keyinroq keladi, men allaqachon materialni o'rganishni boshladim :)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class GameField {

    static int [] canvas = {0,0,0,
                            0,0,0,
                            0,0,0};

    //012, 345, 678, 036, 147, 258, 048, 246
    public static void main(String[] args){

        boolean b;
        boolean isCurrentX = false;
        do {
            isCurrentX = !isCurrentX;
            drawCanvas();
            System.out.println("mark " + (isCurrentX ? "X" : "O"));
            int n = getNumber();
            canvas[n] = isCurrentX ? 1 : 2;
            b = !isGameOver(n);
            if (isDraw()){
                System.out.println("Draw");
                return;
            }
        } while (b);
        drawCanvas();
        System.out.println();

        System.out.println("The winner is " + (isCurrentX ? "X" : "O") + "!");
    }

    static int getNumber(){
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        while (true){
            try {
                int n = Integer.parseInt(reader.readLine());
                if (n >= 0 && n < canvas.length && canvas[n]==0){
                    return n;
                }
                System.out.println("Choose free cell and enter its number");
            } catch (NumberFormatException e) {
                System.out.println("Please enter the number");
            } catch (IOException e) {
            }
        }
    }

    static boolean isGameOver(int n){
        // 0 1 2
        // 3 4 5
        // 6 7 8
        //поиск совпадений по горизонтали
        int row = n-n%3; //номер строки - проверяем только её
        if (canvas[row]==canvas[row+1] &&
                canvas[row]==canvas[row+2]) return true;
        //поиск совпадений по вертикали
        int column = n%3; //номер столбца - проверяем только его
        if (canvas[column]==canvas[column+3])
            if (canvas[column]==canvas[column+6]) return true;
        //мы здесь, значит, первый поиск не положительного результата
        //если meaning n находится на одной из граней - возвращаем false
        if (n%2!=0) return false;
        //проверяем принадлежит ли к левой диагонали meaning
        if (n%4==0){
            //проверяем есть ли совпадения на левой диагонали
            if (canvas[0] == canvas[4] &&
                    canvas[0] == canvas[8]) return true;
            if (n!=4) return false;
        }
        return canvas[2] == canvas[4] &&
                canvas[2] == canvas[6];
    }

    static void drawCanvas(){
        System.out.println("     |     |     ");
        for (int i = 0; i < canvas.length; i++) {
            if (i!=0){
                if (i%3==0) {
                    System.out.println();
                    System.out.println("_____|_____|_____");
                    System.out.println("     |     |     ");
                }
                else
                    System.out.print("|");
            }

            if (canvas[i]==0) System.out.print("  " + i + "  ");
            if (canvas[i]==1) System.out.print("  X  ");
            if (canvas[i]==2) System.out.print("  O  ");
        }
        System.out.println();
        System.out.println("     |     |     ");
    }

    public static boolean isDraw() {
        for (int n : canvas) if (n==0) return false;
        return true;
    }
}
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION