《C++ Qt 设计模式》8|15拼图 小游戏的简单实现.拜托,别乱点!
发布于 2022-06-02 06:28
void addWidget ( QWidget * widget, int row, int column, Qt::Alignment alignment = 0 )
struct Coord
{
int x;
int y;
};
class MyButton : public QPushButton
{
Q_OBJECT
private:
Coord m_coord;
public:
explicit MyButton(char c,Coord coord,QWidget* parent=0);
void setCoord(Coord newCd);
Coord getCoord() const;
signals:
void myClick(MyButton* p); //signal,argument is poiter to myself,so someone else can identify me
private slots:
void btClicked();
};
mybutton.h
MyButton::MyButton(char c,Coord coord, QWidget *parent) : QPushButton(parent)
{
setText(QString("%1").arg(c));
this->m_coord=coord;
connect(this,SIGNAL(clicked()),this,SLOT(btClicked()));
}
void MyButton::setCoord(Coord newCd)
{
m_coord=newCd;
}
Coord MyButton::getCoord() const
{
return m_coord;
}
void MyButton::btClicked()
{
emit myClick(this);
}
mybutton.cpp
connect(this,SIGNAL(clicked()),this,SLOT(btClicked()));
void MyButton::btClicked()
{
emit myClick(this);
}
class QGridLayout;
class QPushButton;
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
private:
Ui::Dialog *ui;
static const int N=3;
QGridLayout* m_lay;
MyButton* m_pbArr[N][N];
QString m_btnTextOrder;
private slots:
void btClicked(MyButton* p); //one of N*N buttons has been clicked
private:
void disorder(); //disorder the N*N buttons
void exchangeButton(Coord a,Coord b); //exchange two buttons based on coord
bool isOver() const; //is it in order???
};
dialog.h
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
setWindowTitle("Let us have a game!");
setMinimumSize(300,250);
setMaximumSize(300,250);
m_lay=new QGridLayout(this);
for(int i=0;i<N;i++)
{
int colums;
if(i<N-1) colums=N;
else colums=N-1;
for(int j=0;j<colums;j++)
{
char c=i*N+j+'A';
m_btnTextOrder.append(c);
Coord cd={i,j};
m_pbArr[i][j]=new MyButton(c,cd);
m_lay->addWidget(m_pbArr[i][j],i,j);
connect(m_pbArr[i][j],SIGNAL(myClick(MyButton*)),this,SLOT(btClicked(MyButton*)));
}
}
m_pbArr[N-1][N-1]=NULL;
this->setLayout(m_lay);
disorder(); //make buttons disorder
}
构造函数
void Dialog::btClicked(MyButton* p)
{
Coord cd=p->getCoord(); //get the button that been clicked
Coord cdTarget=cd; //target position that maybe switch
if((cd.x-1>=0)&&(m_pbArr[cd.x-1][cd.y]==NULL)) //test top
{
cdTarget.x--;
}
else if((cd.x+1<N)&&(m_pbArr[cd.x+1][cd.y]==NULL)) //test down
{
cdTarget.x++;
}
else if((cd.y-1>=0)&&(m_pbArr[cd.x][cd.y-1]==NULL)) //test left
{
cdTarget.y--;
}
else if((cd.y+1<N)&&(m_pbArr[cd.x][cd.y+1]==NULL)) //test right
{
cdTarget.y++;
}
else
{
return; //can not move this button
}
/*let us switch!*/
exchangeButton(cd,cdTarget);
/*check whether game is over*/
if(isOver())
{
QMessageBox::warning(this,"Sucess","You made it! Congratulations!");
}
}
void Dialog::exchangeButton(Coord a, Coord b)
{
if((m_pbArr[a.x][a.y]!=NULL)&&(m_pbArr[b.x][b.y]!=NULL)) //no NULL
{
/*remove from pre QGridLayOut*/
m_lay->removeWidget(m_pbArr[a.x][a.y]);
m_lay->removeWidget(m_pbArr[b.x][b.y]);
/*add to QGridLayOut*/
m_lay->addWidget(m_pbArr[a.x][a.y],b.x,b.y);
m_lay->addWidget(m_pbArr[b.x][b.y],a.x,a.y);
/*change two buttons's coord */
m_pbArr[a.x][a.y]->setCoord(b);
m_pbArr[b.x][b.y]->setCoord(a);
/*exchange poiter in m_pbArr[] */
MyButton* temp=m_pbArr[a.x][a.y];
m_pbArr[a.x][a.y]=m_pbArr[b.x][b.y];
m_pbArr[b.x][b.y]=temp;
}
else //one of two buttons' position is NULL (in array m_pbArr[])
{
if(m_pbArr[a.x][a.y]==NULL)
{
Coord temp=a;
a=b;
b=temp;
}
/*here,we can make sure that coord b is null*/
m_lay->removeWidget(m_pbArr[a.x][a.y]);
m_lay->addWidget(m_pbArr[a.x][a.y],b.x,b.y);
m_pbArr[a.x][a.y]->setCoord(b);
MyButton* temp=m_pbArr[a.x][a.y];
m_pbArr[a.x][a.y]=m_pbArr[b.x][b.y];
m_pbArr[b.x][b.y]=temp;
}
}
交换按钮
void Dialog::disorder()
{
Coord cdA,cdB;
for(int i=0;i<56;i++)
{
QTime time=QTime::currentTime();
qsrand(time.msec()*7+time.second()*245);
cdA.x=qrand()%N; //from 0 to N-1
qsrand(time.second()+i*3+91);
cdA.y=qrand()%N;
qsrand(time.msec()*3+i);
cdB.x=qrand()%N;
qsrand(time.msec()+i*11);
cdB.y=qrand()%N;
// qDebug()<<cdA.x<<cdA.y<<"-----"<<cdB.x<<cdB.y<<endl;
if((cdA.x==cdB.x)&&(cdA.y==cdB.y))
{
i--;
}
else //not the same coord
{
exchangeButton(cdA,cdB);
}
}
}
无序化
bool Dialog::isOver() const
{
QString res;
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
if(m_pbArr[i][j]!=NULL)
{
res.append(m_pbArr[i][j]->text());
}
}
}
if(res==m_btnTextOrder)
{
return true;
}
else
{
return false;
}
}
是否结束
本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。
相关素材