[JAVA] Introduction à la programmation pratique

introduction

Ceci est un tutoriel de programmation pour les débutants qui ne peuvent pas être convaincus et compris par des exemples secs tels que des livres d'introduction.

Dans cet article, la programmation est axée sur la pratique du point de vue de l'apprentissage en écrivant un programme. Vous ne pouvez pas le faire simplement en lisant un livre comme jouer d'un instrument ou conduire une voiture. Nous transmettons ici des concepts de programmation importants à travers l'implémentation d'Othello et du jeu de cartes UNO. Dans Othello, à propos des valeurs, des types et des méthodes. UNO s'occupe de l'orientation des objets.

Note) La dernière moitié de "l'implémentation Uno" est en cours d'édition

Implémentation d'Othello

Le premier sujet est Othello. Othello a peu d'états de jeu et d'opérations de joueur, mais l'opération de le retourner est compliquée et convient parfaitement à la pratique.

De quoi avez-vous besoin pour programmer Othello? Après mûre réflexion, le programmeur cherche la réponse dans la mer de filets. La technologie de recherche est l'une des technologies les plus importantes pour les programmeurs. En effet, la technologie existante peut être utilisée pour consacrer des ressources telles que du temps et de la concentration à des questions plus importantes. La technique de recherche est une technique permettant d'extraire et d'utiliser les informations nécessaires à partir des informations obtenues par la recherche.

Ensuite, c'est la première pratique.

Pratique 1 Programmez le jeu Othello. Cependant, les conditions suivantes doivent être remplies.

J'ai d'abord osé poser un problème difficile. En travaillant autant que possible sur la pratique 1, l'objectif est de rendre le contenu suivant convaincant. Je veux que vous y travailliez.

Exprimez l'état

Lorsqu'il s'agit d'une tâche, la première étape consiste à résoudre le problème. Toute information peut prêter à confusion sans un examen attentif.

Qu'est-ce qui joue à Othello? Afin de créer un programme, il est nécessaire de les comprendre tous. Tout d'abord, vous avez besoin d'une planche d'Othello et d'une pièce. Et vous avez besoin de deux joueurs pour jouer au jeu.

Si vous avez un plateau, une pièce et un joueur, vous pouvez faire Othello. La question suivante est "comment connecter le monde des programmes au monde réel". Seules les valeurs numériques peuvent être gérées par le programme. Mais les tableaux et les joueurs ne sont pas des nombres. Il y a un saut ici. Au lieu de créer un programme Othello, créez un programme qui peut être considéré comme un Othello. Vous n'avez pas besoin d'un plateau, d'une pièce ou d'un joueur, juste quelque chose qui ressemble à un plateau, quelque chose qui ressemble à une pièce, etc. En d'autres termes, le tableau etc. doit être exprimé numériquement.

Que devons-nous faire pour représenter le plateau, les pièces et les joueurs? Il y a 64 carrés sur le plateau, et le dessus et le devant sont sur le dessus. Le joueur a un tour blanc ou noir et met une pièce sur le plateau. Vient ensuite la pratique.

Pratique 2 Exprimez la planche et le cadre. Cependant, les conditions suivantes doivent être remplies.

――L'état de 64 carrés peut être enregistré. --Faire en sorte que les carrés contiennent des informations permettant de distinguer «rien n'est placé», «le blanc est placé» et «le noir est placé». --Placez 4 cadres au centre selon les règles de base.

Il existe d'innombrables méthodes, mais ici nous utilisons un tableau à deux dimensions. Dans le programme ci-dessous, 1 et 2 sont utilisés pour exprimer le noir et blanc du cadre.

Exemple de réponse

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");
        }
    }
}

Il est considéré comme le résultat de l'exécution de ce programme. Ensuite, représentez le joueur.

Changer d'état

Vérifiez les exigences du joueur. Placez une pièce blanche ou noire. Cependant, il y a une condition que le carré à placer puisse être retourné. Vous ne pouvez pas placer une pièce dans un carré qui ne peut pas être retourné lorsque vous placez une pièce.

Le mécanisme qui modifie le comportement en fonction des conditions est appelé syntaxe de contrôle. La condition ici est de savoir s'il y a ou non une pièce qui peut être retournée lorsque la pièce est placée.

Quels sont les moyens pour réaliser l'opération? Si l'utilisateur fait fonctionner le lecteur, le programme doit accepter l'entrée de l'utilisateur. Ensuite, le programme est exécuté en fonction de l'entrée. En réponse à une entrée telle que "Placer un cadre noir dans la xème à partir de la droite et la yème cellule à partir de la gauche", le programme vérifie si un cadre noir peut être placé dans cette cellule et, s'il le peut, met à jour les informations de la carte et ne peut pas le placer. Lorsque vous le dites à l'utilisateur.

Lorsque vous acceptez une entrée, vous vous appuyez souvent sur des fonctionnalités prédéfinies. Java utilise la classe Scanner. Les détails de l'entrée dépassent le cadre de l'introduction et ne seront pas traités ici.

Si vous organisez l'opération de placement des cadres, vous pouvez voir qu'elle est composée de plusieurs éléments.

--Recevoir des entrées. --Vérifiez si vous pouvez placer un cadre. --Placez un morceau et retournez-le.

La division des problèmes complexes facilite la compréhension. Ici, nous allons considérer le problème séparément pour chacun des trois éléments décrits ci-dessus. Pratiquez dans l'ordre du haut de l'élément.

Pratique 3 Recevez les coordonnées du carré où le cadre est placé en entrée.

La classe Scanner est utilisée pour accepter l'entrée. Pour savoir comment utiliser la classe Scanner, reportez-vous au document officiel (https://docs.oracle.com/javase/jp/8/docs/api/java/util/Scanner.html).

Exemple de réponse

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");
        }

        //Créer une instance de la classe Scanner
        //Entrée standard avec système d'argument.spécifier dans
        Scanner scanner = new Scanner(System.in);

        //Invite de message
        System.out.print("Entrez dans l'ordre de x y> ");
        int x = scanner.nextInt();
        int y = scanner.nextInt();
        
        //Afficher le contenu saisi à l'écran
        System.out.println("x=" + x + " y="+y);

        //Fermer une instance de la classe Scanner
        scanner.close();
    }
}

Pratique 4 Vérifiez si vous pouvez placer un cadre. Cependant, le cadre à placer est noir (2).

Exemple de réponse

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");
        }

        //Créer une instance de la classe Scanner
        //Entrée standard avec système d'argument.spécifier dans
        Scanner scanner = new Scanner(System.in);

        //Invite de message
        System.out.print("Entrez dans l'ordre de x y> ");
        int x = scanner.nextInt();
        int y = scanner.nextInt();
        
        //Afficher le contenu saisi à l'écran
        System.out.println("x=" + x + " y="+y);

        //Vérification de la portée
        if (0<x&&x<8 && 0<y&&y<8) {
            //La place est-elle ouverte?
            if (borad[y][x] == 0) {
                //Liste à huit voies
                int[] dx = {-1,  0,  1,  1,  1,  0, -1, -1};
                int[] dy = {-1, -1, -1,  0,  1,  1,  1,  0};

                //Essayez huit directions dans l'ordre
                for (int i=0; i<8; i++) {
                    //A côté de la place pour mettre(nx, ny)À
                    int nx = x+dx[i];
                    int ny = y+dy[i];

                    //Vérification de la portée
                    if (0<nx&&nx<8 && 0<ny&&ny<8) {
                        //S'il y a un cadre blanc à côté
                        if (borad[ny][nx] == 1) {
                            //Recherchez dans la direction dans laquelle vous regardez le cadre noir
                            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];
                            }
                        }
                    }
                }
            }
        }

        //Fermer une instance de la classe Scanner
        scanner.close();
    }
}

Pratique 5 Placez un cadre et retournez-le.

Exemple de réponse

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");
        }

        //Créer une instance de la classe Scanner
        //Entrée standard avec système d'argument.spécifier dans
        Scanner scanner = new Scanner(System.in);

        //Invite de message
        System.out.print("Entrez dans l'ordre de x y> ");
        int x = scanner.nextInt();
        int y = scanner.nextInt();
        
        //Afficher le contenu saisi à l'écran
        System.out.println("x=" + x + " y="+y);

        //Vérification de la portée
        if (0<x&&x<8 && 0<y&&y<8) {
            //La place est-elle ouverte?
            if (borad[y][x] == 0) {
                //Liste à huit voies
                int[] dx = {-1,  0,  1,  1,  1,  0, -1, -1};
                int[] dy = {-1, -1, -1,  0,  1,  1,  1,  0};

                //Essayez huit directions dans l'ordre
                for (int i=0; i<8; i++) {
                    //A côté de la place pour mettre(nx, ny)À
                    int nx = x+dx[i];
                    int ny = y+dy[i];

                    //Vérification de la portée
                    if (0<nx&&nx<8 && 0<ny&&ny<8) {
                        //S'il y a un cadre blanc à côté
                        if (borad[ny][nx] == 1) {
                            //Recherchez dans la direction dans laquelle vous regardez le cadre noir
                            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");
        }

        //Fermer une instance de la classe Scanner
        scanner.close();
    }
}

On dit que le code avec une structure compliquée due à des branches et des boucles qui se chevauchent n'est pas beau.

Divisez le programme

Il devrait être facile à utiliser, mais le code pour l'exprimer est devenu compliqué. Vous pouvez jouer à Othello en répétant cette opération, mais c'est gênant et source d'erreurs. Java (et la plupart des autres langages) a la capacité de regrouper et de nommer le même processus.

La mise en place du même processus facilite l'écriture des répétitions. En Java, on l'appelle une méthode, et on l'appelle également une fonction ou sous-programme. Essayez de terminer Othello en utilisant la méthode. Les pièces sont placées en alternance, et si elles ne peuvent pas être placées, la victoire ou la défaite est affichée.

Pratique 6 Achèvement d'Othello. Cependant, le blanc et le noir sont saisis en alternance et la méthode de saisie est gratuite.

Exemple de réponse

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;

        //Vérification de la portée
        if (0<x&&x<8 && 0<y&&y<8) {
            //La place est-elle ouverte?
            if (borad[y][x] == 0) {
                //Liste à huit voies
                int[] dx = {-1,  0,  1,  1,  1,  0, -1, -1};
                int[] dy = {-1, -1, -1,  0,  1,  1,  1,  0};

                //Essayez huit directions dans l'ordre
                for (int i=0; i<8; i++) {
                    //A côté de la place pour mettre(nx, ny)À
                    int nx = x+dx[i];
                    int ny = y+dy[i];

                    //Vérification de la portée
                    if (0<nx&&nx<8 && 0<ny&&ny<8) {
                        //S'il y a un cadre blanc à côté
                        if (borad[ny][nx] == opponent) {
                            //Recherchez dans la direction dans laquelle vous regardez le cadre noir
                            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;
        //Créer une instance de la classe Scanner
        //Entrée standard avec système d'argument.spécifier dans
        Scanner scanner = new Scanner(System.in);
        int x, y;
        while (!is_game_end) {
            //Invite de message
            System.out.println("Player = " + player);
            System.out.print("Entrez dans l'ordre de x y> ");
            x = scanner.nextInt();
            y = scanner.nextInt();
            
            //Afficher le contenu saisi à l'écran
            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);
            } 
        }
        

        //Fermer une instance de la classe Scanner
        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("Noir gagne");
        } else if(black<white) {
            System.out.println("Blanc gagne");
        } else {
            System.out.println("dessiner");
        }
    }
}

Implémentation Uno

Édition maintenant

Type défini par l'utilisateur

Contrôle d'accès

Héritage, polymorphisme à l'exécution

Avantages de la programmation orientée objet

À la fin

Matériel de référence

Recommended Posts

Introduction à la programmation pratique
Présentation de «Introduction à la programmation pratique de la rouille» (jour 3)
Introduction à la programmation fonctionnelle (Java, Javascript)
Introduction à la programmation pour les étudiants du Collège: Introduction
Introduction à Ruby 2
Introduction à Micronaut 1 ~ Introduction ~
[Java] Introduction à Java
Introduction à la migration
Introduction à Java
Introduction à Doma
Introduction à la programmation pour les étudiants du collégial: variables
Introduction au développement pratique de conteneurs Docker / Kubernetes
Introduction aux fichiers JAR
Introduction à Ratpack (8) - Session
Introduction à l'arithmétique des bits
Introduction à Ratpack (6) - Promesse
Introduction à Ratpack (9) --Thymeleaf
Introduction à PlayFramework 2.7 ① Présentation
Introduction à la mise en page Android
Introduction aux modèles de conception (introduction)
Introduction à kotlin pour les développeurs iOS ⑤-XML pratique
Introduction à la commande javadoc
Introduction à la commande jar
Introduction à Ratpack (2) -Architecture
Introduction au style lambda
Introduction à la commande java
Introduction au développement de Keycloak
Introduction à la commande javac
Introduction à la programmation pour les étudiants du collégial (mise à jour de temps à autre)
Introduction à la programmation pour les étudiants du Collège: création de canevas
Introduction aux modèles de conception (Builder)
Introduction à Ratpack (5) --Json & Registry
Introduction à la métabase ~ Construction de l'environnement ~
Introduction à Ratpack (7) --Guice & Spring
(Installation par points) Introduction à Java8_Impression
Introduction aux modèles de conception (composite)
Introduction à Micronaut 2 ~ Test unitaire ~
Introduction à JUnit (note d'étude)
Introduction à Spring Boot ① ~ DI ~
Introduction aux modèles de conception (poids mouche)
[Java] Introduction à l'expression lambda
Introduction à Spring Boot ② ~ AOP ~
Introduction à Apache Beam (2) ~ ParDo ~
Introduction à l'API EHRbase 2-REST
Introduction au prototype de modèles de conception
[Java] Introduction à l'API Stream
Introduction aux modèles de conception (Iterator)
Introduction à Spring Boot, partie 1
Introduction à Ratpack (1) - Qu'est-ce que Ratpack?
Introduction aux modèles de conception (stratégie)
[Introduction aux jeux Janken (comme)] Java