JavaRush /Java блогы /Random-KK /Жаңадан бастаушыларға арналған Java ойыны
timurnav
Деңгей

Жаңадан бастаушыларға арналған Java ойыны

Топта жарияланған
Сәлем достар және болашақ әріптестер! Жаңадан бастаушыларға арналған Java ойыны - 1Жақында мен нақты жобаға қатысу үшін тест тапсырдым, одан өттім, бірақ жеке жағдайларға байланысты RP-ге қатыса алмадым. RP тесті сияқты қызықты есептерден кейін әдеттегі курстық есептер азырақ тартымды болды, әсіресе мен олардың көпшілігін шешіп қойғанмын. Сондықтан, оқуды жалғастыру үшін менің талантым босқа кетпеуі үшін мен көп ойыншыға арналған веб-ойын жасауды шештім. Басқа ойындарға сілтемелер:
  1. осы мақаланың жалғасы
  2. 2048
Tic Tac Toe маған ең қарапайым ойын болып көрінді, сондықтан мен тапсырманы бірнеше қосалқы тапсырмаларға бөлуді шештім:
  1. Ойын логикасын сынауға арналған консольдік қолданба
  2. Көп ойыншы
  3. Ойнатқыш дерекқорын консоль қолданбасына тіркеу
  4. Фронт дизайнын жасау, бет шаблондарын жазу, ойын интерфейсі
  5. Барлығын біріктіру
Маған осындай дәйектілік үшін ұрысу мүмкіндігі бар және барлық маңызды жобалар мүлдем басқа ретпен салынған, мен бірден жауап беремін, бұл туралы «жаңадан бастаушылар үшін» пост жазамын, сонда барлығы (соның ішінде мені де) Осыны үйренуге болады :) Ал, консольдік қосымшаны жазуды бастайық! Мен үлкен деңгейдегі 20 тапсырма сияқты қадамдарды орындаймын. Тик-так-тоу ойынында не бар?!
  1. өріс
  2. кезектесіп тұрған екі ойыншы, бірі крест, екіншісі нөл қояды. бәрі оңай.
Өрісті стандартты 3х3 өріске айналдырамыз. Мұндай өрісті қалай сақтауға болады? бірінші нұсқа - екі өлшемді массив. Бұл массив қандай элементтерден тұруы керек? Жауап мынада, біз осы элементтермен не істейтініміз туралы ойлануымыз керек, бұл жеңімпазды табу үшін көрсету және салыстыру. Егер біз оларды экранда ғана көрсететін болсақ, онда оларды жол ретінде сақтау қисынды болар еді, онда массивтің өзі және оны экранда циклде көрсету келесідей болады:
String[][] strings = {{"O", "O", "_"},
                    {"_", "X", "O"},
                    {"X", "X", "X"},
for (String [] ss : strings){
    for (String s : ss) System.out.print(s + " ");
    System.out.println(); //для перевода строки
}
экран келесіні көрсетеді:
O O _
_ X O
X X X
Бірақ дисплейден басқа, бізде мәндерді салыстыру да бар және мұнда опциялар қазірдің өзінде мүмкін. Жолдарды салыстыруға болады, арнайы санау класын ( enum) жасауға болады, бірақ мен сандарды салыстыруды және оларды экранда көрсетілгенде ғана «X» және «O» әрпімен ауыстырғанды ​​қалаймын. Мысалы, 1 - «Х», 2 - «О», 0 - «_» болсын. Сонымен, үштік X немесе O сәйкестігі үшін өрісті қалай тексеруге болады?
Ең бірінші алгоритм бүкіл өрісті тексеру болып табылады
int[][] canvas = {{00, 01, 02},
                 {10, 11, 12},
                 {20, 21, 22}}
Жеңіс комбинациялары:
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.
Сандарды салыстыру арқылы тексеру, бірақ әр жолы БАРЛЫҚ өрісті, барлық 8 комбинацияны тексеру керек болып шықты. Әрине, бұл көп емес, бұл 0-ден 1 миллиардқа дейінгі диапазондағы Армстронг сандарын іздеу емес, мұнда ешқандай есептеулер жоқ, бірақ сіз әлі де бүкіл өрісті тексеруден гөрі оңтайлы нәрсені қалайсыз. Маған келген екінші ой тек алдыңғы қозғалыста белгіленген ұяшықты тексеру болды, сондықтан біз жеңімпазды анықтай аламыз, өйткені бұл қозғалысты кім жасағанын білетін боламыз. Осылайша, барлық 8 комбинацияның орнына біз ұяшыққа байланысты тек 2, 3 немесе 4 комбинацияны аламыз, суретті қараңыз: Жаңадан бастаушыларға арналған Java ойыны - 2Енді қандай комбинацияны іске қосу керек екенін анықтау керек пе? Міне, мен екі өлшемді массивті пайдалану өте ыңғайлы емес екенін түсіндім. Мен басқа нұсқаларды қарастыруды шештім. Алдымен мен өрісті тоғыз таңбалы санда сақтауға болады деген ой келді, мысалы, экранда біз көрсеткен өрісті былай жазуға болады: 220012111, мен саусақтарыммен түсіндіремін бұл... Код бірдей, 1 - “X”, 2 - “O” , 0 – " ", бұл 220012111 = "OO__XOXXX" дегенді білдіреді немесе әрбір үшінші саннан кейін жол үзілімін енгізіп, бос орындар қоссаңыз. айқындық:
О О _
_ Х О
Х Х Х
мұнда тағы да сақтауға ыңғайлы, дисплейге арналған құрылғы ойлап табылды, бірақ салыстыру үшін ыңғайсыз! Шешімі 1-9 ұяшықтарды нөмірлегенде табылды, содан кейін ойладым, өйткені бағдарламалауда кері санақ 0-ден басталады және оны суреттегідей нөмірлейді.Ешқандай Жаңадан бастаушыларға арналған Java ойыны - 3ерекшеліктерді байқамадыңыз ба? егер сіз жоғарыдағы суретке қарасаңыз, 2 комбинациядан тұратын шешімдердің тақ сериялық нөмірі бар, 4 комбинацияның сериялық нөмірі 4, 3 комбинацияның қалғаны бар екені белгілі болады. Сондықтан мен ойын өрісін сандардың тұрақты массивінде сақтау керек деген қорытындыға келдім: сандар арасындағы қарапайым итерация, таңдалған алгоритм бойынша салыстыру мүмкіндігі, экранға қарапайым шығару. Салыстыру алгоритмінің өзіне келетін болсақ. Тәртіппен барайық: барлық опцияларда жол мен бағанды ​​тексеру бар, біз тек оларды тексереміз. егер іздеу нәтиже бермесе, ұяшық нөмірін жұп/тақ деп тексереміз, егер ол тақ болса, онда ойынға қайтамыз, әрі қарай тексерудің қажеті жоқ, егер ол жұп болса, бұл ұяшық ұяшықта жатқанын тексереміз. сол диагональ, 4-ке бөлгенде осы диагоналдың сандары 0 қалдығы болады. Егер ол өтірік болса, сәйкестіктерді тексереміз, егер сәйкестік табылмаса, онда 4 санын тексереміз, егер жоқ болса, ойынға ораламыз, егер иә, біз code арқылы әрі қарай өтіп, соңғы диагоналды тексеру нәтижесін қайтарамыз. Бәлкім, дайын емес адам үшін жоғарыдағы әріптер жинағын оқығаннан кейін мұны түсіну қиын, бірақ біреу codeтың өзінде көптеген әріптер бар деп айтуы мүмкін, бұл қарапайым болуы мүмкін, мен бұл туралы талқылауға қуаныштымын. Біз өрісті сұрыптадық, енді біз кезекпен келетін екі пайдаланушымен жұмыс істеуіміз керек және олардың әрқайсысының өзіндік X немесе O белгісі бар. Бірінші кезеңде бізде көп пайдаланушы функционалдығы жоқ, сондықтан ең оңай жолы белгішелерді бір-бірлеп пайдалану. Х әрқашан бірінші қозғалысты жасайды, О әрқашан екінші жасайды, содан кейін Х қайтадан жасайды және т.б. Ол тексеруді сұрайды ( true/false ), және егер шын болса – онда ағымдағы ойыншы Х, егер жалған болса – онда O және әрбір қозғалыстың басында жалау =!жалаушасы Ойыншылардан қандай да бір түрде бұл туралы сигнал алу үшін қалады. олар таңдайтын ұяшық. Мұнда бізге ұмытылмас BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); Ойыншылар қажет болады ұяшық нөмірлерін консольге енгізеді, ал Enter пернесін басу қозғалысты жасайды. Енгізілген нөмірге сәйкес ұяшық оның мәнін жоғарыдағы абзацта талқыланған құсбелгінің ағымдағы күйіне байланысты 0-ден 1 немесе 2-ге өзгертеді. Бұл жерде ұяшық толтырылған кезде ешкім X-ді O-ға өзгерте алмайтындай етіп енгізуді тексеру маңызды :) Ойыншы консольге не енгізе алады?
  1. бос жол
  2. әріптер, тыныс белгілері, жақша... бір сөзбен, сан емес
  3. дұрыс емес сандар - теріс немесе массив өлшемінен тыс, орналасқан ұяшықтар.
Жолдан цифрды алудың стандартты әдісі Integer класының статикалық parseInt әдісі болып табылады.Егер ол берілген жолдан цифр ала алмаса, Integer.parseInt("2");ерекше жағдайды шығарады.Бұл NumberFormatExceptionерекше жағдайды тоқтату арқылы алғашқы екі нүктеден қорғауды қамтамасыз ете аламыз. Үшінші тармақ үшін мен енгізілген мәнді тексеретін басқа әдісті жасайтын болар едім, бірақ жол сұрауын валидация орындалатын бөлек әдіске жылжыту ең дұрыс болады және ол тек санды қайтарады. Қорытындылай келе, біз өріс құрдық, оны көрсететін әдіс жасадық, «осы ойыншы бір сағатта жеңді ме?» тексеретін әдісті жасадық және енгізілген сандарды растадық. Өте аз қалды, ұтыс ойынын тексеріңіз - массив арқылы өтіп, 0-ді іздейтін және ойын нәтижелерін көрсететін бөлек әдіс. Барлығы, code дайын, ойын кішкентай болып шықты, тек бір класс, сондықтан қатал көшірушілер түсінбей, бәрін өз жобасына көшіріп, оны өздігінен іске қоса алады, мен де солай болдым, бірақ Енді мен мұны жасамауға тырысамын және ешкімге де ұсынбаймын :) JAVA тілін үйренуде барлығына сәттілік! ps қалған ұпайлар - көп ойыншы және дерекқор кейінірек келеді, мен материалды зерттеуді бастадым :)
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;
    }
}
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION