Batch Index du Forum
S’enregistrerRechercherFAQMembresGroupesConnexion
Répondre au sujet Page 1 sur 1
Zocqu'mines (démineur)
Auteur Message
Répondre en citant
Message Zocqu'mines (démineur) 
Salut les gens Wink

Je sais que ça fait un bout de temps que je ne suis pas venu par ici, donc je suis désolé, mais il se peut que mon ralentissement dans ma fréquentation du fofo continue.
Dernièrement, j'ai eu un tp d'info sur un simulacre de démineur et comme j'avais fini au bout de moins de la moitité, j'ai décidé de faire un petit démineur.

Bon le démineur est dans la console, mais c'est que j'aime les jeux en mode old school et j'avais pas le temps de faire des images pour le jeux dans le temps du tp.
Bon a l'origine c'était en argadz' mais je l'ai traduit pour vos petits yeux, sauf pour le titre ("Zocqu'Mines"), j'avais pas le courage Razz

Vous pouvez le télecharger là : https://app.box.com/s/18uep8j3rdkavxuyevkj


Module1.vb
Code:
Imports System.Console

Module Module1
    Dim theGame As Game
    Dim row As Integer = 52
    Dim line As Integer = 20
    Dim mine As Integer = 214

    Sub Main()
        Do
            MainMenu()
            theGame = New Game(row, line, mine)
            theGame.Play()
        Loop
    End Sub

    Sub MainMenu()
        Dim key As ConsoleKeyInfo
        Dim ok As Boolean = False
        Clear()
        ForegroundColor = ConsoleColor.White
        BackgroundColor = ConsoleColor.DarkGreen
        WriteLine()
        WriteLine("                                                                               ")
        WriteLine("                                     <>                                        ")
        WriteLine("        _-___                         )  /\\,/\\,                              ")
        WriteLine("            /                           /| || ||   '                           ")
        WriteLine("           /   /'\\  _-_  /'\\ \\ \\    || || ||  \\ \\/\\  _-_   _-_,         ")
        WriteLine("         =/=  || || ||   || || || ||    ||=|= ||  || || || || \\ ||_.          ")
        WriteLine("         /    || || ||   || || || ||   ~|| || ||  || || || ||/    ~ ||         ")
        WriteLine("        /-__- \\,/  \\,/ \\,|| \\/\\    |, \\,\\, \\ \\ \\ \\,/  ,-_-          ")
        WriteLine("                            ||         _-                                      ")
        WriteLine("                            '`                                                 ")
        WriteLine("                                                                               ")
        ForegroundColor = ConsoleColor.Gray
        BackgroundColor = ConsoleColor.Black
        WriteLine("")
        WriteLine("    Zocqu'Mines Version 2.14 - Copyleft (c) Darkbatcher 2014 ")
        WriteLine("")
        WriteLine("                        Que voulez-vous faire ?")
        WriteLine()
        WriteLine("                         M   : Jouer")
        WriteLine("                         P   : modifier les paramètres")
        WriteLine("                         ESC : quitter le jeu.")

        While Not ok
            key = ReadKey(True)

            Select Case (key.Key)
                Case ConsoleKey.M
                    ok = True
                Case ConsoleKey.Escape
                    End
                Case ConsoleKey.P
                    Parameters()
                    ok = True
            End Select
        End While
        Clear()
    End Sub

    Sub Parameters()
        Clear()
        WriteLine("Zocqu'Mines Version 2.14 - Copyleft (c) Darkbatcher 2014")
        WriteLine("")
        WriteLine("Paramètres du jeu")
        WriteLine("")
        Do
            WriteLine("Entrez le nombre de colonnes du jeu [par défaut 52]")
            row = GetNb(52)
            WriteLine("Vous avez entré : " & row)
        Loop While Not PromptOk()
        WriteLine("")
        Do
            WriteLine("Entrez le nombre de ligne du jeu [par défaut 20](inférieur a 21)")
            line = GetNb(20)
            If line > 21 Then
                line = 21
            End If
            WriteLine("Vous avez entré : " & line)
        Loop While Not PromptOk()
        WriteLine("")
        Do
            WriteLine("Entrez le nombre de mines du jeu [par défaut 214]")
            mine = GetNb(214)
            If mine >= (line * row) * 0.75 Then
                mine = (row * line) * 0.75
            End If
            WriteLine("Vous avez entré : " & mine)
        Loop While Not PromptOk()
    End Sub

    Function GetNb(ByVal def As Integer) As Integer
        Dim str As String
        str = ReadLine()

        Try
            Return CInt(str)
        Catch
            Return def
        End Try
    End Function


    Function PromptOk() As Boolean
        Dim key As ConsoleKeyInfo
        WriteLine("Continuer ? (O/N)")
        Do
            key = ReadKey(True)
            Select Case (key.Key)
                Case ConsoleKey.O
                    Return True
                Case ConsoleKey.N
                    Return False
            End Select
        Loop
    End Function

