JavaRush /Блоги Java /Random-TG /Бозии Java барои шурӯъкунандагон
timurnav
Сатҳи

Бозии Java барои шурӯъкунандагон

Дар гурӯҳ нашр шудааст
Салом дӯстон ва ҳамкорони оянда! Бозии Java барои шурӯъкунандагон - 1Чанде пеш, ман барои иштирок дар лоиҳаи воқеӣ имтиҳон гирифтам, аз он гузаштам, аммо чунин шуд, ки бо сабабҳои шахсӣ ман натавонистам дар худи RP иштирок кунам. Пас аз чунин масъалаҳои ҷолиб, ба монанди санҷиши RP, масъалаҳои муқаррарии курс ба як вақтхушии камтар ҷолиб табдил ёфтанд, хусусан азбаски ман аксарияти онҳоро аллакай ҳал карда будам. Аз ин рӯ, барои он ки истеъдоди ман барои идомаи омӯзиш беҳуда сарф нашавад , ман тасмим гирифтам, ки веб-бозии мултипликатори эҷод кунам. Истинодҳо ба бозиҳои дигар:
  1. идомаи ин мақола
  2. 2048
Tic Tac Toe барои ман соддатарин бозӣ менамуд, бинобар ин ман қарор додам, ки ин вазифаро ба як қатор зервазифаҳо тақсим кунам:
  1. Замимаи консол барои санҷиши мантиқи бозӣ
  2. Multiplayer
  3. Замима кардани пойгоҳи додаҳои плеер ба барномаи консол
  4. Эҷоди тарҳрезии фронталӣ, навиштани қолибҳои саҳифа, интерфейси бозӣ
  5. Ҳама чизро якҷоя кардан
Эҳтимол дорад, ки маро барои чунин пайдарпаӣ таъна кунанд ва эҳтимолан ҳама лоиҳаҳои ҷиддӣ бо пайдарпаии комилан дигар сохта шудаанд, ман фавран ҷавоб медиҳам, дар ин бора "барои шурӯъкунандагон" як пост нависед, то ҳама (аз ҷумла ман) Инро омӯзед :) Хуб Биёед ба навиштани барномаи консолӣ шурӯъ кунем! Ман ҳамон қадамҳоро ҳамчун мушкилоти сатҳи калон 20 иҷро мекунам. Дар бозии tic-tac-toe чист?!
  1. майдон
  2. ду бозигаре, ки бо навбат меистанд, яке салиб мегузорад, дуюмаш сифр. оддӣ аст.
Майдонро майдони стандартии 3x3 мегардонем. Чунин майдонро чй тавр нигох доштан мумкин аст? варианти аввал массиви ду-ченака аст. Ин массив бояд кадом элементҳоро дар бар гирад? Ҷавоб ин аст, ки мо бояд дар бораи он фикр кунем, ки мо бо ин унсурҳо чӣ кор хоҳем кард, ин нишон додан ва муқоиса кардан аст, то ғолибро пайдо кунем. Агар мо онҳоро танҳо дар экран нишон медодем, он гоҳ мантиқӣ мебуд, ки онҳоро ҳамчун сатр нигоҳ дорем, пас худи массив ва намоиши он дар экран дар як давра чунин хоҳад буд:
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 комбинатсия боқимонда доранд. Ҳамин тавр, ман ба хулосае омадам, ки шумо бояд майдони бозиро дар массиви муқаррарии рақамҳо нигоҳ доред: итератсияи оддии байни рақамҳо, қобorяти муқоисаи мувофиқи алгоритми интихобшуда, баромади оддӣ ба экран. Дар хусуси худи алгоритми мукоиса бошад. Биёед ба тартиб равем: дар ҳама вариантҳо санҷиши сатр ва сутун мавҷуд аст, мо танҳо онҳоро тафтиш мекунем. агар ҷустуҷӯ натиҷа надиҳад, мо рақами ячейкаро барои ҷуфт/тоқ месанҷем, агар он тоқ бошад, пас ба бозӣ бармегардем, барои тафтиши минбаъда фоидае нест, агар он ҷуфт бошад, мо месанҷем, ки оё ин ячейка дар рӯи диагонали чап, рақамҳои ин диагонал ҳангоми тақсим ба 4 боқимондаи 0 доранд. Агар он дурӯғ бошад, мо гугирдҳоро тафтиш мекунем, агар ягон мувофиқат наёбад, рақами 4-ро месанҷем, агар не, ба бозӣ бармегардем, агар ҳа, мо минбаъд тавассути code мегузарем ва натиҷаи тафтиши диагонали охиринро бармегардонем. Шояд барои одами нотайёр пас аз мутолиаи мачмуи харфхои боло инро фахмидан душвор бошад, аммо касе метавонад бигуяд, ки дар худи code харфхои зиёде хастанд, ки соддатар бошад, ман бо хушнудй дар ин бора сухбат хохам кард. Мо майдонро мураттаб кардем, ҳоло мо бояд бо ду корбаре, ки бо навбат кор мекунанд ва ҳар яки онҳо аломати худро доранд, X ё O. роҳи осонтарини истифода бурдани нишонаҳо як ба як аст. X ҳамеша ҳаракати аввалро мекунад, O ҳамеша дуюмро мекунад, пас X боз ва ғайра. Он хоҳиш мекунад, ки тафтиш карда шавад ( true/false ) ва агар рост бошад - пас плеери ҷорӣ X аст, агар бардурӯғ - пас O ва дар оғози ҳар як ҳаракат flag=!flag Он боқӣ мемонад, ки бо ягон роҳ сигнал аз бозигарон дар бораи он гирифта шавад. ҳуҷайра интихоб мекунанд. Дар ин ҷо ба мо лозим аст, ки BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); Бозингарони фаромӯшнашавандаи мо рақамҳои ячейкаро ба консол ворид мекунанд ва пахш кардани Enter ҳаракат мекунад. Ячеки мувофиқи рақами воридшуда, вобаста ба ҳолати ҷории қуттии қайд, ки дар сархати боло баррасӣ шуда буд, арзиши худро аз 0 ба 1 ё 2 иваз мекунад. Дар ин ҷо муҳим аст, ки вурудро тасдиқ кунед, то вақте ки ячейка аллакай пур шудааст, ҳеҷ кас наметавонад X-ро ба O иваз кунад :) Плеер ба консол чӣ ворид карда метавонад?
  1. хати холӣ
  2. ҳарфҳо, аломатҳои пунктуатсия, қавс... дар як калима, ғайри рақамҳо
  3. рақамҳои нодуруст - манфӣ ё берун аз андозаи массив, ячейкаҳои ишғолшуда.
Усули стандартии гирифтани рақам аз сатр усули статикии parseInt синфи Integer мебошад.Он Integer.parseInt("2");истисноро мегузорад NumberFormatException, агар аз сатри додашуда рақам гирифта натавонист.Мо метавонем бо боздоштани ин истисно аз ду нуқтаи аввал муҳофизат кунем. Барои нуқтаи сеюм, ман усули дигареро эҷод мекардам, ки арзиши воридшударо месанҷад, аммо аз ҳама дурусттар аст, ки дархости сатр ба усули алоҳидае, ки дар он санҷиш иҷро карда мешавад, интиқол дода шавад ва он танҳо рақамро бармегардонад. Барои ҷамъбаст, мо майдонро офаридем, усулеро сохтем, ки онро нишон медиҳад, усулеро сохт, ки “оё ин бозигар як соат ғолиб омад?” -ро тафтиш мекунад ва рақамҳои воридшударо тасдиқ кард. Кори хеле кам боқӣ мондааст, қуръакаширо тафтиш кунед - усули алоҳида, ки дар массив мегузарад ва 0-ро меҷӯяд ва натиҷаҳои бозиро нишон медиҳад. Ҳамааш ин аст, рамз омода аст, бозӣ хурд аст, танҳо як синф буд, бинобар ин, копи-пастерҳои сахт метавонанд, бидуни фаҳмидани, ҳама чизро ба лоиҳаи худ нусхабардорӣ кунанд ва онро мустақилона иҷро кунанд, ман худам чунин будам, аммо ҳоло ман кӯшиш мекунам, ки ин корро накунам ва ба касе тавсия намедиҳам :) Муваффақият ба ҳама дар омӯзиши 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