[JAVA] Einführung in die praktische Programmierung

Einführung

Dies ist ein Programmier-Tutorial für Anfänger, die von trockenen Beispielen wie Einführungsbüchern nicht überzeugt und verstanden werden können.

In diesem Artikel konzentriert sich die Programmierung auf das Üben aus der Perspektive des Lernens durch Schreiben eines Programms. Sie können es nicht einfach tun, indem Sie ein Buch lesen, wie ein Instrument spielen oder ein Auto fahren. Hier vermitteln wir wichtige Programmierkonzepte durch die Implementierung von Othello und dem Kartenspiel UNO. In Othello über Werte, Typen und Methoden. UNO befasst sich mit Objektorientierung.

Hinweis) Die zweite Hälfte "Uno-Implementierung" wird derzeit bearbeitet

Othello Implementierung

Das erste Thema ist Othello. Othello hat nur wenige Spielzustände und Spieleroperationen, aber das Umdrehen ist kompliziert und genau richtig zum Üben.

Was brauchen Sie, um Othello zu programmieren? Nach sorgfältiger Überlegung sucht der Programmierer die Antwort aus dem Meer der Netze. Die Suchtechnologie ist eine der wichtigsten Technologien für Programmierer. Dies liegt daran, dass vorhandene Technologien verwendet werden können, um Ressourcen wie Zeit und Konzentration für wichtigere Themen bereitzustellen. Die Suchtechnik ist eine Technik zum Extrahieren und Verwenden der erforderlichen Informationen aus den durch die Suche erhaltenen Informationen.

Dann ist es die erste Übung.

Übung 1 Programmieren Sie das Othello-Spiel. Die folgenden Anforderungen müssen jedoch erfüllt sein.

Ich habe es gewagt, zuerst ein schwieriges Problem zu stellen. Durch möglichst viel Arbeit an Übung 1 sollen die folgenden Inhalte überzeugend gemacht werden. Ich möchte, dass du daran arbeitest.

Drücken Sie den Zustand aus

Bei der Bearbeitung einer Aufgabe besteht der erste Schritt darin, das Problem zu lösen. Alle Informationen können ohne sorgfältige Überlegung verwirrend sein.

Was spielt Othello? Um ein Programm zu erstellen, müssen alle verstanden werden. Zuerst benötigen Sie ein Othello-Brett und ein Stück. Und Sie brauchen zwei Spieler, um das Spiel zu spielen.

Wenn Sie ein Brett, eine Figur und einen Spieler haben, können Sie Othello machen. Die nächste Frage lautet: "Wie kann man die Welt der Programme mit der realen Welt verbinden?" Das Programm kann nur numerische Werte verarbeiten. Aber Bretter und Spieler sind keine Zahlen. Hier gibt es einen Sprung. Anstatt Othello mit einem Programm zu erstellen, erstellen Sie ein Programm, das als Othello angesehen werden kann. Sie brauchen kein Brett, keine Figur oder einen Spieler, nur etwas, das wie ein Brett aussieht, etwas, das wie eine Figur aussieht und so weiter. Mit anderen Worten, die Tafel usw. sollte numerisch ausgedrückt werden.

Was sollen wir tun, um das Brett, die Figuren und die Spieler zu repräsentieren? Es gibt 64 Felder auf dem Brett und die Oberseite und die Vorderseite befinden sich oben. Der Spieler hat eine weiße oder schwarze Runde und legt ein Stück auf das Brett. Als nächstes kommt die Übung.

Übung 2 Drücken Sie das Brett und den Rahmen aus. Die folgenden Anforderungen müssen jedoch erfüllt sein.

――Der Status von 64 Quadraten kann gespeichert werden.

Es gibt unzählige Methoden, aber hier verwenden wir ein zweidimensionales Array. Im folgenden Programm werden 1 und 2 verwendet, um das Schwarzweiß des Rahmens auszudrücken.

Antwortbeispiel

class Othello {
    public static void main(String[] args) {
        int [][] borad = new int[8][8];

        for (int i=0; i<8; i++) {
            for (int j=0; j<8; j++) {
                borad[i][j] = 0;
            }
        }

        borad[4][4] = 1;
        borad[4-1][4] = 2;
        borad[4][4-1] = 2;
        borad[4-1][4-1] = 1;

        for (int i=0; i<8; i++) {
            for (int j=0; j<8; j++) {
                System.out.print(borad[i][j] + " ");
            }
            System.out.print("\n");
        }
    }
}

Es wird als Ausführungsergebnis dieses Programms angesehen. Als nächstes repräsentieren Sie den Spieler.

Status ändern

Überprüfen Sie die Spieleranforderungen. Platziere ein weißes oder schwarzes Stück. Es besteht jedoch die Bedingung, dass das zu platzierende Quadrat umgedreht werden kann. Sie können kein Stück in ein Quadrat legen, das beim Platzieren eines Stücks nicht umgedreht werden kann.

Der Mechanismus, der das Verhalten entsprechend den Bedingungen ändert, wird als Steuerungssyntax bezeichnet. Die Bedingung hierbei ist, ob es ein Stück gibt, das beim Platzieren des Stücks umgedreht werden kann oder nicht.

Was sind die Mittel, um die Operation zu erreichen? Wenn der Benutzer den Player bedient, muss das Programm die Benutzereingaben akzeptieren. Dann wird das Programm entsprechend der Eingabe betrieben. In Reaktion auf eine Eingabe wie "Platziere einen schwarzen Rahmen in der x-ten von rechts und in der y-ten Zelle von links" prüft das Programm, ob ein schwarzer Rahmen in dieser Zelle platziert werden kann, und aktualisiert die Karteninformationen, wenn dies möglich ist, und kann sie nicht platzieren. Wenn Sie es dem Benutzer mitteilen.

Wenn Sie Eingaben akzeptieren, verlassen Sie sich häufig auf vorgefertigte Funktionen. Java verwendet die Scannerklasse. Die Details der Eingabe gehen über den Rahmen der Einführung hinaus und werden hier nicht behandelt.

Wenn Sie das Platzieren von Frames organisieren, sehen Sie, dass es aus mehreren Elementen besteht.

--Eingabe empfangen. --Überprüfen Sie, ob Sie einen Rahmen platzieren können.

Das Teilen komplexer Probleme erleichtert das Verständnis. Hier werden wir das Problem für jedes der drei oben beschriebenen Elemente separat betrachten. Übe in der Reihenfolge von oben auf dem Element.

Übung 3 Erhalten Sie die Koordinaten des Quadrats, auf dem der Rahmen platziert ist, als Eingabe.

Die Scannerklasse wird zum Akzeptieren von Eingaben verwendet. Informationen zur Verwendung der Scannerklasse finden Sie in der offiziellen Dokumentation (https://docs.oracle.com/javase/jp/8/docs/api/java/util/Scanner.html).

Antwortbeispiel

import java.util.Scanner;

class Othello {
    public static void main(String[] args) {
        int [][] borad = new int[8][8];

        for (int i=0; i<8; i++) {
            for (int j=0; j<8; j++) {
                borad[i][j] = 0;
            }
        }

        borad[4][4] = 1;
        borad[4-1][4] = 2;
        borad[4][4-1] = 2;
        borad[4-1][4-1] = 1;

        for (int i=0; i<8; i++) {
            for (int j=0; j<8; j++) {
                System.out.print(borad[i][j] + " ");
            }
            System.out.print("\n");
        }

        //Erstellen Sie eine Instanz der Scannerklasse
        //Standardeingabe mit Argument System.angeben in
        Scanner scanner = new Scanner(System.in);

        //Nachrichtenaufforderung
        System.out.print("Geben Sie in der Reihenfolge x y ein> ");
        int x = scanner.nextInt();
        int y = scanner.nextInt();
        
        //Zeigen Sie den eingegebenen Inhalt auf dem Bildschirm an
        System.out.println("x=" + x + " y="+y);

        //Schließen Sie eine Instanz der Scannerklasse
        scanner.close();
    }
}

Übung 4 Überprüfen Sie, ob Sie einen Rahmen platzieren können. Der zu platzierende Rahmen ist jedoch schwarz (2).

Antwortbeispiel

import java.util.Scanner;

class Othello {
    public static void main(String[] args) {
        int [][] borad = new int[8][8];

        for (int i=0; i<8; i++) {
            for (int j=0; j<8; j++) {
                borad[i][j] = 0;
            }
        }

        borad[4][4] = 1;
        borad[4-1][4] = 2;
        borad[4][4-1] = 2;
        borad[4-1][4-1] = 1;

        for (int i=0; i<8; i++) {
            for (int j=0; j<8; j++) {
                System.out.print(borad[i][j] + " ");
            }
            System.out.print("\n");
        }

        //Erstellen Sie eine Instanz der Scannerklasse
        //Standardeingabe mit Argument System.angeben in
        Scanner scanner = new Scanner(System.in);

        //Nachrichtenaufforderung
        System.out.print("Geben Sie in der Reihenfolge x y ein> ");
        int x = scanner.nextInt();
        int y = scanner.nextInt();
        
        //Zeigen Sie den eingegebenen Inhalt auf dem Bildschirm an
        System.out.println("x=" + x + " y="+y);

        //Bereichsprüfung
        if (0<x&&x<8 && 0<y&&y<8) {
            //Ist der Platz offen?
            if (borad[y][x] == 0) {
                //Acht-Wege-Liste
                int[] dx = {-1,  0,  1,  1,  1,  0, -1, -1};
                int[] dy = {-1, -1, -1,  0,  1,  1,  1,  0};

                //Versuchen Sie es in acht Richtungen
                for (int i=0; i<8; i++) {
                    //Neben dem Platz zu setzen(nx, ny)Zu
                    int nx = x+dx[i];
                    int ny = y+dy[i];

                    //Bereichsprüfung
                    if (0<nx&&nx<8 && 0<ny&&ny<8) {
                        //Gibt es einen weißen Rahmen daneben?
                        if (borad[ny][nx] == 1) {
                            //Suchen Sie in die Richtung, in die Sie den schwarzen Rahmen betrachten
                            while (0<nx+dx[i]&&nx+dx[i]<8 && 0<ny+dy[i]&&ny+dy[i]<8) {
                                if (borad[ny][nx] == 2) {
                                    //OK
                                    System.out.println("OK");
                                    System.out.println("dx=" + dx[i] + " dy="+dy[i]);
                                }
                                nx += dx[i];
                                ny += dy[i];
                            }
                        }
                    }
                }
            }
        }

        //Schließen Sie eine Instanz der Scannerklasse
        scanner.close();
    }
}

Übung 5 Platzieren Sie einen Rahmen und drehen Sie ihn um.

Antwortbeispiel

import java.util.Scanner;

class Othello {
    public static void main(String[] args) {
        int [][] borad = new int[8][8];

        for (int i=0; i<8; i++) {
            for (int j=0; j<8; j++) {
                borad[i][j] = 0;
            }
        }

        borad[4][4] = 1;
        borad[4-1][4] = 2;
        borad[4][4-1] = 2;
        borad[4-1][4-1] = 1;

        for (int i=0; i<8; i++) {
            for (int j=0; j<8; j++) {
                System.out.print(borad[i][j] + " ");
            }
            System.out.print("\n");
        }

        //Erstellen Sie eine Instanz der Scannerklasse
        //Standardeingabe mit Argument System.angeben in
        Scanner scanner = new Scanner(System.in);

        //Nachrichtenaufforderung
        System.out.print("Geben Sie in der Reihenfolge x y ein> ");
        int x = scanner.nextInt();
        int y = scanner.nextInt();
        
        //Zeigen Sie den eingegebenen Inhalt auf dem Bildschirm an
        System.out.println("x=" + x + " y="+y);

        //Bereichsprüfung
        if (0<x&&x<8 && 0<y&&y<8) {
            //Ist der Platz offen?
            if (borad[y][x] == 0) {
                //Acht-Wege-Liste
                int[] dx = {-1,  0,  1,  1,  1,  0, -1, -1};
                int[] dy = {-1, -1, -1,  0,  1,  1,  1,  0};

                //Versuchen Sie es in acht Richtungen
                for (int i=0; i<8; i++) {
                    //Neben dem Platz zu setzen(nx, ny)Zu
                    int nx = x+dx[i];
                    int ny = y+dy[i];

                    //Bereichsprüfung
                    if (0<nx&&nx<8 && 0<ny&&ny<8) {
                        //Gibt es einen weißen Rahmen daneben?
                        if (borad[ny][nx] == 1) {
                            //Suchen Sie in die Richtung, in die Sie den schwarzen Rahmen betrachten
                            while (0<nx+dx[i]&&nx+dx[i]<8 && 0<ny+dy[i]&&ny+dy[i]<8) {
                                if (borad[ny][nx] == 2) {
                                    //OK
                                    System.out.println("OK");
                                    System.out.println("dx=" + dx[i] + " dy="+dy[i]);

                                    
                                    while (x!=nx || y!=ny) {
                                        borad[y][x] = 2;
                                        x += dx[i];
                                        y += dy[i];
                                    }
                                }
                                nx += dx[i];
                                ny += dy[i];
                            }
                        }
                    }
                }
            }
        }

        for (int i=0; i<8; i++) {
            for (int j=0; j<8; j++) {
                System.out.print(borad[i][j] + " ");
            }
            System.out.print("\n");
        }

        //Schließen Sie eine Instanz der Scannerklasse
        scanner.close();
    }
}

Es wird gesagt, dass Code mit komplizierter Struktur aufgrund überlappender Zweige und Schleifen nicht schön ist.

Teilen Sie das Programm

Es sollte einfach zu bedienen sein, aber der Code zum Ausdrücken ist kompliziert geworden. Sie können Othello spielen, indem Sie diesen Vorgang wiederholen, aber es ist mühsam und eine Fehlerquelle. Java (und die meisten anderen Sprachen) können denselben Prozess gruppieren und benennen.

Das Zusammenstellen des gleichen Prozesses erleichtert das Schreiben von Wiederholungen. In Java wird es als Methode und auch als Funktion oder Unterroutine bezeichnet. Ziel ist es, Othello mit dieser Methode zu vervollständigen. Die Teile werden abwechselnd platziert, und wenn sie nicht platziert werden können, wird der Sieg oder die Niederlage angezeigt.

Übung 6 Abschluss von Othello. Weiß und Schwarz werden jedoch abwechselnd eingegeben, und die Eingabemethode ist kostenlos.

Antwortbeispiel

import java.util.Scanner;

import sun.launcher.resources.launcher;

class Othello {
    static boolean turn(int player, int x, int y, int[][] borad, boolean check) {
        int opponent = 1;
        if (player == 1) {
            opponent = 2;
        }
        boolean res = false;

        //Bereichsprüfung
        if (0<x&&x<8 && 0<y&&y<8) {
            //Ist der Platz offen?
            if (borad[y][x] == 0) {
                //Acht-Wege-Liste
                int[] dx = {-1,  0,  1,  1,  1,  0, -1, -1};
                int[] dy = {-1, -1, -1,  0,  1,  1,  1,  0};

                //Versuchen Sie es in acht Richtungen
                for (int i=0; i<8; i++) {
                    //Neben dem Platz zu setzen(nx, ny)Zu
                    int nx = x+dx[i];
                    int ny = y+dy[i];

                    //Bereichsprüfung
                    if (0<nx&&nx<8 && 0<ny&&ny<8) {
                        //Gibt es einen weißen Rahmen daneben?
                        if (borad[ny][nx] == opponent) {
                            //Suchen Sie in die Richtung, in die Sie den schwarzen Rahmen betrachten
                            while (0<nx+dx[i]&&nx+dx[i]<8 && 0<ny+dy[i]&&ny+dy[i]<8) {
                                if (borad[ny][nx] == player) {
                                    //OK
                                    res = true;
                                    
                                    if (!check) {
                                        System.out.println("OK");
                                        System.out.println("dx=" + dx[i] + " dy="+dy[i]);
                                        while (x!=nx || y!=ny) {
                                            borad[y][x] = player;
                                            x += dx[i];
                                            y += dy[i];
                                        }
                                    }
                                    
                                }
                                nx += dx[i];
                                ny += dy[i];
                            }
                        }
                    }
                }
            }
        }
        return res;
    }

    static void print_borad(int[][] borad) {
        for (int i=0; i<8; i++) {
            for (int j=0; j<8; j++) {
                System.out.print(borad[i][j] + " ");
            }
            System.out.print("\n");
        }
    }
    
    static boolean can_put(int[][] borad, int player) {
        boolean res = true;
        for (int i=0; i<8; i++) {
            for (int j=0; j<8; j++) {
                res &= turn(player, i, j, borad, true);
            }
        }

        return res;
    }

    static int[][] init() {
        int [][] borad = new int[8][8];
        for (int i=0; i<8; i++) {
            for (int j=0; j<8; j++) {
                borad[i][j] = 0;
            }
        }

        borad[4][4] = 1;
        borad[4-1][4] = 2;
        borad[4][4-1] = 2;
        borad[4-1][4-1] = 1;

        print_borad(borad);

        return borad;
    }
    public static void main(String[] args) {
        int [][] borad = init();

        int player = 2;
        boolean is_game_end = false;
        //Erstellen Sie eine Instanz der Scannerklasse
        //Standardeingabe mit Argument System.angeben in
        Scanner scanner = new Scanner(System.in);
        int x, y;
        while (!is_game_end) {
            //Nachrichtenaufforderung
            System.out.println("Player = " + player);
            System.out.print("Geben Sie in der Reihenfolge x y ein> ");
            x = scanner.nextInt();
            y = scanner.nextInt();
            
            //Zeigen Sie den eingegebenen Inhalt auf dem Bildschirm an
            System.out.println("x=" + x + " y="+y);
            if (turn(player, x, y, borad, false)) {          
                if(player == 2) player = 1;
                else player = 2;
                is_game_end = can_put(borad, player);

                print_borad(borad);
            } 
        }
        

        //Schließen Sie eine Instanz der Scannerklasse
        scanner.close();

        int black = 0, white = 0;
        for (int i=0; i<8; i++) {
            for (int j=0; j<8; j++) {
                if (borad[i][j] == 1) {
                    white++;
                } else if (borad[i][j] == 2) {
                    black++;
                }
            }
        }
        if (black>white) {
            System.out.println("Schwarz gewinnt");
        } else if(black<white) {
            System.out.println("Weiß gewinnt");
        } else {
            System.out.println("zeichnen");
        }
    }
}

Uno Implementierung

Jetzt bearbeiten

Benutzerdefinierter Typ

Zugangskontrolle

Vererbung, Laufzeitpolymorphismus

Vorteile der objektorientierten Programmierung

Am Ende

Referenzmaterial

Recommended Posts

Einführung in die praktische Programmierung
Einführung in "Einführung in die praktische Rostprogrammierung" (Tag 3)
Einführung in die funktionale Programmierung (Java, Javascript)
Einführung in die Programmierung für Studenten: Einführung
Einführung in Ruby 2
Einführung in Micronaut 1 ~ Einführung ~
[Java] Einführung in Java
Einführung in die Migration
Einführung in Java
Einführung in Doma
Einführung in die Programmierung für Studenten: Variablen
Einführung in die praktische Containerentwicklung von Docker / Kubernetes
Einführung in JAR-Dateien
Einführung in Ratpack (8) -Session
Einführung in die Bitarithmetik
Einführung in Ratpack (6) --Promise
Einführung in Ratpack (9) - Thymeleaf
Einführung in PlayFramework 2.7 ① Übersicht
Einführung in das Android-Layout
Einführung in Entwurfsmuster (Einführung)
Einführung in Kotlin für iOS-Entwickler ⑤-Practical XML
Einführung in den Befehl javadoc
Einführung in den Befehl jar
Einführung in Ratpack (2) -Architektur
Einführung in den Lambda-Stil
Einführung in den Java-Befehl
Einführung in die Keycloak-Entwicklung
Einführung in den Befehl javac
Einführung in die Programmierung für Studenten (von Zeit zu Zeit aktualisiert)
Einführung in die Programmierung für Studenten: Erstellen von Canvas
Einführung in Entwurfsmuster (Builder)
Einführung in Ratpack (5) --Json & Registry
Einführung in Metabase ~ Umgebungskonstruktion ~
Einführung in Ratpack (7) - Guice & Spring
(Punktinstallation) Einführung in Java8_Impression
Einführung in Entwurfsmuster (Composite)
Einführung in Micronaut 2 ~ Unit Test ~
Einführung in JUnit (Studiennotiz)
Einführung in Spring Boot ~ ~ DI ~
Einführung in Designmuster (Fliegengewicht)
[Java] Einführung in den Lambda-Ausdruck
Einführung in Spring Boot ② ~ AOP ~
Einführung in Apache Beam (2) ~ ParDo ~
Einführung in die EHRbase 2-REST-API
Einführung in Entwurfsmuster Prototyp
[Java] Einführung in die Stream-API
Einführung in Entwurfsmuster (Iterator)
Einführung in Spring Boot Teil 1
Einführung in Ratpack (1) - Was ist Ratpack?
Einführung in Entwurfsmuster (Strategie)
[Einführung in Janken (ähnliche) Spiele] Java