batebates/sudoku

View on GitHub
src/model/Sudoku.rb

Summary

Maintainability
A
1 hr
Test Coverage
#<b>Auteur</b> Decrand Baptiste,Zerbane Mehdi
#
#<b>Version</b> 1.0
#
#<b>Date</b> 08/02/2017
#
#=== Permet la création d'une grille de sudoku composé de case ainsi que les méthodes associées
#<b>Liste des méthodes
#*cazeAt
#*setValue
#*valueCheck
#gridFull
#</b>
class Sudoku
#== Variables d'instance ==
    @tcaze
    attr_reader :tcaze
#==========================


    #===Initialise une grille de sudoku
    #
    # Params:
    # @param str [String] indique la chaine de caractère décrivant le contenu du soduku
    def initialize(str)
        x_length = 9
        y_length = 9

        @tcaze = Array.new(x_length);
        @tcaze.each_with_index { |_value, index|
            @tcaze[index] = Array.new(y_length);
        }

        str.split("").each_with_index { |value, index|
            x = index % x_length;
            y = index / x_length;
            @tcaze[x][y] = Caze.create(x, y, value.to_i, false);
        }
    end

    private_class_method :new

    #===Créé une grille de sudoku
    #
    # Params:
    # @param str [String] indique la chaine de caractère décrivant le contenu du soduku
    def Sudoku.create(str)
        new(str)
    end

    #===Renvoie la case correspondant aux coordonnées
    #
    # Params:
    # @param x [int] indique la coordonnée de l'axe des abscisses de la case
    # @param y [int] indique la coordonnée de l'axe des ordonnées de la case
    def cazeAt(x,y)
        return @tcaze[x][y]
    end

    #===Modifie la valeur de la case correspondant aux coordonnées
    #
    # Params:
    # @param x [int] indique la coordonnée de l'axe des abscisses de la case
    # @param y [int] indique la coordonnée de l'axe des ordonnées de la case
    # @param val [int] indique la nouvelle valeur de la case à modifier
    def setValueAt(x,y,val)
         return @tcaze[x][y].value=(val)
    end

    #===Vérifie si une case contient bien une valeur
    #
    # Params:
    # @param x [int] indique la coordonnée de l'axe des abscisses de la case
    # @param y [int] indique la coordonnée de l'axe des ordonnées de la case
    def hasValue?(x,y)
        return @tcaze[x][y].value!=0
    end

    #===Vérifie si la grille est remplie
    #
    def gridFull()
        res = true
        @tcaze.each do |tab|
            tab.each do |elt|
                if elt.value==0
                    res = false
                end
            end
        end
        return res
    end

#===Affiche le sudoku
    def to_s
        cpt=0
        @tcaze.each do |tab|
            tab.each do |elt|
                print elt.value().to_s + " "
                cpt += 1
                if cpt%9==0
                    print "\n"
                end
            end
        end
    end


    def rowValue(y)
        values = [];
        SudokuAPI.API.row(y).each { |caze|
            values.push(caze.value);
        }
        return values;
    end

    def columnValue(x)
        values = [];
        SudokuAPI.API.column(x).each { |caze|
            values.push(caze.value);
        }

        return values;
    end

    def squareValue(x,y)
        values = [];
        SudokuAPI.API.square(x,y).each { |caze|
            values.push(caze.value);
        }

        return values;
    end

#===Verifie Validité de la grille
#
    def valid?()
        if(gridFull()) #Verifie si grille pleine
            for i in 0...9
                if rowValue(i).uniq.length != rowValue(i).length
                    return false
                elsif columnValue(i).uniq.length != columnValue(i).length
                    return false
                elsif squareValue((x%3),(y/3).floor).uniq.length != squareValue((x%3),(y/3).floor).length
                    return false;
                end
            end
            return true
        end
        return true
    end
end