JavaRush /Blog Jawa /Random-JV /Game Jawa kanggo pamula
timurnav
tingkat

Game Jawa kanggo pamula

Diterbitake ing grup
Hello kanca lan kolega mangsa! Game Jawa kanggo pamula - 1Cukup bubar, aku njupuk tes kanggo melu ing proyek nyata, lulus, nanging mung kedadeyan amarga kahanan pribadi aku ora bisa melu ing RP dhewe. Sawise masalah sing menarik kaya tes RP, masalah kursus sing biasane dadi hiburan sing kurang atraktif, utamane amarga aku wis ngrampungake umume. Mula, supaya bakatku ora ilang kanggo terus sinau, aku mutusake nggawe game web multiplier. Link menyang game liyane:
  1. tutugan artikel iki
  2. 2048
Tic Tac Toe kaya game sing paling gampang kanggo aku, mula aku mutusake kanggo ngilangi tugas kasebut dadi sawetara subtugas:
  1. Aplikasi konsol kanggo nguji logika game
  2. Multiplayer
  3. Masang database pamuter kanggo aplikasi console
  4. Nggawe desain ngarep, nulis template kaca, antarmuka game
  5. Sijine kabeh bebarengan
Ana kamungkinan sing aku bakal scolded kanggo urutan kuwi, lan paling kamungkinan kabeh proyek serius dibangun ing urutan temen beda, aku bakal langsung njawab, nulis kirim bab iki "kanggo pamula" supaya saben wong (kalebu kula) bisa sinau iki :) Inggih, ayo miwiti nulis aplikasi konsol! Aku bakal tindakake langkah padha karo tingkat amba 20 tantangan. Apa ing game tic-tac-toe?!
  1. lapangan
  2. loro pemain sing dadi siji, sijine salib, liyane nul. iku prasaja.
We nggawe lapangan lapangan 3x3 standar. Kepiye carane bisa nyimpen lapangan kaya ngono? pilihan pisanan iku Uploaded loro-dimensi. Unsur apa sing kudu ana ing array iki? Jawaban iki sing kita kudu mikir bab apa kita bakal nindakake karo unsur iki, iki nampilake lan mbandhingaké kanggo nemokake juara. Yen kita mung nampilake ing layar, mula logis yen tetep dadi senar, banjur array kasebut lan ditampilake ing layar kanthi gelung bakal katon kaya iki:
String[][] strings = {{"O", "O", "_"},
                    {"_", "X", "O"},
                    {"X", "X", "X"},
for (String [] ss : strings){
    for (String s : ss) System.out.print(s + " ");
    System.out.println(); //для перевода строки
}
layar bakal nampilake:
O O _
_ X O
X X X
Nanging saliyane kanggo tampilan, kita uga duwe comparison nilai, lan kene opsi wis bisa. Sampeyan bisa mbandhingaké strings, sampeyan bisa nggawe kelas enumerasi khusus ( enum), nanging aku luwih seneng kanggo mbandhingaké nomer, lan ngganti karo "X" lan "O" mung nalika ditampilake ing layar. Ayo dadi, contone, 1 - "X", 2 - "O", 0 - "_". Dadi, kepiye sampeyan mriksa lapangan kanggo pertandhingan triple X utawa O?
Algoritma pisanan yaiku mriksa kabeh lapangan
int[][] canvas = {{00, 01, 02},
                 {10, 11, 12},
                 {20, 21, 22}}
Kombinasi sing menang:
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.
Priksa kanthi mbandhingake nomer, nanging sampeyan kudu mriksa lapangan ENTIRE, kabeh 8 kombinasi, saben wektu. Mesthi, iki ora akeh, iki dudu panelusuran kanggo nomer Armstrong ing sawetara saka 0 kanggo 1 milyar, ana sethitik liyane saka ora petungan kene, nanging sampeyan isih pengin soko luwih optimal saka mriksa kabeh lapangan. Ide kapindho sing teka ing aku yaiku mriksa mung sel sing ditandhani ing pamindhahan sadurunge, supaya kita isih bisa nemtokake pemenang, amarga kita bakal ngerti sapa sing nggawe pamindhahan iki. Mangkono, tinimbang kabeh 8 kombinasi, kita entuk mung 2, 3 utawa 4 kombinasi, gumantung saka sel, ndeleng tokoh: Game Jawa kanggo pamula - 2Saiki kita kudu nemtokake cara kanggo nemtokake kombinasi sing kudu diluncurake? Iki ngendi aku temen maujud sing nggunakake array loro-dimensi ora trep banget. Aku mutusaké kanggo dipikir opsi liyane. Kaping pisanan, aku duwe ide yen lapangan bisa disimpen ing angka sangang digit, contone, kolom sing padha ditampilake ing layar bisa ditulis kaya mangkene: 220012111, aku bakal nerangake kanthi driji apa iku. yaiku... Kode iku padha, 1 - “X”, 2 - “O” , 0 – " ", kang tegese 220012111 = "OO__XOXXX", utawa yen sawise saben digit katelu sampeyan masang baris break lan nambah spasi kanggo kajelasan:
О О _
_ Х О
Х Х Х
kene maneh, trep kanggo panyimpenan, piranti kanggo tampilan nemokke, nanging ora trep kanggo comparison! Solusi kasebut ditemokake nalika aku menehi nomer sel 1-9, banjur aku mikir, amarga ing program countdown diwiwiti saka 0 lan diwenehi nomer kaya ing gambar. Game Jawa kanggo pamula - 3Apa sampeyan ora weruh keanehan? yen katon ing gambar ndhuwur, iku bakal dadi cetha yen solusi karo 2 kombinasi duwe nomer serial aneh, 4 kombinasi duwe nomer serial 4, 3 kombinasi duwe liyane. Dadi aku teka menyang kesimpulan sing kudu tetep ing lapangan playing ing Uploaded biasa saka nomer: pengulangan prasaja antarane nomer, kemampuan kanggo mbandhingaké miturut algoritma sing dipilih, output prasaja kanggo layar. Minangka kanggo algoritma comparison dhewe. Ayo dadi ing urutan: ing kabeh opsi ana mriksa baris lan kolom, kita mriksa mung wong-wong mau. yen telusuran ora kasil, kita mriksa nomer sel kanggo genap / ganjil, yen ganjil, banjur bali menyang game, ora ana gunane kanggo mriksa luwih, yen malah, kita mriksa apa sel iki dumunung ing diagonal kiwa, nomer diagonal iki nalika dibagi 4 duwe sisa 0. Yen goroh, kita mriksa cocog, yen ora cocog ketemu, banjur kita mriksa nomer 4, yen ora, bali menyang game, yen ya, kita pindhah luwih liwat kode lan bali asil mriksa diagonal pungkasan. Mbokmenawa, kanggo wong sing ora siap, iki angel dimangerteni sawise maca set huruf ing ndhuwur, nanging ana sing bisa ngomong yen ana akeh huruf ing kode kasebut, sing bisa luwih gampang, aku bakal seneng ngrembug babagan iki. We wis diurutake metu lapangan, saiki kita kudu menehi hasil karo loro pangguna sing giliran lan saben wong duwe tandha dhewe, X utawa O. Ing tataran pisanan, kita ora duwe fungsi multi-user, supaya ing Cara paling gampang yaiku nggunakake lambang siji-siji. X tansah nggawe pamindhahan pisanan, O tansah nggawe kaloro, banjur X maneh, lan ing. Iku begs kanggo dicenthang ( bener / salah ), lan yen bener - banjur pamuter saiki X, yen palsu - banjur O lan ing awal saben pamindhahan flag=!flag Iku tetep piye wae nampa sinyal saka pemain bab kang sel padha milih. Ing kene kita bakal mbutuhake BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); Pemain sing ora bisa dilalekake bakal ngetik nomer sel menyang konsol, lan menet Enter bakal nggawe pamindhahan. Sèl sing cocog karo nomer sing dilebokake bakal ngganti nilai saka 0 dadi 1 utawa 2, gumantung saka kahanan kothak saiki, sing wis dibahas ing paragraf ing ndhuwur. Iki ngendi iku penting kanggo validasi input supaya ora ana siji bisa ngganti X kanggo O nalika sel wis kapenuhan :) Apa pamuter bisa ngetik menyang console?
  1. baris kosong
  2. aksara, tandha waca, kurung ... ing siji tembung, non-nomer
  3. nomer salah - negatif utawa njaba ukuran Uploaded, sel dikuwasani.
Cara standar kanggo njupuk digit saka senar punika cara statis parseInt saka kelas Integer. Integer.parseInt("2");Iku mbalang pangecualian NumberFormatExceptionyen ora bisa njaluk digit saka senar diwenehi. Kita bisa nyedhiyani pangayoman saka loro TCTerms pisanan dening intercepting istiméwa iki. Kanggo titik katelu, Aku bakal nggawe cara liyane sing mriksa Nilai ngetik, nanging bakal paling bener kanggo mindhah request senar menyang cara kapisah kang validasi bakal dileksanakake, lan bakal bali mung nomer. Kanggo ngringkes, kita nggawe lapangan, nggawe cara sing nampilake, nggawe cara sing mriksa "pamuter iki menang sak jam?", Lan divalidasi nomer ngetik. Ana banget sethitik kiwa do a, mriksa babak - cara kapisah sing mbukak liwat Uploaded lan katon kanggo 0, lan nampilake asil game. Iku kabeh, kode wis siyap, game dadi cilik, mung siji kelas, supaya hard copy-pasters bisa, tanpa pangerten, mung nyalin kabeh menyang project lan mbukak dhewe, aku kaya sing, nanging saiki aku nyoba ora nglakoni lan ora kanggo sapa wae sing dakkarepake :) Good luck kanggo kabeh wong ing sinau JAWA! ps liyane poin - multiplayer lan database bakal teka mengko, aku wis miwiti sinau materi :)
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;
    }
}
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION