D'un traducteur: ce poste est une traduction de l'
article original de Maki Chiz, un codeur expérimenté qui non seulement écrit de grands programmes, mais démontre également les capacités de différentes langues à ses collègues, débutants et professionnels.
Démineur est un jeu amusant, beaucoup d'entre nous y jouent. Peut-être que vous voulez fabriquer vous-même un démineur?
Skillbox recommande: La profession en ligne «Profession de développeur Web» .
Nous vous rappelons: pour tous les lecteurs de «Habr» - une remise de 10 000 roubles lors de l'inscription à un cours Skillbox en utilisant le code promo «Habr».
Le caractère unique du jeu est qu'il est très simple et en même temps très excitant. Il n'y a pas de mécanique de jeu astucieuse dans Démineur, il vous suffit de cliquer sur les cases, en espérant qu'il n'y ait pas de mines en dessous.
Je suggère d'essayer d'écrire "Démineur" sur le traitement. Il s'agit d'un excellent outil qui vous permet de créer des applications graphiques en Java. Lien
ici .
Avant de commencer, je dirai que ce tutoriel est destiné à ceux qui connaissent déjà Java. L'expérience du traitement est facultative.
Alors c'est parti. La première étape consiste à déterminer l'état du jeu. J'ai décidé de l'implémenter comme ça.
int gridW;
Tout semble avoir du sens ici, à l'exception de cette section:
int [] [] mines . Pourquoi le réseau minier est-il un entier et non un booléen? Le fait est que cela permet de calculer facilement combien de mines sont proches d'une certaine position.
int calcNear(int x, int y) { int i=0; for (int offsetX=-1; offsetX<=1; offsetX++) { for (int offsetY=-1; offsetY<=1; offsetY++) { i+=mines[offsetX+x][offsetY+y]; } } return i; }
Ce code détermine le nombre de mines situées à proximité d'un site spécifique. Après avoir supprimé les exceptions, nous obtenons quelque chose de similaire à ceci:
boolean outBounds(int x,int y){ return x<0||y<0||x>=gridW||y>=gridH; } int calcNear(int x, int y) { if(outBounds(x,y))return 0; int i=0; for (int offsetX=-1; offsetX<=1; offsetX++) { for (int offsetY=-1; offsetY<=1; offsetY++) { if (outBounds(offsetX+x, offsetY+y))continue; i+=mines[offsetX+x][offsetY+y]; } } return i; }
La tâche principale du jeu lui-même est de révéler les carrés commençant au point x, y.
void reveal(int x, int y){ if(outBounds(x,y))return; if(revealed[x][y])return; revealed[x][y]=true; if(calcNear(x,y)!=0)return; reveal(x-1,y-1); reveal(x-1,y+1); reveal(x+1,y-1); reveal(x+1,y+1); reveal(x-1,y); reveal(x+1,y); reveal(x,y-1); reveal(x,y+1); }
En conséquence, nous avons l'algorithme suivant:
- Si la position est en dehors du champ, terminez;
- Si le poste est divulgué, mettez fin;
- Nous ouvrons la position actuelle;
- Si nous avons une bombe près de la position actuelle, finissons;
- Si nous avons atteint ce point lors de l'exécution de la fonction, la position actuelle dans le terrain de jeu a été trouvée et il n'y a pas de bombes à côté, ouvrez des carrés adjacents.
Fondamentalement, le reste du jeu est le même. Le code complet peut être trouvé en cliquant sur
ce lien .
Si vous voulez en savoir plus sur la visualisation, lisez la suite.
VisualisationTout doit être clair ici, mais je vais expliquer les parties difficiles.
Nous avons donc une variable cellSize, qui détermine le nombre de pixels dans chaque carré.
void settings(){ size(gridW*cellSize, gridH*cellSize); }
Ainsi, nous créons un champ avec les côtés gridW x gridH, où les tailles de chaque carré seront égales à la valeur de cellSize.
Ensuite, nous retournons les variables à leur état d'origine.
void setup(){
Pour initialiser un champ:
Et puis activez la réponse aux clics de souris.
Et la fonction d'affichage, nous l'appelons une fois pour chaque image.
void draw() { background(0);
Et c'est tout, voici notre Démineur.
Le jeu semble simple, mais dans l'ensemble, il est entièrement fonctionnel. Et rappelez-vous: le démineur crée une dépendance!
Skillbox recommande: