Générateur de parties de sudoku

Description

Code d'origine : http://www.csharpfr.com/codes/GENERATEUR-GRILLES-SUDOKU-RESOLUES_53820.aspx

Ce code est une version modifiée du code de robx2391. À la base, son programme est un générateur de grilles de Sudoku résolues.

Il est désormais possible de faire des parties de Sudoku. Pour cela, deux nouveaux boutons ont été ajoutés. Un de ces boutons permet de commencer une nouvelle partie, en entrant le nombre de cases à cacher. L'autre sert à vérifier les réponses entrées, met en rouge les mauvaises réponses et met en vert les bonnes réponses.

Pour la vérification, le programme compare la grille de la DataGridView affichée à la grille résolue, qui est cachée.

Source / Exemple :


/********************************************************************

  • Code original par robx2391 *
  • Modifié par Gabriel Côté-Moïsescu (MisterEpic) *
  • ******************************************************************/
/********************************************************************
  • Modifications *
  • 2011/12/15 : - Boutons boutonJouer et boutonVerif ajoutés *
  • - Événements correspontants aux boutons programmés *
  • - Fonctions razGrille et estRemplie ajoutées *
  • - Objet de type Grille et objet de type List<int[]> *
  • ajoutés dans la classe et utilisés dans les *
  • événements de boutons *
  • - Fonction gen_Click légèrement modifiée *
  • - Événement grillSudok_CellEndEdit ajoutée *
  • *****************************************************************/
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { private Grille resolue; private List<int[]> casesOccupees; private static int COLUMN_WIDTH = 30; private static int ROW_HEIGHT = 30; public Form1() { InitializeComponent(); grillSudok.RowCount = 9; grillSudok.ColumnCount = 9; grillSudok.AllowUserToResizeColumns = false; grillSudok.AllowUserToResizeRows = false; for (int i = 0; i < 9; i++) { grillSudok.Columns[i].Width = COLUMN_WIDTH; for(int j=0;j<9;j++) { grillSudok.Rows[j].Height = ROW_HEIGHT; grillSudok.Rows[j].Cells[i].Style.Alignment = DataGridViewContentAlignment.MiddleCenter; } } } private void gen_Click(object sender, EventArgs e) { boutonVerif.Enabled = false; razGrille(); int ligne = 0, col=0; //MessageBox.Show("1"); resolue = new Grille(); //MessageBox.Show("algo finit"); for (int position = 0; position < 81; ++position) { ligne = position / 9; col = position % 9; grillSudok.Rows[ligne].Cells[col].Value = resolue.getValCase(ligne, col); } } private bool estRemplie(int x, int y) { bool ok = false; foreach (int[] uneCase in casesOccupees) { if (uneCase[0] == x && uneCase[1] == y) { ok = true; break; } } return ok; } private void buttonJouer_Click(object sender, EventArgs e) { razGrille(); int ligne = 0, col = 0; FormNbCases fnc = new FormNbCases(); if (fnc.ShowDialog() == DialogResult.OK) { int casesCachees = (int)fnc.nbCasesCacher.Value; resolue = new Grille(); Random rnd = new Random(); casesOccupees = new List<int[]>(); for (int position = 0; position < 81 - casesCachees; ++position) { while (true) { ligne = rnd.Next(0, 9); col = rnd.Next(0, 9); if (!estRemplie(ligne, col)) { grillSudok.Rows[ligne].Cells[col].Value = resolue.getValCase(ligne, col); casesOccupees.Add(new int[] { ligne, col }); break; } } } boutonVerif.Enabled = true; } } private void buttonVerif_Click(object sender, EventArgs e) { for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { //grillSudok.Rows[i].Cells[j].Value if (grillSudok.Rows[i].Cells[j].Value != null) { try { if (Convert.ToInt32(grillSudok.Rows[i].Cells[j].Value) == resolue.getValCase(i, j)) { if (!estRemplie(i, j)) grillSudok.Rows[i].Cells[j].Style.ForeColor = Color.Green; } else grillSudok.Rows[i].Cells[j].Style.ForeColor = Color.Red; } catch (FormatException) { MessageBox.Show("Veuillez n'entrer que des nombres dans les cases."); } } } } } private void razGrille() { for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) grillSudok.Rows[i].Cells[j].Value = null; } } private void grillSudok_CellEndEdit(object sender, DataGridViewCellEventArgs e) { if (boutonVerif.Enabled && estRemplie(e.RowIndex, e.ColumnIndex)) grillSudok.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = resolue.getValCase(e.RowIndex, e.ColumnIndex); } } }

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.