// widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
QT_END_NAMESPACE
class SudokuWidget
: public QWidget{
Q_OBJECT;
public:
private slots:
// void onMapped( int rowColId );
// void on_pushButton_clicked();
private:
// QSignalMapper *mapper;
QVector <QPair <int, int>> random_pos_value;
void random_position
(int digits,
QVector <
QPair <int, int> >
&pos_value
);
bool is_legal_row
(int value,
int y,
int x, QVector<
QVector <
QLineEdit* >>
&tiles1
);
bool is_legal_colum
(int value,
int y,
int x, QVector<
QVector <
QLineEdit* >>
&tiles1
);
int box_position(int y, int x);
bool is_legal_box
(int value,
int y,
int x, QVector<
QVector <
QLineEdit* >>
&tiles1
);
};
#endif // WIDGET_H
// widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QGridLayout>
#include <QFrame>
#include <QLineEdit>
#include <QIntValidator>
#include <QMessageBox>
#include <QPushButton>
#include <QRandomGenerator>
#include <QDateTime>
#include <QSet>
#include <iostream>
SudokuWidget
::SudokuWidget(QWidget * parent
)
pValidator->setRange( 1, 9 );
int square_counter = 0;
random_position(20, random_pos_value);
mainLayout->setSpacing(0);
for (int mr = 0; mr < 3; mr++) {
for(int mc = 0; mc < 3; mc++) {
widget
->setFrameStyle
(QFrame::Plain);
widget
->setFrameShape
(QFrame::Box);
gridLayout->setSpacing(0);
gridLayout->setMargin(0);
for(int r = 0; r < 3; r++) {
for (int c = 0; c < 3; c++) {
square_counter++;
tile->setMaxLength(1);
tile->setFixedSize(30,30);
tile->setStyleSheet("QLineEdit{ border-width: 1.5px; border-style: solid; border-color: black black black black; }");
tile->setAlignment(Qt::AlignCenter);
tile->setValidator(pValidator);
tiles.push_back( tile );
gridLayout->addWidget(tile, r, c, 1, 1, Qt::AlignCenter);
}
}
mainLayout->addWidget(widget, mr, mc, 1, 1, Qt::AlignCenter);
}
}
for (int i = 0;i < 80; i++){
for (int j = 0;j < 20; j++){
if (random_pos_value[j].first == i){
tiles
[i
]->setText
(QString::number(random_pos_value
[j
].
second));
tiles[i]->setReadOnly(true);
}
}
}
setLayout(mainLayout);
}
bool SudokuWidget
::is_legal_row(int value,
int y,
int x, QVector<
QVector <
QLineEdit* >>
&tiles1
) {
int count = 0;
for (int i = 0;i < 9; i++){
if (QString::number(value
) == tiles1
[y
][i
]->text
()){ count++;
}
}
if (count == 1){
return true;
}
return false;
}
bool SudokuWidget::is_legal_colum(int value,int y, int x, QVector<QVector<QLineEdit *> > &tiles1)
{
int count = 0;
for (int i = 0;i < 9; i++){
if (QString::number(value
) == tiles1
[i
][x
]->text
()){ count++;
}
}
if (count == 1){
return true;
}
return false;
}
void SudokuWidget
::random_position(int digits,
QVector <QPair <int, int> >
&random_pos_value
) {
for (int y1 = 0;y1 < 9; y1++){
for (int x1 = 0;x1 < 9; x1++){
random_boards[y1].push_back(line_edit);
}
}
qsrand
(QDateTime::currentMSecsSinceEpoch() / 1000);
int count = 0;
int value;
while (true){
int position = (qrand() % 80) + 0;
int y = position / 9;
int x = position % 9;
if (random_boards[y][x]->text() == "0"){
while (true){
value = (qrand() % 9) + 1;
random_boards
[y
][x
]->setText
(QString::number(value
));
if (is_legal_box(value, y, x, random_boards) && is_legal_colum(value, y, x, random_boards) ){
break;
}
random_boards[y][x]->setText("0");
}
QPair <int, int> values
= {position,value
};
random_pos_value.push_back(values);
count++;
if (count == digits){
break;
}
}
}
}
int SudokuWidget::box_position(int y, int x)
{
return 3*(y/3) + (x/3);
}
bool SudokuWidget::is_legal_box(int value, int y1, int x1, QVector<QVector<QLineEdit *> > &tiles1)
{
//box
int count = 0;
int square_position = box_position(y1, x1);
for (int y = (square_position / 3) * 3; y < ((square_position / 3) * 3) + 3;y++){
for (int x = (square_position % 3) * 3; x < ((square_position % 3) * 3) + 3;x++){
if (tiles1
[y
][x
]->text
() == QString::number(value
)){ count++;
}
}
}
if (count == 1){
return true;
}
return false;
}
// widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
class QSignalMapper;
class QLineEdit;
QT_END_NAMESPACE
class SudokuWidget : public QWidget
{
Q_OBJECT;
public:
SudokuWidget( QWidget *parent );
private slots:
// void onMapped( int rowColId );
// void on_pushButton_clicked();
private:
// QSignalMapper *mapper;
QVector < QLineEdit *> tiles;
QVector <QPair <int, int>> random_pos_value;
void random_position(int digits, QVector < QPair <int, int> > &pos_value);
bool is_legal_row(int value, int y, int x, QVector< QVector < QLineEdit* >> &tiles1);
bool is_legal_colum(int value, int y, int x, QVector< QVector < QLineEdit* >> &tiles1);
int box_position(int y, int x);
bool is_legal_box(int value, int y,int x, QVector< QVector < QLineEdit* >> &tiles1);
};
#endif // WIDGET_H
// widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QGridLayout>
#include <QFrame>
#include <QLineEdit>
#include <QIntValidator>
#include <QMessageBox>
#include <QPushButton>
#include <QRandomGenerator>
#include <QDateTime>
#include <QSet>
#include <iostream>
SudokuWidget::SudokuWidget(QWidget * parent)
: QWidget(parent) {
QIntValidator *pValidator = new QIntValidator( this );
pValidator->setRange( 1, 9 );
int square_counter = 0;
random_position(20, random_pos_value);
QGridLayout *mainLayout = new QGridLayout(this);
mainLayout->setSpacing(0);
for (int mr = 0; mr < 3; mr++) {
for(int mc = 0; mc < 3; mc++) {
QFrame *widget = new QFrame;
widget->setFrameStyle(QFrame::Plain);
widget->setFrameShape(QFrame::Box);
QGridLayout *gridLayout = new QGridLayout(widget);
gridLayout->setSpacing(0);
gridLayout->setMargin(0);
for(int r = 0; r < 3; r++) {
for (int c = 0; c < 3; c++) {
QLineEdit *tile = new QLineEdit("");
square_counter++;
tile->setMaxLength(1);
tile->setFixedSize(30,30);
tile->setStyleSheet("QLineEdit{ border-width: 1.5px; border-style: solid; border-color: black black black black; }");
tile->setAlignment(Qt::AlignCenter);
tile->setFrame(QFrame::Box);
tile->setValidator(pValidator);
tiles.push_back( tile );
gridLayout->addWidget(tile, r, c, 1, 1, Qt::AlignCenter);
}
}
mainLayout->addWidget(widget, mr, mc, 1, 1, Qt::AlignCenter);
}
}
for (int i = 0;i < 80; i++){
for (int j = 0;j < 20; j++){
if (random_pos_value[j].first == i){
tiles[i]->setText(QString::number(random_pos_value[j].second));
tiles[i]->setReadOnly(true);
}
}
}
setLayout(mainLayout);
}
bool SudokuWidget::is_legal_row(int value,int y, int x, QVector< QVector < QLineEdit* >> &tiles1)
{
int count = 0;
for (int i = 0;i < 9; i++){
if (QString::number(value) == tiles1[y][i]->text()){
count++;
}
}
if (count == 1){
return true;
}
return false;
}
bool SudokuWidget::is_legal_colum(int value,int y, int x, QVector<QVector<QLineEdit *> > &tiles1)
{
int count = 0;
for (int i = 0;i < 9; i++){
if (QString::number(value) == tiles1[i][x]->text()){
count++;
}
}
if (count == 1){
return true;
}
return false;
}
void SudokuWidget::random_position(int digits, QVector <QPair <int, int> > &random_pos_value)
{
QVector < QVector < QLineEdit* > > random_boards(81);
for (int y1 = 0;y1 < 9; y1++){
for (int x1 = 0;x1 < 9; x1++){
QLineEdit *line_edit = new QLineEdit("0");
random_boards[y1].push_back(line_edit);
}
}
qsrand(QDateTime::currentMSecsSinceEpoch() / 1000);
int count = 0;
int value;
while (true){
int position = (qrand() % 80) + 0;
int y = position / 9;
int x = position % 9;
if (random_boards[y][x]->text() == "0"){
while (true){
value = (qrand() % 9) + 1;
random_boards[y][x]->setText(QString::number(value));
if (is_legal_box(value, y, x, random_boards) && is_legal_colum(value, y, x, random_boards) ){
break;
}
random_boards[y][x]->setText("0");
}
QPair <int, int> values = {position,value};
random_pos_value.push_back(values);
count++;
if (count == digits){
break;
}
}
}
}
int SudokuWidget::box_position(int y, int x)
{
return 3*(y/3) + (x/3);
}
bool SudokuWidget::is_legal_box(int value, int y1, int x1, QVector<QVector<QLineEdit *> > &tiles1)
{
//box
int count = 0;
int square_position = box_position(y1, x1);
QVector <QString> values;
for (int y = (square_position / 3) * 3; y < ((square_position / 3) * 3) + 3;y++){
for (int x = (square_position % 3) * 3; x < ((square_position % 3) * 3) + 3;x++){
if (tiles1[y][x]->text() == QString::number(value)){
count++;
}
}
}
if (count == 1){
return true;
}
return false;
}
To copy to clipboard, switch view to plain text mode
Bookmarks