JavaRush /Java Blog /Random-TK /Täze başlanlar üçin Java oýny
timurnav
Dereje

Täze başlanlar üçin Java oýny

Toparda çap edildi
Salam dostlar we geljekki kärdeşlerim! Täze başlanlar üçin Java oýny - 1Recentlyaňy-ýakynda hakyky taslama gatnaşmak üçin synag geçirdim, geçdim, ýöne şeýle boldy welin, şahsy ýagdaýlar sebäpli RP-yň özüne gatnaşyp bilmedim. RP synagy ýaly gyzykly meselelerden soň, adaty kurs problemalary has özüne çekiji güýmenje boldy, esasanam köpüsini çözüpdim. Şonuň üçin, zehinimi öwrenmegi dowam etdirmek üçin biderek bolmazlygy üçin , köp oýunçy web oýuny döretmegi makul bildim. Beýleki oýunlara baglanyşyklar:
  1. Bu makalanyň dowamy
  2. 2048
Tic Tac Toe meniň üçin iň ýönekeý oýun ýalydy, şonuň üçin bu meseläni birnäçe subtaska bölmek kararyna geldim:
  1. Oýun logikasyny barlamak üçin konsol programmasy
  2. Köp oýunçy
  3. Konsol programmasyna pleýer maglumatlar bazasyny birikdirmek
  4. Öňki dizaýny döretmek, sahypa şablonlaryny ýazmak, oýun interfeýsi
  5. Hemmesini bir ýere jemlemek
Şeýle yzygiderlilik üçin meni masgaralamak ähtimallygy bar we ähli çynlakaý taslamalar düýbünden başga yzygiderlilikde gurlan bolmagy ähtimal, derrew jogap bererin, bu barada “täze başlanlar üçin” ýazaryn, şonuň üçin hemmeler (şol sanda menem) muny öwrenip bilersiňiz :) Bolýar. Geliň, konsol programmasy ýazyp başlalyň! Uly derejeli 20 kynçylyk ýaly ädimleri ýerine ýetirerin. “Tic-tac-toe” oýunda näme bar ?!
  1. meýdany
  2. nobatçy iki oýunçy, biri haç goýýar, ikinjisi nol. bu ýönekeý.