End Module


Game.vb
Code:
Option Explicit On
Option Strict On

Imports System
Imports System.Console

Enum GameAction
    reveal
    flag
    point
    clear
    none
    quit
End Enum

Public Class Game
    Private _action As GameAction
    Private _row As Integer = 60
    Private _line As Integer = 20
    Private _mines As Integer = 214
    Private _died As Boolean = False
    Private _quit As Boolean = False
    Private theGrid As Grid

    Public Sub New(ByVal row As Integer, ByVal line As Integer, ByVal mine As Integer)
        theGrid = New Grid(row, line, mine)

        _row = row
        _mines = mine
        _line = line
    End Sub

    Public Sub Play()
        'Clear() ' Efface la console
        ShowMsg("Enter: Regarder M: Marquer P: Marquer un ? SPACE: Effacer ESC: Quitter le jeu" & Environment.NewLine _
     & "   Copyleft (c) DarkBatcher 2014")

        While Not _died And Not _quit And Not theGrid.TestWin()
            theGrid.Display(0, 0) ' Affiche la grille
            GetAction() ' Attend une action de la part de l'utilisateur
            ExecAction(theGrid) ' Effectue l'action demandée par l'utilisateur
        End While

        If _died Then
            theGrid.RevealAll(True)
        End If

        theGrid.Display(0, 0)

        If _died Then
            ShowMsg("** Boum ! *** ... Manque de chance, il y avait une mine là")
        ElseIf Not _quit Then
            ShowMsg("Ca, c'est fait, plus aucune mine")
        End If

        If Not _quit Then
            ReadLine()
        End If

        Clear()

    End Sub

    Private Sub GetAction()
        Dim key As ConsoleKeyInfo

        _action = GameAction.none

        While _action = GameAction.none
            key = ReadKey(True)
            Select Case (key.Key)
                Case ConsoleKey.UpArrow
                    If CursorTop > 0 Then
                        CursorTop -= 1
                    End If
                Case ConsoleKey.DownArrow
                    If CursorTop < _line - 1 Then
                        CursorTop += 1
                    End If
                Case ConsoleKey.RightArrow
                    If CursorLeft < _row - 1 Then
                        CursorLeft += 1
                    End If
                Case ConsoleKey.LeftArrow
                    If CursorLeft > 0 Then
                        CursorLeft -= 1
                    End If
                Case ConsoleKey.Enter
                    _action = GameAction.reveal
                Case ConsoleKey.M
                    _action = GameAction.flag
                Case ConsoleKey.P
                    _action = GameAction.point
                Case ConsoleKey.Spacebar
                    _action = GameAction.clear
                Case ConsoleKey.Escape
                    ShowMsg("Voulez vous vraiment quitter ? (O/N)")
                    While key.Key <> ConsoleKey.N
                        key = ReadKey(True)
                        If key.Key = ConsoleKey.O Then
                            _action = GameAction.quit
                            Exit While
                        End If
                    End While
                    ShowMsg("Enter: Regarder M: Marquer P: Marquer un ? SPACE: Effacer ESC: Quitter le jeu" & Environment.NewLine _
     & "   Copyleft (c) DarkBatcher 2014")
            End Select
        End While
    End Sub

    Private Sub ExecAction(ByVal theGrid As Grid)
        Select Case (_action)
            Case GameAction.reveal
                _died = theGrid.Reveal(CursorLeft + 1, CursorTop + 1)
            Case GameAction.flag
                theGrid.SetMark(CursorLeft + 1, CursorTop + 1, BlockMark.flag)
            Case GameAction.point
                theGrid.SetMark(CursorLeft + 1, CursorTop + 1, BlockMark.point)
            Case GameAction.clear
                theGrid.SetMark(CursorLeft + 1, CursorTop + 1, BlockMark.none)
            Case GameAction.quit
                _quit = True
        End Select
    End Sub

    Private Sub ShowMsg(ByVal msg As String)
        Dim x, y As Integer

        x = CursorTop
        y = CursorLeft
        CursorLeft = 0
        CursorTop = 21

        WriteLine("                                                                                                                                                       ")
        CursorLeft = 0
        CursorTop = 21

        Writeline(msg)

        CursorTop = x
        CursorLeft = y
    End Sub

End Class



Grid.vb
Code:
Option Explicit On
Option Strict On

Imports System
Imports Microsoft.VisualBasic
Imports System.Console

Public Class Grid
    Private _grid(,) As Block ' la grille
    Private _row As Integer ' le nombre de colonnes de la grille
    Private _line As Integer ' le nombre de lignes de la grille
    Private _visible As Integer ' le nombre de cases visibles
    Private _mines As Integer ' le nombre de mines   

    Public Sub New(ByVal row As Integer, ByVal line As Integer, ByVal mines As Integer)
        Dim i, j As Integer
        Dim nb As Integer = 1
        ReDim _grid(row - 1, line - 1) ' on redimensionne la grille aux bonnes dimensions

        If mines > row * line Then
            Return
        End If

        _row = row
        _line = line
        _mines = mines
        _visible = 0

        For i = 0 To row - 1 ' on remplit la grille
            For j = 0 To line - 1
                _grid(i, j) = New Block(False, False)
            Next j
        Next i

        Randomize()

        While mines > 1
            i = CInt(Math.Ceiling(Rnd() * (row - 1)))
            j = CInt(Math.Ceiling(Rnd() * (line - 1)))
            If _grid(i, j).Mine Then
                Continue While
            End If
            _grid(i, j).Mine = True
            CountMinesAround(i, j)
            mines = mines - 1
            nb += 1
        End While
    End Sub

    Private Sub CountMinesAround(ByVal i As Integer, ByVal j As Integer)
        AddMineAt(i + 1, j)
        AddMineAt(i - 1, j)
        AddMineAt(i + 1, j + 1)
        AddMineAt(i, j + 1)
        AddMineAt(i - 1, j + 1)
        AddMineAt(i + 1, j - 1)
        AddMineAt(i, j - 1)
        AddMineAt(i - 1, j - 1)
    End Sub

    Private Sub AddMineAt(ByVal x As Integer, ByVal y As Integer)
        If (x >= 0) And (x < _row) And (y >= 0) And (y < _line) Then
            _grid(x, y).IncBombCounter()
        End If
    End Sub

    Public Function TestWin() As Boolean
        Return (_mines + _visible) = (_row * _line)
    End Function

    Public Function Reveal(ByVal row As Integer, ByVal line As Integer) As Boolean
        If (row < 1) Or (row > _row) Or (line < 1) Or (line > _line) Then
            Return False
        End If

        If _grid(row - 1, line - 1).Mine Then
            _grid(row - 1, line - 1).Visible = True
            Return True ' Le joueur est mort
        End If

        Reveal_Recursive(row, line)
        Return False
    End Function

    Public Sub RevealAll(ByVal state As Boolean)
        For i As Integer = 0 To _row - 1
            For j As Integer = 0 To _line - 1
                _grid(i, j).Visible = state
            Next j
        Next i
    End Sub

    Public Sub SetMark(ByVal row As Integer, ByVal line As Integer, ByVal mark As BlockMark)
        If (row < 1) Or (row > _row) Or (line < 1) Or (line > _line) Then
            Return
        End If

        _grid(row - 1, line - 1).Mark = mark

    End Sub

    Public Sub Display(ByVal x As Integer, ByVal y As Integer)
        Dim saveX, saveY As Integer

        saveX = CursorLeft
        saveY = CursorTop

        CursorLeft = x
        CursorTop = y

        For i As Integer = 0 To _line - 1
            For j As Integer = 0 To _row - 1
                Select Case (_grid(j, i).Mark)
                    Case BlockMark.none
                        If _grid(j, i).Visible Then
                            If _grid(j, i).Mine Then
                                ForegroundColor = ConsoleColor.Red
                                Write("*")
                            ElseIf _grid(j, i).around <> 0 Then
                                Select Case (_grid(j, i).around)
                                    Case 1
                                        ForegroundColor = ConsoleColor.Cyan
                                    Case 2
                                        ForegroundColor = ConsoleColor.DarkCyan
                                    Case 3
                                        ForegroundColor = ConsoleColor.Blue
                                    Case 4
                                        ForegroundColor = ConsoleColor.DarkBlue
                                    Case 5
                                        ForegroundColor = ConsoleColor.Magenta
                                    Case 6
                                        ForegroundColor = ConsoleColor.DarkMagenta
                                    Case 7 To 8
                                        ForegroundColor = ConsoleColor.DarkRed
                                End Select
                                Write(_grid(j, i).around)
                            Else
                                Write(" ")
                            End If
                        Else
                            ForegroundColor = ConsoleColor.Gray
                            Write("X")
                        End If
                    Case BlockMark.flag
                        ForegroundColor = ConsoleColor.Red
                        Write("+")
                    Case BlockMark.point
                        ForegroundColor = ConsoleColor.Green
                        Write("?")
                End Select
            Next j
            WriteLine("")
        Next i
        ForegroundColor = ConsoleColor.Gray
        CursorTop = saveY
        CursorLeft = saveX
    End Sub

    Private Sub Reveal_Recursive(ByVal row As Integer, ByVal line As Integer)
        If (row < 1) Or (row > _row) Or (line < 1) Or (line > _line) Then
            Return
        End If

        If _grid(row - 1, line - 1).Mine Or _grid(row - 1, line - 1).Visible Or _
           _grid(row - 1, line - 1).Mark <> BlockMark.none Then
            Return
        End If

        _grid(row - 1, line - 1).Visible = True

        _visible += 1

        If _grid(row - 1, line - 1).around <> 0 Then
            Return
        End If

        Reveal_Recursive(row - 1, line)
        Reveal_Recursive(row + 1, line)
        Reveal_Recursive(row, line - 1)
        Reveal_Recursive(row + 1, line - 1)
        Reveal_Recursive(row - 1, line - 1)
        Reveal_Recursive(row, line + 1)
        Reveal_Recursive(row + 1, line + 1)
        Reveal_Recursive(row - 1, line + 1)
    End Sub

End Class


Block.vb
Code:
Option Explicit On
Option Strict On

Imports System

Public Enum BlockMark
   none
   flag
   point
End Enum

Public Class Block ' Structure representant un bloc du démineur
   Private _visible As Boolean   ' Vrai si le bloc est visible
   Private _mine As Boolean ' Vrai si le bloc est une mine
   Private _around As Integer ' Nombre de blocs alentours qui sont des mines
   Private _mark As BlockMark ' Le dessin affiché sur le bloc
   
   Public Sub New(ByVal visible As Boolean, ByVal mine As Boolean)
      _visible = visible
      _mine = mine
      _around = 0
   End Sub
   
   Public Property Visible() As Boolean
      GET
         Return _visible
      END GET
      SET(ByVal val As Boolean)
         _visible = val
      END SET
   End Property    
   
   Public Property Mine() As Boolean
      GET
         Return _mine
      END GET
      SET(ByVal val As Boolean)
         _mine = val
      END SET
   End Property

   Public Property Mark() As BlockMark
      GET
         Return _mark
      END GET
      SET(ByVal val As BlockMark)
         _mark = val
      END SET
   End Property
   
   Public Sub IncBombCounter()
      _around = _around+1
   End Sub
   
   Public Function around() As integer
      Return _around
   End Function
   
End Class



à bientôt les amis Wink




______________________________________________________
--
> Que pensez vous de l'ajout du repertoire point dans $PATH ?
Ma version de troll 18.0.32 beta 3 vient de me faire un core dump.
-+- SE in Guide du Linuxien Pervers : Bien développer son troll -+-

[Dos9]
Visiter le site web du posteur Skype
Message Publicité 
PublicitéSupprimer les publicités ?


Répondre en citant
Message Zocqu'mines (démineur) 
Salut Dark,

ça fait plaisir de te relire Okay

Et merci pour le jeu....


A+

Wink




______________________________________________________
AffPng.exe , StringBetween.exe , Hex2Png.exe
Répondre en citant
Message Zocqu'mines (démineur) 
Hey ! Darkouner en vb.net ! Merci pour ton partage ! En plus c'est en console ! Donc c'est très enrichissent !

N'hésite pas a passer a la version graphique !




______________________________________________________


mon site web http://pr1c3-game.craym.eu/
aide moi a faire revivre la section vb ! (http://batch.xoo.it/f62-VB-Net.htm)

"J'ai toujours raison surtout quand j'ai tord" citation de moi même
mon niveau
batch : 40/100
vb : 60/100
Visiter le site web du posteur Skype
Répondre en citant
Message Zocqu'mines (démineur) 
Cool, bravo !




______________________________________________________
Visiter le site web du posteur
Répondre en citant
Message Zocqu'mines (démineur) 
Ahhh, ça fait plaisir de te revoir Okay

Merci du partage, continues comme ça Laughing Okay




______________________________________________________
Une question ? N'hésitez pas à me contacter par Message Privé ou via le topique concerné.
Visiter le site web du posteur
Message Zocqu'mines (démineur) 


Montrer les messages depuis:
Répondre au sujet Page 1 sur 1
  



Index | créer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Copyright 2008 - 2016 // Batch