JavaRush /جاوا بلاگ /Random-SD /جاوا راند شروع ڪندڙن لاءِ
timurnav
سطح

جاوا راند شروع ڪندڙن لاءِ

گروپ ۾ شايع ٿيل
هيلو دوست ۽ مستقبل جي ساٿين! جاوا راند نئين سکندڙن لاءِ - 1تازو، مون هڪ حقيقي پروجيڪٽ ۾ حصو وٺڻ لاء هڪ امتحان ڏنو، ان ۾ پاس ڪيو، پر اهو صرف ايترو ٿيو ته ذاتي حالتن جي ڪري مان پاڻ آر پي ۾ حصو وٺڻ کان قاصر آهيان. اهڙين دلچسپ مسئلن کان پوءِ جيئن RP ٽيسٽ، عام ڪورس جا مسئلا گهٽ پرڪشش شوق بڻجي ويا، خاص ڪري جڏهن مان انهن مان اڪثر حل ڪري چڪو آهيان. تنهن ڪري، انهي ڪري ته منهنجي ڏات کي سکڻ جاري رکڻ لاء ضايع نه ڪيو وڃي ، مون هڪ ملٽي پليئر ويب گيم ٺاهڻ جو فيصلو ڪيو. ٻين راندين لاء لنڪس:
  1. هن مضمون جو تسلسل
  2. 2048
Tic Tac Toe مون کي آسان ترين راند وانگر لڳي، تنهنڪري مون ڪم کي ڪيترن ئي ذيلي ڪمن ۾ ٽوڙڻ جو فيصلو ڪيو:
  1. راند جي منطق کي جانچڻ لاءِ ڪنسول ايپليڪيشن
  2. ملٽي پليئر
  3. هڪ پليئر ڊيٽابيس کي ڪنسول ايپليڪيشن سان ڳنڍڻ
  4. فرنٽ-اينڊ ڊيزائن ٺاهڻ، صفحي جي ٽيمپليٽ لکڻ، راند انٽرفيس
  5. اهو سڀ ڪجهه گڏ ڪرڻ
امڪان اهو آهي ته مون کي اهڙي ترتيب لاءِ ڊاڙو ڪيو ويندو، ۽ گهڻو ڪري تمام سنجيده پروجيڪٽ مڪمل طور تي مختلف ترتيب ۾ ٺاهيا ويا آهن، مان فوري طور تي جواب ڏيندس، "شروع ڪندڙن لاء" جي باري ۾ هڪ پوسٽ لکندو ته جيئن هرڪو (مون سميت) هي سکي سگهو ٿا :) خير، اچو ته لکڻ شروع ڪريون ڪنسول ايپليڪيشن! مان ساڳين قدمن تي عمل ڪندس جيئن وڏي سطح 20 چئلينجز. راند ۾ ڇا آهي Tic-tac-toe؟!
  1. ميدان
  2. ٻه رانديگر جيڪي موڙ وٺندا آهن، هڪ ڪراس رکندو آهي، ٻيو صفر. اهو سادو آهي.
اسان فيلڊ کي معياري 3x3 فيلڊ ٺاهيو. اهڙي زمين کي ڪيئن محفوظ ڪري سگهجي ٿو؟ پهريون اختيار هڪ ٻه-dimensional صف آهي. هن صف ۾ ڪهڙا عنصر شامل ٿيڻ گهرجن؟ جواب اهو آهي ته اسان کي سوچڻ جي ضرورت آهي ته اسان انهن عناصر سان ڇا ڪنداسين، اهو ڏيکاري رهيو آهي ۽ فاتح ڳولڻ جي مقابلي ۾. جيڪڏهن اسان انهن کي صرف اسڪرين تي ڏيکاري رهيا هئاسين، پوء اهو منطقي هوندو ته انهن کي هڪ اسٽرنگ جي طور تي رکڻو پوندو، پوء خود صف ۽ ان کي اسڪرين تي هڪ لوپ ۾ ڏيکاريندي ڪجهه هن طرح نظر ايندو:
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 - "X"، 2 - "O"، 0 - "_". تنهن ڪري، توهان ڪيئن ٿا چيڪ ڪريو هڪ فيلڊ ٽرپل ايڪس يا اي ميچ لاءِ؟
تمام پهريون الگورتھم سڄي فيلڊ کي جانچيندو آهي
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 مجموعا ملن ٿا، سيل جي لحاظ کان، تصوير ڏسو: جاوا جي راند شروعات ڪندڙن لاءِ - 2هاڻي اسان کي اهو معلوم ڪرڻو پوندو ته ڪهڙي ميلاپ کي لانچ ڪرڻ جي ضرورت آهي؟ هي اهو آهي جتي مون محسوس ڪيو ته هڪ ٻه-dimensional صف استعمال ڪرڻ بلڪل آسان ناهي. مون ٻين اختيارن کي ڏسڻ جو فيصلو ڪيو. شروع ۾ مون کي اهو خيال آيو ته فيلڊ کي نون عددن ۾ رکي سگهجي ٿو، مثال طور، اها ساڳي فيلڊ جيڪا اسان اسڪرين تي ڏيکاري آهي، ان کي هن طرح لکي سگهجي ٿو: 220012111، مان پنهنجي آڱرين ۾ وضاحت ڪندس ته اهو ڇا آهي. آهي... ڪوڊ ساڳيو آهي، 1 - "X"، 2 - "O" , 0 - " "، جنهن جو مطلب آهي 220012111 = "OO__XOXXX"، يا جيڪڏهن هر ٽئين عدد کان پوءِ توهان هڪ لائين بريڪ داخل ڪريو ۽ ان لاءِ اسپيس شامل ڪريو وضاحت:
О О _
_ Х О
Х Х Х
هتي ٻيهر، اسٽوريج لاء آسان، ڊسپلي لاء هڪ ڊوائيس ايجاد ڪئي وئي، پر مقابلي لاء تڪليف! ان جو حل تڏهن مليو جڏهن مون سيلن کي 1-9 نمبر ڏنو، پوءِ مون سوچيو، ڇاڪاڻ ته پروگرامنگ ۾ ڳڻپ 0 کان شروع ٿئي ٿو ۽ ان کي تصوير جيتري نمبر ڏنو، جاوا راند نئين سکندڙن لاءِ - 3ڇا توهان کي ڪا خاصي نظر نه آئي؟ جيڪڏهن توهان مٿي ڏنل تصوير کي ڏسو، اهو واضح ٿي ويندو ته 2 مجموعن سان حل هڪ بي جوڙ سيريل نمبر آهي، 4 مجموعن ۾ سيريل نمبر 4 آهي، 3 مجموعن ۾ باقي آهن. تنهن ڪري مان ان نتيجي تي پهتو آهيان ته توهان کي راند جي ميدان کي انگن جي باقاعده صف ۾ رکڻ جي ضرورت آهي: انگن جي وچ ۾ سادي ورجائي، چونڊيل الگورتھم جي مطابق مقابلي ڪرڻ جي صلاحيت، اسڪرين ڏانهن سادي آئوٽ. جيئن ته مقابلي لاءِ الگورتھم پاڻ. اچو ته ترتيب ۾ وڃو: سڀني اختيارن ۾ قطار ۽ ڪالمن جي چڪاس آھي، اسان صرف انھن کي چيڪ ڪريو. جيڪڏهن ڳولا جو نتيجو نه ٿو اچي، اسان سيل نمبر کي ايوار/اڊ لاءِ چيڪ ڪريون ٿا، جيڪڏهن اهو بي جوڙ آهي، ته پوءِ اسان راند ڏانهن واپس وڃون ٿا، وڌيڪ چيڪ ڪرڻ جو ڪو به مطلب ناهي، جيڪڏهن اهو برابر آهي، ته اسان چيڪ ڪريون ٿا ته ڇا هي سيل نمبر تي آهي. کاٻي ڊرون، هن ڊاگونل جي انگن کي جڏهن 4 سان ورهايو وڃي ته باقي 0 آهي. جيڪڏهن اهو ڪوڙ آهي، اسان ميچز لاء چيڪ ڪريون ٿا، جيڪڏهن ڪو ميلاپ نه ملي، ته پوء اسان نمبر 4 لاء ڏسو، جيڪڏهن نه، راند ڏانهن واپس وڃو، جيڪڏهن ها، اسان ڪوڊ ذريعي اڳتي وڌون ٿا ۽ آخري ڊرون چيڪ ڪرڻ جو نتيجو واپس ڏيون ٿا. ٿي سگهي ٿو، ڪنهن اڻڄاڻ ماڻهوءَ لاءِ، مٿي ڏنل اکرن جي سيٽ کي پڙهڻ کان پوءِ اهو سمجهڻ ڏکيو آهي، پر ڪو ماڻهو اهو چئي سگهي ٿو ته ضابطي ۾ ڪافي اکر آهن، جيڪي آسان ٿي سگهن ٿا، مون کي ان تي بحث ڪرڻ ۾ خوشي ٿيندي. اسان فيلڊ کي ترتيب ڏنو آهي، هاڻي اسان کي ٻن استعمال ڪندڙن سان ڊيل ڪرڻ جي ضرورت آهي جيڪي موڙ وٺن ٿا ۽ انهن مان هر هڪ جي پنهنجي نشاني آهي، X يا O. پهرين مرحلي ۾، اسان وٽ ڪا به گهڻن استعمال ڪندڙ ڪارڪردگي نه آهي، تنهنڪري هڪ هڪ ڪري آئڪن کي استعمال ڪرڻ جو آسان طريقو هوندو. X هميشه پهرين حرڪت ڪندو آهي، O هميشه ٻيو ٺاهيندو آهي، پوء X ٻيهر، وغيره. ان کي چيڪ ڪيو وڃي ٿو ( سچو/غلط )، ۽ جيڪڏهن صحيح آهي - ته پوءِ موجوده پليئر X آهي، جيڪڏهن غلط- پوءِ O ۽ هر حرڪت جي شروعات ۾ flag=!flag اهو رهي ٿو ته ڪنهن نه ڪنهن طريقي سان رانديگرن کان سگنل وصول ڪيو وڃي جنهن بابت سيل اهي چونڊيندا آهن. هتي اسان کي اسان جي ناقابل فراموش BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); رانديگرن جي ضرورت پوندي سيل نمبر ڪنسول ۾ داخل ڪندا، ۽ انٽر کي دٻائڻ سان هڪ حرڪت ٿيندي. داخل ٿيل نمبر سان لاڳاپيل سيل ان جي قيمت 0 کان 1 يا 2 تائين تبديل ڪندو، چيڪ بڪس جي موجوده حالت تي منحصر ڪري ٿو، جيڪو مٿي پيراگراف ۾ بحث ڪيو ويو آهي. اھو اھو آھي جتي اھو ضروري آھي ان پٽ کي درست ڪرڻ لاءِ ته جيئن ڪو به X کان O کي تبديل نٿو ڪري سگھي جڏھن سيل اڳ ۾ ئي ڀريو ويو آھي :) ڇا پليئر ڪنسول ۾ داخل ٿي سگھي ٿو؟
  1. خالي لائن
  2. اکر، اوقاف جا نشان، بریکٹ... هڪ لفظ ۾، غير نمبر
  3. غلط انگ - منفي يا صف جي سائيز کان ٻاهر، قبضو ڪيل سيلز.
اسٽرنگ مان عدد حاصل ڪرڻ جو معياري طريقو انٽيجر ڪلاس جو جامد طريقو پارس انٽ آهي. Integer.parseInt("2");اهو استثنا ڏئي ٿو NumberFormatExceptionجيڪڏهن اهو ڏنل اسٽرنگ مان عدد حاصل نٿو ڪري سگهي. اسان هن استثنا کي مداخلت ڪندي پهرين ٻن نقطن کان تحفظ فراهم ڪري سگهون ٿا. ٽئين نقطي لاءِ، مان هڪ ٻيو طريقو ٺاهيندس جيڪو داخل ڪيل قدر کي چيڪ ڪري ٿو، پر اهو سڀ کان وڌيڪ صحيح هوندو ته اسٽرنگ جي درخواست کي هڪ الڳ طريقي سان منتقل ڪيو وڃي جنهن ۾ تصديق ڪئي ويندي، ۽ اهو صرف هڪ نمبر واپس ڪندو. اختصار ڪرڻ لاءِ، اسان ھڪ فيلڊ ٺاھيو، ھڪڙو طريقو ٺاھيو جيڪو ان کي ڏيکاري، ھڪڙو طريقو ٺاھيو جيڪو چيڪ ڪري ٿو "ڇا ھي رانديگر ھڪ ڪلاڪ ۾ کٽيو؟"، ۽ داخل ٿيل انگن جي تصديق ڪئي. ڪرڻ لاءِ تمام ٿورڙو رهجي ويو آهي، هڪ ڊرا لاءِ چيڪ ڪريو - هڪ الڳ طريقو جيڪو صف ذريعي هلندو آهي ۽ 0 ڳولي ٿو، ۽ راند جا نتيجا ڏيکاري ٿو. بس، ڪوڊ تيار آهي، راند ننڍي هئي، صرف هڪ ڪلاس، تنهنڪري سخت ڪاپي پيسٽر، بغير سمجهي، هر شيء کي پنهنجي پروجيڪٽ ۾ نقل ڪري سگھن ٿا ۽ ان کي پاڻ تي هلائي، مان پاڻ به ائين ئي هوس، پر هاڻي مان ڪوشش ڪريان ٿو ته ائين نه ڪريان ۽ نه ئي ڪنهن کي مان ان جي سفارش ڪريان ٿو :) جاوا سکڻ ۾ سڀني کي سٺي قسمت! ps باقي پوائنٽون - multiplayer ۽ ڊيٽابيس بعد ۾ ايندا، مون اڳ ۾ ئي مواد جو مطالعو شروع ڪيو آهي :)
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