Meýdany standart 3x3 meýdany edýäris. Şeýle meýdany nädip saklap bolar? birinji wariant iki ölçegli massiwdir. Bu massiwde haýsy elementler bolmaly? Jogap, bu elementler bilen näme etjekdigimiz hakda pikirlenmeli, bu ýeňijini tapmak üçin görkezilýär we deňeşdirilýär. Olary diňe ekranda görkezýän bolsak, olary sim hökmünde saklamak mantykly bolardy, onda massiwiň özi we ekranda aýlawda görkezilmegi şuňa meňzeş bir zat bolar:
String[][] strings = {{"O", "O", "_"},
                    {"_", "X", "O"},
                    {"X", "X", "X"},
for (String [] ss : strings){
    for (String s : ss) System.out.print(s + " ");
    System.out.println(); //для перевода строки
}
ekran görkeziler:
O O _
_ X O
X X X
Displayöne görkezmekden başga-da, bahalary deňeşdirmek hem bar, bu ýerde opsiýalar eýýäm mümkin. Setirleri deňeşdirip bilersiňiz, ýörite sanamak synpyny döredip bilersiňiz enum, ýöne sanlary deňeşdirip, diňe ekranda görkezilende “X” we “O” bilen çalyşmak isleýärin. Goý, meselem, 1 - "X", 2 - "O", 0 - "_" bolsun. Şeýlelik bilen, üç gezek X ýa-da O oýny üçin meýdançany nädip barlamaly?
Ilkinji algoritm tutuş meýdany barlaýar
int[][] canvas = {{00, 01, 02},
                 {10, 11, 12},
                 {20, 21, 22}}
Ningeňiji kombinasiýalar:
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.
Sanlary deňeşdirip barlaň, ýöne her gezek ENTIRE meýdançasyny, her 8 kombinasiýany barlamaly bolýar. Elbetde, bu kän däl, bu 0-dan 1 milliard aralygyndaky Armstrong sanlaryny gözlemek däl, bu ýerde hasaplamalar az däl, ýöne henizem ähli meýdany barlamakdan has amatly bir zat isleýärsiňiz. Maňa gelen ikinji pikir, diňe öňki hereketde bellik edilen öýjügi barlamakdy, şonuň üçinem ýeňijini kesgitläp bileris, sebäbi bu hereketi kimiň edenini bileris. Şeýlelik bilen, 8 kombinasiýanyň ýerine, öýjüge baglylykda diňe 2, 3 ýa-da 4 kombinasiýa alýarys, surata serediň: Täze başlanlar üçin Java oýny - 2Indi haýsy kombinasiýany işe girizmelidigini nädip kesgitlemelidigini anyklamaly? Ine, iki ölçegli massiw ulanmagyň gaty amatly däldigine düşündim. Beýleki wariantlary göz öňünde tutmagy makul bildim. Ilki bilen meýdany dokuz sanly görnüşde saklap bolar diýen pikire geldim, mysal üçin, ekranda görkezen meýdanymyz şeýle ýazylyp bilner: 220012111, barmaklarymda onuň nämedigini düşündirerin ... Kod birmeňzeş, 1 - "X", 2 - "O", 0 - "", bu 220012111 = "OO__XOXXX" diýmekligi aňladýar, ýa-da her üçünji belgiden soň setir arakesmesini goýsaňyz we boş ýerler goşsaňyz aýdyňlygy:
О О _
_ Х О
Х Х Х
ýene-de saklamak üçin amatly, görkezmek üçin enjam oýlanyp tapyldy, ýöne deňeşdirmek üçin amatsyz! Çözgüt 1-9 öýjükleri sananymda tapyldy, soň pikir etdim, sebäbi programmirlemekde hasaplaýyş 0-dan başlaýar we suratdaky ýaly sanlanýar. Täze başlanlar üçin Java oýny - 3Haýsydyr bir aýratynlygy duýmadyňyzmy? ýokardaky surata seretseňiz, 2 kombinasiýa bilen çözgütleriň täsin seriýa belgisi, 4 kombinasiýa 4 seriýa nomeri, 3 kombinasiýa galanlary belli bolar. Şeýlelik bilen, oýun meýdançasyny yzygiderli sanlar görnüşinde saklamaly diýen netijä geldim: sanlaryň arasynda ýönekeý gaýtalama, saýlanan algoritm boýunça deňeşdirmek ukyby, ekrana ýönekeý çykyş. Deňeşdirme algoritminiň özi barada aýdylanda. Tertibe geçeliň: ähli wariantlarda hataryň we sütüniň barlygy bar, diňe olary barlaýarys. gözleg netije bermese, öýjük belgisini hatda / geň diýip barlaýarys, geň bolsa, oýna gaýdyp gelýäris, mundan beýläk barlamagyň manysy ýok, hatda bar bolsa, bu öýjügiň üstünde ýa-da ýokdugyny barlaýarys çep diagonaly, 4-e bölünende bu diagonally sanlaryň galan 0-sy bar. Liesalan bolsa, gabat gelýänleri barlaýarys, gabat gelmeýän bolsa, 4-nji belgini barlaýarys, ýok bolsa, oýna gaýdyp gelýäris, eger hawa, koduň üstünden barýarys we soňky diagonaly barlamagyň netijesini gaýtaryp berýäris. Ablyhtimal, taýynlyk görmedik adam üçin ýokardaky harplar toplumyny okanyňyzdan soň düşünmek kyn, ýöne kimdir biri koduň özünde has ýönekeý harplaryň köpdügini aýdyp biler, bu has ýönekeý bolup biler, men bu meseläni ara alyp maslahatlaşmakdan hoşal bolaryn. Meýdany düzdük, indi nobat alýan iki ulanyjy bilen iş salyşmaly we olaryň hersiniň öz belgisi X ýa-da O bar. Birinji etapda köp ulanyjy funksiýamyz ýok, şonuň üçin iň aňsat usuly nyşanlary birin-birin ulanmak bolar. X elmydama birinji hereketi edýär, O elmydama ikinjisini edýär, soň ýene X we ş.m. Barlanylmagyny haýyş edýär ( dogry / ýalan ), eger dogry bolsa - häzirki oýunçy X, ýalan bolsa - O we her hereketiň başynda baýdak =! Baýdak Oýunçylardan haýsydyr bir signal almak galýar. saýlaýan öýjügi. Bu ýerde ýatdan çykmajak BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); Oýunçylarymyz öýjük sanlaryny konsola girizerler we Enter basylanda hereket eder. Girizilen belgä gabat gelýän öýjük, ýokardaky abzasda ara alnyp maslahatlaşylan bellik gutusynyň häzirki ýagdaýyna baglylykda bahasyny 0-dan 1 ýa-da 2-e üýtgeder. Öýjük doldurylandan soň hiç kim X-ny üýtgedip bilmez ýaly girişi tassyklamak möhümdir :) Pleýer konsola näme girip biler?
  1. boş setir
  2. harplar, dyngy belgileri, ýaýlar ... bir söz bilen, san däl
  3. nädogry sanlar - negatiw ýa-da massiwiň daşynda, işleýän öýjükler.
Setirden san almak üçin adaty usul, “Integer” synpynyň statiki usulydyr. Berlen setirden san alyp bilmese, Integer.parseInt("2");kadadan çykma bolýar . Bu kadadan çykma arkaly ilkinji iki nokatdan gorag üpjün edip bileris. NumberFormatExceptionÜçünji nokat üçin, girizilen bahany barlaýan başga bir usul dörederdim, ýöne setir haýyşyny tassyklama geçiriljek aýratyn usula geçirmek iň dogry bolardy we ol diňe san yzyna gaýtarylar. Jemläp aýtsak, bir meýdan döretdik, ony görkezýän usul etdik, “bu oýunçynyň bir sagat ýeňendigini ýa-da ýokdugyny” barlaýan we girizilen sanlary tassyklaýan usul etdik. Etjek gaty az zat bar, deňme-deň barlaň - massiwden geçýän we 0 gözleýän we oýun netijelerini görkezýän aýratyn usul. Bularyň hemmesi, kod taýýar, oýun kiçijik bolup çykdy, diňe bir synp, şonuň üçin gaty göçürijiler düşünmän, hemme zady öz taslamasyna göçürip alyp bilerler, men özüm ýaly boldum, ýöne indi muny etmezlige çalyşýaryn we maslahat berýän hiç kime däl :) JAVA-ny öwrenmekde hemmelere üstünlik arzuw edýärin! ps galan nokatlar - köp oýunçy we maglumat bazasy soň geler, men eýýäm materialy öwrenip başladym :)
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;
    }
}
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION