一、数组元素内部怎么打乱?
我开始使用vector容器如何想用random_shuffle函数来打乱,然后我发现我不会用这个,vs的c++感觉用上去没什么问题,但我发现qt好像不认random_shuffle,终究还得靠自己,干脆不用vector了,因为画图一维数组真的不好用
怎么实现呢?看看下面的例子
for(int i=0;i<row;i++)
{
for(int j=0;j<lie;j++)
{
int x=rand()%row;
int y=rand()%lie;
QImage img;
img=mshow[i][j];
mshow[i][j]=mshow[x][y];
mshow[x][y]=img;
}
}
反正就是每一个位置我都随机生成应该位置与之交换嘛
二、游戏的实现界面
素材
![]()
这个虽然有点奇怪,因为我不记得了哪个字体是哪个,所以粗细有点尴尬
三、步骤及简要分析
这个和扫雷我觉得都是qt最简单的案例,可以试试,扫雷是用鼠标事件,而这个用的是键盘事件,都是利用画画事件来实现,没有什么特别的,如果学到qt建议可以打打这两个游戏
1.导入素材(略)
2.mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include<QMap>
#include<QPaintEvent>
#include<QPainter>
#include<QPoint>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
QMap<int,QImage>V;
~MainWindow();
void initV();
void initshow();
void move(int x,int y);
bool is_win();
virtual void keyPressEvent(QKeyEvent *event);
virtual void paintEvent(QPaintEvent *event);
private:
Ui::MainWindow *ui;
int row;int lie;
QImage mshow[4][4];
QPainter *mpainter;
QPoint mpos;
};
#endif // MAINWINDOW_H
3.mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<time.h>
#include<QDebug>
#include<QMessageBox>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
row=4;
lie=4;
this->resize(4*40,4*40);
srand((unsigned int)time(NULL));
mpainter=new QPainter;
initV();
initshow();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::initV()
{
V[0]=QImage("://picture/0.png");
V[1]=QImage("://picture/1.png");
V[2]=QImage("://picture/2.png");
V[3]=QImage("://picture/3.png");
V[4]=QImage("://picture/4.png");
V[5]=QImage("://picture/5.png");
V[6]=QImage("://picture/6.png");
V[7]=QImage("://picture/7.png");
V[8]=QImage("://picture/8.png");
V[9]=QImage("://picture/9.png");
V[10]=QImage("://picture/10.png");
V[11]=QImage("://picture/11.png");
V[12]=QImage("://picture/12.png");
V[13]=QImage("://picture/13.png");
V[14]=QImage("://picture/14.png");
V[15]=QImage("://picture/15.png");
}
void MainWindow::initshow()
{
int k=1;
for(int i=0;i<row;i++)
{
for(int j=0;j<lie;j++)
{
if(k<=15)
mshow[i][j]=V[k++];
}
}
mshow[3][3]=V[0];
for(int i=0;i<row;i++)
{
for(int j=0;j<lie;j++)
{
int x=rand()%row;
int y=rand()%lie;
QImage img;
img=mshow[i][j];
mshow[i][j]=mshow[x][y];
mshow[x][y]=img;
}
}
for(int i=0;i<row;i++)
{
for(int j=0;j<lie;j++)
{
if(mshow[i][j]==V[0])
mpos=QPoint(i,j);
}
}
}
void MainWindow::move(int dx,int dy)
{
if(mpos.x()+dx>=4||mpos.y()+dy>=4||mpos.x()+dx<0||mpos.y()+dy<0)
{
return;
}
else
{
QImage img;
qDebug()<<dx<<","<<dy;
qDebug()<<mpos.x()<<","<<mpos.y();
img=mshow[mpos.x()][mpos.y()];
mshow[mpos.x()][mpos.y()]=mshow[mpos.x()+dx][mpos.y()+dy];
mshow[mpos.x()+dx][mpos.y()+dy]=img;
qDebug()<<dx<<","<<dy;
qDebug()<<mpos.x()<<","<<mpos.y();
mpos.rx()=mpos.x()+dx;
mpos.ry()=mpos.y()+dy;
qDebug()<<mpos.x()<<","<<mpos.y();
repaint();
}
}
void MainWindow::paintEvent(QPaintEvent *event)
{
mpainter->begin(this);
for(int i=0;i<row;i++)
{
for(int j=0;j<lie;j++)
{
mpainter->drawImage(40*j,40*i,mshow[i][j]);
}
}
mpainter->end();
}
bool MainWindow::is_win()
{
int k=1;
for(int i=0;i<row;i++)
for(int j=0;j<lie;j++)
{
if(k<=15)
{
if(mshow[i][j]!=V[k++])
{
return false;
}
}
}
return true;
}
void MainWindow::keyPressEvent(QKeyEvent *event)
{
switch(event->key())
{
case Qt::Key_Up:
{
move(-1,0);
break;
}
case Qt::Key_Down:
{
move(1,0);
break;
}
case Qt::Key_Left:
{
move(0,-1);
break;
}
case Qt::Key_Right:
{
move(0,1);
qDebug()<<"6";
break;
}
}
if(is_win())
{
QMessageBox::information(this,"提示","你赢了");
qDebug()<<"end";
}
}
5.main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}