Skip to content
Snippets Groups Projects
Commit 2775d28d authored by Jolibois Simon's avatar Jolibois Simon
Browse files

ajout complet du sudoku depuis le gitlab de Thomas

parent e3c809dd
No related branches found
No related tags found
No related merge requests found
# This file is used to ignore files which are generated
# ----------------------------------------------------------------------------
*~
*.autosave
*.a
*.core
*.moc
*.o
*.obj
*.orig
*.rej
*.so
*.so.*
*_pch.h.cpp
*_resource.rc
*.qm
.#*
*.*#
core
!core/
tags
.DS_Store
.directory
*.debug
Makefile*
*.prl
*.app
moc_*.cpp
ui_*.h
qrc_*.cpp
Thumbs.db
*.res
*.rc
/.qmake.cache
/.qmake.stash
# qtcreator generated files
*.pro.user*
# xemacs temporary files
*.flc
# Vim temporary files
.*.swp
# Visual Studio generated files
*.ib_pdb_index
*.idb
*.ilk
*.pdb
*.sln
*.suo
*.vcproj
*vcproj.*.*.user
*.ncb
*.sdf
*.opensdf
*.vcxproj
*vcxproj.*
# MinGW generated files
*.Debug
*.Release
# Python byte code
*.pyc
# Binaries
# --------
*.dll
*.exe
import QtQuick 2.0
import QtQuick 2.11
import QtQuick.Window 2.11
import QtQuick.Layouts 1.1
import QtQuick.Controls 1.4
Item {
id: monCarre
width: 154
height: 154
property alias case9: case9
property alias case8: case8
property alias case7: case7
property alias case6: case6
property alias case5: case5
property alias case4: case4
property alias case3: case3
property alias case2: case2
property alias case1: case1
Rectangle {
id: backgroudcarre
color: "#ffffff"
border.width: 2
anchors.fill: parent
focus: true
Case {
id: case1
anchors.left: parent.left
anchors.top: parent.top
chiffreText: qsTr("9")
anchors.leftMargin: 2
anchors.topMargin: 2
MouseArea {
id: mouseArea1
focus: true
anchors.fill: parent
onClicked: {
console.log(Math.floor(monCarre.x/50)+1, Math.floor(monCarre.y/50)+1)
function envoyer_valeur(app){
var i;
var j;
for(i=0;i<9;i++){
for(j=0;j<9;j++){
var carr = repeater.itemAt(i).rep.itemAt(j).input
if (app === carr){
vueObjetCpt.changer_valeur(app.text,i,j);
}
}
}
Case {
id: case2
x: 50
anchors.top: parent.top
chiffreText: qsTr("9")
anchors.topMargin: 2
anchors.horizontalCenter: parent.horizontalCenter
MouseArea {
id: mouseArea2
focus: true
anchors.fill: parent
onClicked: {
console.log(Math.floor(monCarre.x/50)+2, Math.floor(monCarre.y/50)+1)
}
var values = vueObjetCpt.values;
var l
var c
for(l=0;l<9;l++){
for(c=0;c<9;c++){
var v = repeater.itemAt(l).rep.itemAt(c).input
v.text=values[l][c];
}
}
Case {
id: case3
x: 100
y: 0
anchors.right: parent.right
anchors.top: parent.top
chiffreText: qsTr("9")
anchors.rightMargin: 2
anchors.topMargin: 2
MouseArea {
id: mouseArea3
focus: true
anchors.fill: parent
onClicked: {
console.log(Math.floor(monCarre.x/50)+3, Math.floor(monCarre.y/50)+1)
var colors = vueObjetCpt.colors;
for(i=0;i<9;i++){
for(j=0;j<9;j++){
var w = repeater.itemAt(i).rep.itemAt(j)
w.color=colors[i][j];
}
}
}
Case {
id: case4
x: 0
y: 50
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
chiffreText: qsTr("9")
anchors.leftMargin: 2
MouseArea {
id: mouseArea4
focus: true
anchors.fill: parent
onClicked: {
console.log(Math.floor(monCarre.x/50)+1, Math.floor(monCarre.y/50)+2)
function changer_couleur(app, focus){
var i;
var j;
for(i=0;i<9;i++){
for(j=0;j<9;j++){
var carr = repeater.itemAt(i).rep.itemAt(j).input
if (app === carr){
vueObjetCpt.colorer_voisins(i,j,focus);
}
}
}
Case {
id: case5
x: 50
y: 50
anchors.verticalCenter: parent.verticalCenter
chiffreText: "9"
anchors.horizontalCenter: parent.horizontalCenter
MouseArea {
id: mouseArea5
focus: true
anchors.fill: parent
onClicked: {
console.log(Math.floor(monCarre.x/50)+2, Math.floor(monCarre.y/50)+2)
var colors = vueObjetCpt.colors;
for(i=0;i<9;i++){
for(j=0;j<9;j++){
var v = repeater.itemAt(i).rep.itemAt(j)
v.color=colors[i][j];
}
}
}
property alias rep : repeater1
Grid{
id : grid
x: 3; y:3
rows:3; columns:3; spacing :2
Repeater{ id : repeater1
model : 9
Case {
id: case6
x: 0
y: 102
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
chiffreText: qsTr("9")
anchors.rightMargin: 2
MouseArea {
id: mouseArea6
focus: true
anchors.fill: parent
onClicked: {
console.log(Math.floor(monCarre.x/50)+3, Math.floor(monCarre.y/50)+2)
}
}
}
Case {
id: case7
y: 106
anchors.left: parent.left
anchors.bottom: parent.bottom
anchors.leftMargin: 2
anchors.bottomMargin: 2
MouseArea {
id: mouseArea7
focus: true
anchors.fill: parent
onClicked: {
console.log(Math.floor(monCarre.x/50)+1, Math.floor(monCarre.y/50)+3)
}
}
}
Rectangle{
color : "#ffffff"
width : 68; height: 68
property alias input : input
border.width : 2
border.color : "#000000"
Case {
id: case8
x: 68
y: 114
anchors.bottom: parent.bottom
anchors.horizontalCenterOffset: 0
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottomMargin: 2
MouseArea {
id: mouseArea8
focus: true
anchors.fill: parent
onClicked: {
console.log(Math.floor(monCarre.x/50)+2, Math.floor(monCarre.y/50)+3)
}
TextInput{
id:input
color:'#333333'
width : parent.width
height:parent.height
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
readOnly: false
font.pointSize: 24
maximumLength: 1
validator: RegExpValidator { regExp: /[1-9]+/ }
onFocusChanged: {
changer_couleur(this, focus)
}
onTextEdited : envoyer_valeur(this)
}
Case {
id: case9
x: 115
y: 122
anchors.right: parent.right
anchors.bottom: parent.bottom
anchors.bottomMargin: 2
anchors.rightMargin: 2
MouseArea {
id: mouseArea9
focus: true
anchors.fill: parent
onClicked: {
console.log(Math.floor(monCarre.x/50)+3, Math.floor(monCarre.y/50)+3)
}
}
}
}
}
import QtQuick 2.0
Item {
id: maCase
width: 50
height: 50
property alias backgroundCaseBordercolor: backgroundCase.border.color
property alias backgroundCaseColor: backgroundCase.color
property alias chiffreColor: chiffre.color
property alias chiffreText: chiffre.text
Rectangle {
id: backgroundCase
color: "#ffffff"
radius: 0
border.width: 2
anchors.fill: parent
focus: true
MouseArea {
id: mouseArea
anchors.fill: parent
hoverEnabled: true
onEntered: {
parent.color = "#998c8c"
}
onExited: {
parent.color = "#ffffff"
}
onClicked: {
console.log(maCase.x, maCase.y)
}
}
Text {
id: chiffre
text: qsTr("9")
anchors.fill: parent
font.pixelSize: 25
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
font.bold: true
font.family: "Verdana"
}
}
}
import QtQuick 2.0
Item {
id: maGrille
width: 466
height: 466
property alias carre9: carre9
property alias carre8: carre8
property alias carre7: carre7
property alias carre6: carre6
property alias carre5: carre5
property alias carre4: carre4
property alias carre3: carre3
property alias carre2: carre2
property alias carre1: carre1
Rectangle {
id: backgroundGrille
color: "#ffffff"
border.width: 2
anchors.fill: parent
Carre {
id: carre1
anchors.left: parent.left
anchors.top: parent.top
case9.chiffreText: qsTr("9")
case8.chiffreText: qsTr("9")
case7.chiffreText: qsTr("9")
case6.chiffreText: qsTr("9")
case5.chiffreText: qsTr("9")
case4.chiffreText: qsTr("9")
case3.chiffreText: qsTr("9")
case2.chiffreText: qsTr("9")
case1.chiffreText: qsTr("9")
anchors.leftMargin: 2
anchors.topMargin: 2
}
Carre {
id: carre2
x: 178
anchors.top: parent.top
case9.chiffreText: qsTr("")
case8.chiffreText: qsTr("")
case7.chiffreText: qsTr("")
case6.chiffreText: qsTr("")
case5.chiffreText: qsTr("")
case4.chiffreText: qsTr("")
case3.chiffreText: qsTr("")
case2.chiffreText: qsTr("")
case1.chiffreText: qsTr("9")
anchors.horizontalCenter: parent.horizontalCenter
anchors.topMargin: 2
}
Carre {
id: carre3
x: 347
anchors.right: parent.right
anchors.top: parent.top
anchors.rightMargin: 2
anchors.topMargin: 2
}
Carre {
id: carre4
y: 191
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.leftMargin: 2
}
Carre {
id: carre5
x: 279
y: 219
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
}
Carre {
id: carre6
x: 361
y: 199
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
anchors.rightMargin: 2
}
Carre {
id: carre7
y: 338
anchors.left: parent.left
anchors.bottom: parent.bottom
anchors.leftMargin: 2
anchors.bottomMargin: 2
}
Carre {
id: carre8
x: 225
y: 330
anchors.bottom: parent.bottom
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottomMargin: 2
}
Carre {
id: carre9
x: 316
y: 316
anchors.right: parent.right
anchors.bottom: parent.bottom
anchors.rightMargin: 2
anchors.bottomMargin: 2
}
}
}
# Projet Sudoku
# sudoku
Le projet est en cours de développement
......@@ -23,11 +23,7 @@ qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
DISTFILES +=
HEADERS += \
grille.h
DISTFILES += \
Carre.qml \
Case.qml \
Case.qml \
Grille.qml
erase.png

7.39 KiB

#include "grille.h"
#include<iostream>
#include <fstream>
#include <typeinfo>
#include <string>
Grille::Grille(int vd)
{
Alloc();
Init(vd);
}
#include "grille.h"
using namespace std;
Grille::Grille(QObject *parent) : QObject(parent){
ifstream myFile("../sudoku/grilles/grilleDebutant.csv"); //choisir la grille ici
string ligne[9];
Grille::Grille(const Grille &D)
{
Alloc();
int i = 0;
for(int i=0; i<9; i++)
for(int j=0; j<9; j++)
T[i][j] = D.T[i][j];
while(myFile.good() & (i<9)){
getline(myFile,ligne[0],'|');
getline(myFile,ligne[1],'|');
getline(myFile,ligne[2],'|');
getline(myFile,ligne[3],'|');
getline(myFile,ligne[4],'|');
getline(myFile,ligne[5],'|');
getline(myFile,ligne[6],'|');
getline(myFile,ligne[7],'|');
getline(myFile,ligne[8],'\n');
for(int k=0;k<9;k++){
if (ligne[k]!="."){
grille[i][k]=ligne[k];
}
Grille::~Grille(){
if (T != NULL) {
Free();
T = NULL;
}
i++;
}
Print();
matriceToVectors();
void Grille::Free(){
// coloriage des cases en blanc
QList<QString> colors_case;
for(int i =0;i<9;i++){
delete [] T[i];
colors_case.push_back("white");
}
for(int j =0;j<9;j++){
colors.push_back(colors_case);
}
delete [] T;
}
void Grille::verif_matrice(){
// verifie si la grille remplie par le joueur vérifie les règles du sudoku ou non
bool victoire = true;
list<string> lok= {"1", "2", "3", "4", "5", "6","7","8", "9"};
void Grille::Alloc(){
T = new int*[9];
for(int i=0; i<9; i++)
T[i] = new int[9];
// vérification par ligne
for(int i=0; i<9; i++){
list<string> L;
for(int j= 0; j<9; j++){
L.push_back(grille[i][j]);
}
L.sort();
victoire = victoire && (L==lok);
}
void Grille::Print(){
// vérification par colonne
for(int i=0; i<9; i++){
cout << endl;
for(int j=0; j<9; j++)
cout << T[i][j] << ", ";
list<string> L;
for(int j= 0; j<9; j++){
L.push_back(grille[j][i]);
}
L.sort();
victoire = victoire && (L==lok);
}
// vérification par case 3x3
for(int l=0; l<3;l++){
for(int c = 0; c<3; c++){
list<string> L;
for(int i=3*l; i<3*l+3; i++){
for(int j=3*c; j<3*c+3; j++){
L.push_back(grille[i][j]);
}
}
L.sort();
victoire = victoire && (L==lok);
}
cout <<endl<<endl;
}
verif = victoire;
emit verifClicked();
}
void Grille::Init(int value){
for(int i=0; i<9; i++)
for(int j=0; j<9; j++)
T[i][j]=value;
void Grille::set_chiffre_actif(int i){
changer_valeur(i, caseselected[0], caseselected[1]);
emit chiffreActifChanged();
}
void Grille::matriceToVectors(){
//passage d'un array nommé grille de taille 9x9 de string à valeurs qui est une QList<QList<QString>>
QList<QString> case1,case2,case3,case4,case5,case6,case7,case8,case9;
void Grille::Set(int x, int y, int value) {
/* Modifie la valeur de la grille aux coordonnées (x,y) par value*/
// on peut encore simplifier tout ca
if (x<9 && 0<=x && 0<=y && y<9){
if (value<=9 && value>0)
T[x][y]=value;
else
cout << "La valeur n'est pas comprise entre 1 et 9." << endl << endl;
for(int i=0;i<3;i++){
for (int j=0;j<3;j++){
case1.append(QString::fromStdString(grille[i][j]));
case2.append(QString::fromStdString(grille[i][j+3]));
case3.append(QString::fromStdString(grille[i][j+6]));
case4.append(QString::fromStdString(grille[i+3][j]));
case5.append(QString::fromStdString(grille[i+3][j+3]));
case6.append(QString::fromStdString(grille[i+3][j+6]));
case7.append(QString::fromStdString(grille[i+6][j]));
case8.append(QString::fromStdString(grille[i+6][j+3]));
case9.append(QString::fromStdString(grille[i+6][j+6]));
}
else
cout << "Les coordonnées ne sont pas adaptées." << endl << endl;
}
valeurs = {case1,case2,case3,case4,case5,case6,case7,case8,case9};
}
void Grille::colorer_X(int i, int l){
// coloriage dans les carrés i à i+3 de la ligne l
for(int k =i;k<i+3;k++)
for(int m=l*3;m<l*3+3;m++)
colors[k][m]="#eaeaea";
}
int Grille::Get(int x, int y){
return T[x][y];
void Grille::colorer_Y(int i, int c){
// coloriage dans tous les carrés de la colonne i (entre 0 et 2) de la colonne l (entre 0 et 2 également)
for (int k=i;k<i+7;k+=3)
for (int m=c;m<c+7;m+=3)
colors[k][m]="#eaeaea";
}
void Grille::colorer_voisins( int Carre,int Case,bool focus){
caseselected[0] = Carre;
caseselected[1]= Case;
void Grille::EssaiJoueur(){
/* Appelée quand le joueur à sélectionné à la fois une case et un chiffre
* on vérifie alors avec les règles du sudoku (ligne/colonne/case) que le coup est permit*/
if(focus){
// reset les couleurs de toute la grille au blanc
for(int k =0;k<9;k++){
for(int j =0;j<9;j++){
colors[k][j]="white";
}
}
bool essai=true;
// recolore les cases du carré selectionné
for(int k =0;k<9;k++){
colors[Carre][k]="#eaeaea";
}
// on vérifie pour la colonne et la ligne
//colorer les lignes horizontales
switch(Carre/3){
case 0:
colorer_X(0,Case/3);
break;
case 1:
colorer_X(3,Case/3);
break;
case 2:
colorer_X(6,Case/3);
break;
}
// colorer les lignes verticales
switch(Carre%3){
case 0:
colorer_Y(0,Case%3);
break;
case 1:
colorer_Y(1,Case%3);
break;
case 2:
colorer_Y(2,Case%3);
break;
}
// coloriage des cases avec le même chiffre -- ne fonctionne pour l'instant
if (grille[3*(Carre/3)+(Case/3)][3*(Carre%3)+(Case%3)]!= "" && grille[3*(Carre/3)+(Case/3)][3*(Carre%3)+(Case%3)]!="0"){
for (int i=0;i<9;i++){
if (chiffre_actif==T[x_actif][i] ){
essai = false;
cout << "Le chiffre " << chiffre_actif << " est déjà présent dans la ligne." << endl << endl;
for (int j=0;j<9;j++){
if (grille[3*(i/3)+(j/3)][3*(i%3)+(j%3)]==grille[3*(Carre/3)+(Case/3)][3*(Carre%3)+(Case%3)]){
colors[i][j]="#9eaac8";
}
}
else if (chiffre_actif==T[i][y_actif]){
essai = false;
cout << "Le chiffre " << chiffre_actif << " est déjà présent dans la colonne." << endl << endl;
}
}
Print();
//on vérifie pour la case de 3x3
int case_3_x=floor(x_actif/3);
int case_3_y=floor(y_actif/3);
for(int i=3*case_3_x;i<3*case_3_x+3;i++)
for (int j=3*case_3_y;j<3*case_3_y+3;j++){
if (T[i][j]==chiffre_actif){
essai = false;
cout << "Le chiffre " << chiffre_actif << " est déjà présent dans le carré 3x3." << endl << endl;
emit focusChanged();
}
}
// On indique si l'on peut remplir la case ou non et si oui, on le fait
if (essai){
cout << "L'essai est réussi." << endl << endl;
Set(x_actif,y_actif,chiffre_actif);
x_actif=0;
y_actif=0;
chiffre_actif=0;
void Grille::changer_valeur(int valeur, int Carre,int Case){
string value =to_string(valeur);
if (value == "0"){
value="";
}
else
cout << "L'essai a échoué." << endl << endl;
int ligne, colonne;
switch(Carre){
case 0:
colonne = Case%3;
ligne = Case/3;
break;
case 1:
colonne = Case%3+3;
ligne = Case/3;
break;
case 2:
colonne = Case%3+6;
ligne = Case/3;
break;
case 3:
colonne = Case%3;
ligne = Case/3+3;
break;
case 4:
colonne = Case%3+3;
ligne = Case/3+3;
break;
case 5:
colonne = Case%3+6;
ligne = Case/3+3;
break;
case 6:
colonne = Case%3;
ligne = Case/3+6;
break;
case 7:
colonne = Case%3+3;
ligne = Case/3+6;
break;
case 8:
colonne = Case%3+6;
ligne = Case/3+6;
break;
}
// on teste si les règles sont respectées
bool possible=true;
void Grille::SelectChiffre(int c){
/* On sélectionne le chiffre que l'on veut mettre par la suite.*/
if (1<=c && c<=9 && c!=chiffre_actif){
cout << "Le chiffre selectionné est " << c << "." << endl<<endl;
chiffre_actif = c;
// test sur le carré
if(value!=""){
for (int i=0;i<3;i++){
for (int j=0;j<3;j++){
if (grille[3*(ligne/3)+i][3*(colonne/3)+j]==value){
possible=false;
cout <<3*((3*(ligne/3)+i)/3)+(3*(colonne/3)+j)/3<<3*((3*(ligne/3)+i)%3)+(3*(colonne/3)+j)%3<<endl;
colors[3*((3*(ligne/3)+i)/3)+(3*(colonne/3)+j)/3][3*((3*(ligne/3)+i)%3)+(3*(colonne/3)+j)%3]="#d14545";
break;
}
else if(c==chiffre_actif){
chiffre_actif=0; //on déselectionne en tapant une deuxième fois sur le chiffre
}
else{
cout << "Le chiffre selectionné n'est pas compris entre 1 et 9." << endl;
}
// test sur les lignes et colonnes
for (int j=0;j<9;j++){
if (grille[j][colonne]==value && j!=ligne){
possible=false;
colors[3*(j/3)+(colonne)/3][3*(j%3)+(colonne)%3]="#d14545";
}
void Grille::SelectCase(int x, int y){
/* On sélectionne la case que l'on veut mettre par la suite.*/
if (0<=x && x<9 && 0<=y && y<9 ){
// si on sélectionne la case déja active, on la déselectionne.
if (x_actif==x && y_actif==y){
x_actif=0;
y_actif=0;
cout << "La case a été désélectionnée."<<endl;
}
// si ce n'est pas le cas, on la sélectionne.
else{
x_actif=x;
y_actif=y;
cout << "La case sélectionnée est (" << x_actif << "," << y_actif <<")" << endl<<endl;
else if (grille[ligne][j]==value && j!=colonne){
possible=false;
colors[3*(ligne/3)+(j)/3][3*(ligne%3)+(j)%3]="#d14545";
}
}
}
bool Grille::TestWin(){
/* on teste juste que toute la grille soit remplie.*/
for (int i=0;i<9;i++)
for (int j=0;j<9;j++)
if (Get(i,j)==0)
return false;
return true;
}
if(possible)
grille[ligne][colonne]=value;
else
cout << "impossible de modifier la valeur" << endl;
matriceToVectors();
Grille& Grille::operator= (const Grille &D){
if ( this != &D) { // protection autoréférence
Free();
Alloc();
for(int i=0; i<9; i++)
for(int j=0; j<9; j++)
T[i][j] = D.T[i][j];
}
return *this;
}
// affichage de la grille
Print();
}
ostream& operator<< (ostream& sortie, Grille& V)
{
sortie << endl;
void Grille::Print(){
for(int i=0; i<9; i++) {
sortie << endl;
cout << endl;
for(int j=0; j<9; j++)
sortie << V.T[i][j] << ", ";
cout << grille[i][j] << ", ";
}
return sortie;
cout <<endl<<endl;
}
......@@ -2,58 +2,47 @@
#define GRILLE_H
#include <QObject>
#include <iostream>
#include <math.h>
#include <QFile>
#include <QStringList>
#include <QDebug>
#include <algorithm>
#include<string>
using namespace std;
class Grille //: public QObject
class Grille : public QObject
{
// Q_OBJECT
public:
Grille(int vd=0);
Grille(const Grille &D);
~Grille();
Q_OBJECT
// Q_PROPERTY(QList<QString> tableauQML READ readGrille NOTIFY grilleChanged)
Grille& operator= (const Grille &D); // opérateur d'affectation
friend ostream& operator<< (ostream& sortie, Grille& V);
Q_PROPERTY(QList<QList<QString>> values MEMBER valeurs NOTIFY valChanged)
Q_PROPERTY(QList<QList<QString>> colors MEMBER colors NOTIFY focusChanged)
Q_PROPERTY(int verifier MEMBER verif NOTIFY verifClicked)
Q_PROPERTY(int coloration MEMBER chiffre_IsActif NOTIFY chiffreActifChanged)
public:
explicit Grille(QObject *parent = nullptr);
Q_INVOKABLE void changer_valeur(int valeur, int Carre,int Case);
Q_INVOKABLE void colorer_voisins( int Carre,int Case, bool focus);
Q_INVOKABLE void verif_matrice( );
Q_INVOKABLE void set_chiffre_actif(int i);
void Print();
void Init(int value);
void Set(int x, int y, int value);
int Get(int x, int y);
void EssaiJoueur(); // on regarde si la case (x_actif,y_actif) a la valeur chiffre_actif
void SelectChiffre(int c);
void SelectCase(int x,int y);
bool TestWin();
private:
int** T; // c'est le tableau que l'on complète
int chiffre_actif; //la valeur sélectionnée à l'écran
int x_actif; //abscisse case active
int y_actif; //ordonnée case active
bool win; // la partie est gagnée ou non
void matriceToVectors();
void colorer_X(int i, int l );
void colorer_Y(int i, int c );
QList<QList<QString>> colors; // contient les couleurs de chaque case
QList<QList<QString>> valeurs; // contient les valeurs de chaque case sous forme de Qstring
string grille[9][9];
int caseselected[2] = {0,0};// contient les valeurs de chaque case sous forme de string
int verif;
int chiffre_actif;
int chiffre_IsActif;
// Méthode privée (factorisation de code)
void Alloc();
void Free();
/*
signals:
void grilleChanged();
*/
void valChanged();
void focusChanged();
void verifClicked();
void chiffreActifChanged();
};
#endif // GRILLE_H
# Grille extraite de https://qqwing.com/generate.html
4|.|.|2|7|5|.|8|.
.|.|.|.|1|.|4|7|.
.|.|.|.|.|.|9|.|5
......
# Grille extraite de https://qqwing.com/generate.html
.|.|4|8|.|.|.|1|.
.|.|.|9|.|1|.|2|.
.|6|.|2|.|.|4|3|.
......
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QtQml>
#include <QFile>
#include <QStringList>
#include <QDebug>
#include <iostream>
#include <math.h>
#include "grille.h"
#include <algorithm>
#include <string>
#include <QQmlContext>
#include "grille.h"
int main(int argc, char *argv[]){
// Lecture de la grille .csv de départ
// SI POSSIBLE CHANGER CELA EN FCT, UTILE POUR ENREGISTRER UNE PARTIE EN COURS ET LA REOUVRIR
// Pb avec QFile qui ne veut pas s'initialiser
Grille G;
QFile file("../Sudoku/grilles/grilleFacile.csv");
if (!file.open(QIODevice::ReadOnly)) {
qDebug() << file.errorString();
return 1;
}
QStringList matrice_List;
file.readLine(); // on ne veut pas la première ligne
int i=0; // permet de savoir quelle ligne ou lit
while (!file.atEnd()) {
QByteArray line = file.readLine(); // on lit ligne par ligne le fichier
std::replace(line.begin(), line.end(), '.','0'); // on remplace les . du .csv par des 0
for (int j=0; j<9;j++){
if (int(line[2*j])-48>0)
G.Set(i,j,int(line[2*j])-48); // on remplit le tableau avec les valeurs de départ
}
i+=1;
}
G.Print();
// test sélection et remplissage de case
G.SelectCase(2,2);
G.SelectChiffre(4);
G.EssaiJoueur();
G.SelectCase(8,1); // pas besoin de reselectionner de nouveau le chiffre si on veut le mm
G.EssaiJoueur();
G.SelectCase(4,8);
G.SelectChiffre(7);
G.EssaiJoueur();
G.Print();
// Updated upstream
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
// Stashed changes
int main(int argc, char *argv[]){
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif
QGuiApplication app(argc, argv);
Grille aGrille ;
QQmlApplicationEngine engine;
const QUrl url(QStringLiteral("qrc:/main.qml"));
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
......@@ -73,12 +20,8 @@ int main(int argc, char *argv[]){
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
engine.rootContext()->setContextProperty("vueObjetCpt", &aGrille);
engine.load(url);
return app.exec();
// Updated upstream
return(0);
// Stashed changes
}
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick 2.11
import QtQuick.Window 2.11
import QtQuick.Layouts 1.1
import QtQuick.Controls 2.15
Window {
width: 900
height: 700
id : root
color: "#e6ecfa"
width: 650+5
height: 712+5
visible: true
title: qsTr("Sudoku")
function check(){
vueObjetCpt.verif_matrice();
var verif = vueObjetCpt.verifier;
if(verif===1){
result.visible=true;
result.rectangle.color="#8ee637";
result.rectangle.text1.text="Bravo vous avez réussi la partie !";
}
else{ result.visible=true;
result.rectangle.color="#666666";
result.rectangle.text1.text="Il y a une erreur, réessayez !";
}
}
function set_chiffre_actif(i){
vueObjetCpt.set_chiffre_actif(i);
var chiffre_IsActif = vueObjetCpt.coloration
var values = vueObjetCpt.values;
var l
var c
for(l=0;l<9;l++){
for(c=0;c<9;c++){
var v = repeater.itemAt(l).rep.itemAt(c).input
v.text=values[l][c];
}
}
}
Component.onCompleted:{
var values=vueObjetCpt.values;
var i;
for(i=0;i<9;i++){
var t = repeater.itemAt(0).rep.itemAt(i).input
t.text=values[0][i]
if(values[0][i]!==''){
t.readOnly=true
t.color="#000000"
t.font.bold = true
}
}
for(i=0;i<9;i++){
var k = repeater.itemAt(1).rep.itemAt(i).input
k.text=values[1][i]
if(values[1][i]!==''){
k.readOnly=true
k.color="#000000"
k.font.bold = true
}
}
for(i=0;i<9;i++){
var l = repeater.itemAt(2).rep.itemAt(i).input
l.text=values[2][i]
if(values[2][i]!==''){
l.readOnly=true
l.color="#000000"
l.font.bold = true
}
}
for(i=0;i<9;i++){
var m = repeater.itemAt(3).rep.itemAt(i).input
m.text=values[3][i]
if(values[3][i]!==''){
m.readOnly=true
m.color="#000000"
m.font.bold = true
}
}
for(i=0;i<9;i++){
var n = repeater.itemAt(4).rep.itemAt(i).input
n.text=values[4][i]
if(values[4][i]!==''){
n.readOnly=true
n.color="#000000"
n.font.bold = true
}
}
for(i=0;i<9;i++){
var p = repeater.itemAt(5).rep.itemAt(i).input
p.text=values[5][i]
if(values[5][i]!==''){
p.readOnly=true
p.color="#000000"
p.font.bold = true
}
}
for(i=0;i<9;i++){
var q = repeater.itemAt(6).rep.itemAt(i).input
q.text=values[6][i]
if(values[6][i]!==''){
q.readOnly=true
q.color="#000000"
q.font.bold = true
}
}
for(i=0;i<9;i++){
var s = repeater.itemAt(7).rep.itemAt(i).input
s.text=values[7][i]
if(values[7][i]!==''){
s.readOnly=true
s.color="#000000"
s.font.bold = true
}
}
for(i=0;i<9;i++){
var j = repeater.itemAt(8).rep.itemAt(i).input
j.text=values[8][i]
if(values[8][i]!==''){
j.readOnly=true
j.color="#000000"
j.font.bold = true
}
}
}
property alias repeater : repeater
Rectangle{
id: rectangle
color: "#eae1c3"
anchors.fill: parent
focus: true
Keys.onPressed: {
switch (event.key) {
case Qt.Key_A:
grille.carre4.case2.chiffreText=qsTr("0")
break;
}
}
Grille {
id: grille
x: 217
y: 103
id : background
x:3
y:3
color : "black"
anchors.verticalCenter: parent.verticalCenter
anchors.verticalCenterOffset: -30
anchors.horizontalCenter: parent.horizontalCenter
}
width : childrenRect.width+6
height : childrenRect.height+6
Text {
id: textdyn
x: 431
text: qsTr("Ici un texte pour les instructions et etc (Type : Bravo)")
anchors.top: parent.top
font.pixelSize: 30
font.weight: Font.DemiBold
font.family: "Tahoma"
anchors.topMargin: 30
anchors.horizontalCenter: parent.horizontalCenter
Grid{
id : grid
x: 3
y:3
rows:3
columns:3
spacing :2
Repeater{
id : repeater
model : 9
Carre{
id : case1
width : 213
height:213
}
}
}
}
Case {
id: bouton6
x: 425
y: 620
Button {
id: button_check
x: 8
y: 660
width: 132
height: 40
text: qsTr("Vérifier la grille")
anchors.bottom: parent.bottom
chiffreText: "6"
anchors.horizontalCenterOffset: 30
anchors.bottomMargin: 30
highlighted: false
anchors.horizontalCenterOffset: -250
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottomMargin: 10
font.weight: Font.ExtraLight
font.pointSize: 12
onClicked:{ check();
button_check.highlighted = true
}
}
Resultat{
id :result
visible: false
}
Case {
id: bouton5
x: 392
y: 620
Button {
id: button1
x: 200
y: 660
width: 40
height: 40
text: qsTr("1")
anchors.bottom: parent.bottom
chiffreText: "5"
anchors.horizontalCenterOffset: -30
anchors.horizontalCenterOffset: -120
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottomMargin: 30
anchors.bottomMargin: 10
font.weight: Font.ExtraLight
font.pointSize: 12
onPressed: {highlighted = true}
onReleased: {highlighted= false}
onClicked:set_chiffre_actif(1)
}
Case {
id: bouton4
x: 331
y: 620
Button {
id: button2
x: 250
y: 660
width: 40
height: 40
text: qsTr("2")
anchors.bottom: parent.bottom
chiffreText: "4"
anchors.horizontalCenterOffset: -90
anchors.horizontalCenterOffset: -70
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottomMargin: 30
anchors.bottomMargin: 10
font.weight: Font.ExtraLight
font.pointSize: 12
onPressed: {highlighted = true}
onReleased: {highlighted= false}
onClicked: set_chiffre_actif(2)
}
Case {
id: bouton3
x: 266
y: 620
Button {
id: button3
x: 300
y: 660
width: 40
height: 40
text: qsTr("3")
anchors.bottom: parent.bottom
chiffreText: "3"
anchors.horizontalCenterOffset: -150
anchors.horizontalCenterOffset: -20
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottomMargin: 30
anchors.bottomMargin: 10
font.weight: Font.ExtraLight
font.pointSize: 12
onPressed: {highlighted = true}
onReleased: {highlighted= false}
onClicked: set_chiffre_actif(3)
}
Case {
id: bouton2
x: 201
y: 620
Button {
id: button4
x: 350
y: 660
width: 40
height: 40
text: qsTr("4")
anchors.bottom: parent.bottom
chiffreText: "2"
anchors.horizontalCenterOffset: -210
anchors.horizontalCenterOffset: 30
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottomMargin: 30
anchors.bottomMargin: 10
font.weight: Font.ExtraLight
font.pointSize: 12
onPressed: {highlighted = true}
onReleased: {highlighted= false}
onClicked: set_chiffre_actif(4)
}
Case {
id: bouton1
x: 98
y: 627
Button {
id: button5
x: 400
y: 660
width: 40
height: 40
text: qsTr("5")
anchors.bottom: parent.bottom
chiffreText: "1"
anchors.horizontalCenterOffset: -270
anchors.horizontalCenterOffset: 80
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottomMargin: 30
anchors.bottomMargin: 10
font.weight: Font.ExtraLight
font.pointSize: 12
onPressed: {highlighted = true}
onReleased: {highlighted= false}
onClicked: set_chiffre_actif(5)
}
Case {
id: bouton7
x: 545
y: 627
Button {
id: button6
x: 450
y: 660
width: 40
height: 40
text: qsTr("6")
anchors.bottom: parent.bottom
chiffreText: "7"
anchors.horizontalCenterOffset: 90
anchors.horizontalCenterOffset: 130
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottomMargin: 30
anchors.bottomMargin: 10
font.weight: Font.ExtraLight
font.pointSize: 12
onPressed: {highlighted = true}
onReleased: {highlighted= false}
onClicked: set_chiffre_actif(6)
}
Case {
id: bouton8
x: 621
y: 627
Button {
id: button7
x: 500
y: 660
width: 40
height: 40
text: qsTr("7")
anchors.bottom: parent.bottom
chiffreText: "8"
anchors.horizontalCenterOffset: 150
anchors.horizontalCenterOffset: 180
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottomMargin: 30
anchors.bottomMargin: 10
font.weight: Font.ExtraLight
font.pointSize: 12
onPressed: {highlighted = true}
onReleased: {highlighted= false}
onClicked: set_chiffre_actif(7)
}
Case {
id: bouton9
x: 699
y: 620
Button {
id: button8
x: 550
y: 660
width: 40
height: 40
text: qsTr("8")
anchors.bottom: parent.bottom
anchors.horizontalCenterOffset: 210
anchors.horizontalCenterOffset: 230
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottomMargin: 30
anchors.bottomMargin: 10
font.weight: Font.ExtraLight
font.pointSize: 12
onPressed: {highlighted = true}
onReleased: {highlighted= false}
onClicked: set_chiffre_actif(8)
}
Case {
id: bouton10
x: 781
y: 620
Button {
id: button9
x: 600
y: 660
width: 40
height: 40
text: qsTr("9")
anchors.bottom: parent.bottom
chiffreText: " "
anchors.horizontalCenterOffset: 270
anchors.horizontalCenterOffset: 280
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottomMargin: 30
Image {
id: gomme
anchors.fill: parent
source: "erase.png"
anchors.rightMargin: 2
anchors.leftMargin: 2
anchors.bottomMargin: 2
anchors.topMargin: 2
fillMode: Image.PreserveAspectFit
}
}
anchors.bottomMargin: 10
font.weight: Font.ExtraLight
font.pointSize: 12
onPressed: {highlighted = true}
onReleased: {highlighted= false}
onClicked: set_chiffre_actif(9)
}
}
<RCC>
<qresource prefix="/">
<file>main.qml</file>
<file>Case.qml</file>
<file>Grille.qml</file>
<file>Carre.qml</file>
<file>erase.png</file>
<file>Resultat.qml</file>
</qresource>
</RCC>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment