文章以及源码均为原创,当然欢迎转载,转载请加说明

用VS编写的Qt项目,欢迎阅读讨论,源码如下

tetris.h

#ifndef TETRIS_H
#define TETRIS_H#include <QtWidgets/QWidget>
#include "ui_tetris.h"
#include <QPushButton>
#include <QPainter>
#include <QKeyEvent>
#include <iostream>
#include <assert.h>
#include <time.h>
#include <conio.h>
#include <windows.h>#pragma execution_character_set("utf-8")enum ShapeCode :int
{Shape0, Shape1, Shape2, Shape3, Shape4, Shape5, Shape6, Shape7, Shape8, Shape9,Shape10, Shape11, Shape12, Shape13, Shape14, Shape15, Shape16, Shape17, Shape18
};const QColor Color0(145, 100, 202);
const QColor Color1(255, 127, 80);
const QColor Color2(255, 0, 255);
const QColor Color3(0, 255, 255);
const QColor Color4(255, 128, 0);
const QColor Color5(218, 112, 214);
const QColor Color6(138, 43, 226);const int ROWNUM = 20;//游戏区域方块行数
const int COLNUM = 10;//游戏区域方块列数
const int BLOCKSIDELENGTH = 20;//方块边长
const int XLEFT = 40;//游戏区左边界X坐标
const int XRIGHT = XLEFT+BLOCKSIDELENGTH*COLNUM;//游戏区右边界X坐标
const int YUP = 100;//游戏区上边界Y坐标
const int YDOWN = YUP+BLOCKSIDELENGTH*ROWNUM;//游戏区下边界Y坐标
const int XINIT = XLEFT+(((COLNUM-4)/2)+1)*BLOCKSIDELENGTH;//图形生成时第一个方块左上角的X坐标
const int YINIT = YUP-BLOCKSIDELENGTH*2;//图形生成时第一个方块左上角的Y坐标
const int WINW = XRIGHT + BLOCKSIDELENGTH+230;//窗口宽度
const int WINH = YDOWN + BLOCKSIDELENGTH+30;//窗口高度//方块
class CBlock
{
public:CBlock();~CBlock();void Draw(QPainter &I_Painter) const;void Create(int I_X, int I_Y, const QColor& I_Color, bool I_IsExist, int I_Row, int I_Col);void SetX(int I_X);int GetX() const;void SetY(int I_Y);int GetY() const;void SetRow1(int I_Row1);int GetRow1() const;void SetRow2(int I_Row2);int GetRow2() const;void SetCol(int I_Col);int GetCol() const;void SetColor(const QColor& I_Color);QColor GetColor() const;void SetIsExist(bool I_IsExist);bool GetIsExist() const;void Copy(const CBlock&I_Block);private:int m_X;//左上角X坐标int m_Y;//左上角Y坐标int m_Row1;//行1,下落时有可能在两行中间,如果当前刚好位于某一行,则row1=row2;int m_Row2;//行2int m_Col;//列QColor m_Color;//颜色bool m_IsExist;//是否存在
};//图形
class CFigure
{
public:CFigure();CFigure(CFigure &I_Figure);~CFigure();void Draw(QPainter &I_Painter) const;void DropDown();//下落void DropDown(int I_Row);void Move(char I_Direction);//左右移动void Vary();//形状变化void SetIsExist(bool I_IsExist);bool GetIsExist() const;void Create();CBlock *Get_m_Block();ShapeCode *Get_m_Shape();int GetNextShape() const;protected:void Set_m_Block(ShapeCode I_ShapeCode);private:CBlock m_Block[4];bool m_IsExist;//是否存在int m_NextShape;//下一个变化形状ShapeCode m_Shape[4];//形状列表
};class CTetris : public QWidget
{Q_OBJECTpublic:CTetris(QWidget *parent = 0);~CTetris();protected:void paintEvent(QPaintEvent *);void timerEvent(QTimerEvent *);void keyPressEvent(QKeyEvent *I_Event);void keyReleaseEvent(QKeyEvent *I_Event);void Start();void Over();void Draw();bool CheckDropDown();//检查能否下落bool CheckDropDownS();int CalDropDownRow();//计算下落行数bool CheckMove(char I_Direction);//检查能否左右移动bool CheckVary();//检查能否形状变化bool IsOver();void FixFigure();//固定图形void Eliminate(int I_Row);//消除void CalculateScore();//计算得分signals:void GameOverSignal();private:Ui::CTetrisClass ui;QPushButton m_StartButton;QPainter m_Painter;bool m_IsStart;CFigure m_Figure;CBlock m_BlockArr[ROWNUM][COLNUM];int m_Score;public slots:void GameStartSlot();void GameOverSlot();
};//顺转
//0
//■■
//■■//1
//■■■■
//2
//■
//■
//■
//■//3
//  ■
//■■■
//4
//■
//■■
//■
//5
//■■■
//  ■
//6
//  ■
//■■
//  ■//7
//■■■
//    ■
//8
//  ■
//  ■
//■■
//9
//■
//■■■
//10
//■■
//■
//■//11
//■■■
//■
//12
//■■
//  ■
//  ■
//13
//    ■
//■■■
//14
//■
//■
//■■//15
//■■
//  ■■
//16
//  ■
//■■
//■//17
//  ■■
//■■
//18
//■
//■■
//  ■#endif // TETRIS_H

tetris.cpp

#include "tetris.h"CBlock::CBlock()
{m_IsExist = false;
}CBlock::~CBlock()
{}void CBlock::Draw(QPainter &I_Painter) const
{if (m_IsExist){QBrush Brush(m_Color);I_Painter.setBrush(Brush);Brush.setStyle(Qt::SolidPattern);I_Painter.drawRect(m_X, m_Y, BLOCKSIDELENGTH, BLOCKSIDELENGTH);}
}void CBlock::Create(int I_X, int I_Y, const QColor& I_Color, bool I_IsExist, int I_Row, int I_Col)
{m_X = I_X;m_Y = I_Y;m_Row1 = I_Row;m_Row2 = I_Row;m_Col = I_Col;m_Color = I_Color;m_IsExist = I_IsExist;
}void CBlock::SetX(int I_X)
{m_X = I_X;
}int CBlock::GetX() const
{return m_X;
}void CBlock::SetY(int I_Y)
{m_Y = I_Y;
}int CBlock::GetY() const
{return m_Y;
}void CBlock::SetRow1(int I_Row1)
{m_Row1 = I_Row1;
}int CBlock::GetRow1() const
{return m_Row1;
}void CBlock::SetRow2(int I_Row2)
{m_Row2 = I_Row2;
}int CBlock::GetRow2() const
{return m_Row2;
}void CBlock::SetCol(int I_Col)
{m_Col = I_Col;
}int CBlock::GetCol() const
{return m_Col;
}void CBlock::SetColor(const QColor& I_Color)
{m_Color = I_Color;
}QColor CBlock::GetColor() const
{return m_Color;
}void CBlock::SetIsExist(bool I_IsExist)
{m_IsExist = I_IsExist;
}bool CBlock::GetIsExist() const
{return m_IsExist;
}void CBlock::Copy(const CBlock&I_Block)
{m_X = I_Block.GetX();m_Y = I_Block.GetY();m_Row1 = I_Block.GetRow1();m_Row2 = I_Block.GetRow2();m_Col = I_Block.GetCol();m_Color = I_Block.GetColor();m_IsExist = I_Block.GetIsExist();
}CFigure::CFigure()
{m_IsExist = false;
}CFigure::CFigure(CFigure &I_Figure)
{for (int i = 0; i < 4; i++){m_Block[i].Copy((I_Figure.Get_m_Block())[i]);m_Shape[i] = I_Figure.Get_m_Shape()[i];}m_IsExist = I_Figure.GetIsExist();m_NextShape = I_Figure.GetNextShape();
}CFigure::~CFigure()
{}void CFigure::Draw(QPainter &I_Painter) const
{for (int i = 0; i < 4; i++){m_Block[i].Draw(I_Painter);}
}void CFigure::DropDown()
{for (int i = 0; i < 4; i++){m_Block[i].SetY(m_Block[i].GetY() + 5);if (!((m_Block[i].GetY() - YUP) % BLOCKSIDELENGTH)){m_Block[i].SetRow1(m_Block[i].GetRow2());}else{if (m_Block[i].GetRow1() == m_Block[i].GetRow2()){m_Block[i].SetRow2(m_Block[i].GetRow2() + 1);}}}
}void CFigure::DropDown(int I_Row)
{for (int i = 0; i < 4; i++){if (!((m_Block[i].GetY() - YUP) % BLOCKSIDELENGTH)){m_Block[i].SetY(m_Block[i].GetY() + I_Row*BLOCKSIDELENGTH);}else{m_Block[i].SetY(YUP + (I_Row + ((m_Block[i].GetY() - YUP) / BLOCKSIDELENGTH) + 1)*BLOCKSIDELENGTH);}m_Block[i].SetRow2(m_Block[i].GetRow2() + I_Row);m_Block[i].SetRow1(m_Block[i].GetRow2());}
}void CFigure::Move(char I_Direction)
{if ('A' == I_Direction || 'a' == I_Direction){for (int i = 0; i < 4; i++){m_Block[i].SetX(m_Block[i].GetX() - BLOCKSIDELENGTH);m_Block[i].SetCol(m_Block[i].GetCol() - 1);}}else if ('D' == I_Direction || 'd' == I_Direction){for (int i = 0; i < 4; i++){m_Block[i].SetX(m_Block[i].GetX() + BLOCKSIDELENGTH);m_Block[i].SetCol(m_Block[i].GetCol() + 1);}}
}void CFigure::Vary()
{switch (m_Shape[m_NextShape]){case Shape0:break;case Shape1:m_Block[1].SetX(m_Block[0].GetX() + BLOCKSIDELENGTH);m_Block[1].SetY(m_Block[0].GetY());m_Block[1].SetRow1(m_Block[0].GetRow1());m_Block[1].SetRow2(m_Block[0].GetRow2());m_Block[1].SetCol(m_Block[0].GetCol() + 1);m_Block[2].SetX(m_Block[0].GetX() + BLOCKSIDELENGTH * 2);m_Block[2].SetY(m_Block[0].GetY());m_Block[2].SetRow1(m_Block[0].GetRow1());m_Block[2].SetRow2(m_Block[0].GetRow2());m_Block[2].SetCol(m_Block[0].GetCol() + 2);m_Block[3].SetX(m_Block[0].GetX() + BLOCKSIDELENGTH * 3);m_Block[3].SetY(m_Block[0].GetY());m_Block[3].SetRow1(m_Block[0].GetRow1());m_Block[3].SetRow2(m_Block[0].GetRow2());m_Block[3].SetCol(m_Block[0].GetCol() + 3);break;case Shape2:m_Block[1].SetX(m_Block[0].GetX());m_Block[1].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH);m_Block[1].SetRow1(m_Block[0].GetRow1() + 1);m_Block[1].SetRow2(m_Block[0].GetRow2() + 1);m_Block[1].SetCol(m_Block[0].GetCol());m_Block[2].SetX(m_Block[0].GetX());m_Block[2].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH * 2);m_Block[2].SetRow1(m_Block[0].GetRow1() + 2);m_Block[2].SetRow2(m_Block[0].GetRow2() + 2);m_Block[2].SetCol(m_Block[0].GetCol());m_Block[3].SetX(m_Block[0].GetX());m_Block[3].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH * 3);m_Block[3].SetRow1(m_Block[0].GetRow1() + 3);m_Block[3].SetRow2(m_Block[0].GetRow2() + 3);m_Block[3].SetCol(m_Block[0].GetCol());break;case Shape3:m_Block[1].SetX(m_Block[0].GetX() - BLOCKSIDELENGTH);m_Block[1].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH);m_Block[1].SetRow1(m_Block[0].GetRow1() + 1);m_Block[1].SetRow2(m_Block[0].GetRow2() + 1);m_Block[1].SetCol(m_Block[0].GetCol() - 1);m_Block[2].SetX(m_Block[0].GetX());m_Block[2].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH);m_Block[2].SetRow1(m_Block[0].GetRow1() + 1);m_Block[2].SetRow2(m_Block[0].GetRow2() + 1);m_Block[2].SetCol(m_Block[0].GetCol());m_Block[3].SetX(m_Block[0].GetX() + BLOCKSIDELENGTH);m_Block[3].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH);m_Block[3].SetRow1(m_Block[0].GetRow1() + 1);m_Block[3].SetRow2(m_Block[0].GetRow2() + 1);m_Block[3].SetCol(m_Block[0].GetCol() + 1);break;case Shape4:m_Block[1].SetX(m_Block[0].GetX());m_Block[1].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH);m_Block[1].SetRow1(m_Block[0].GetRow1() + 1);m_Block[1].SetRow2(m_Block[0].GetRow2() + 1);m_Block[1].SetCol(m_Block[0].GetCol());m_Block[2].SetX(m_Block[0].GetX() + BLOCKSIDELENGTH);m_Block[2].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH);m_Block[2].SetRow1(m_Block[0].GetRow1() + 1);m_Block[2].SetRow2(m_Block[0].GetRow2() + 1);m_Block[2].SetCol(m_Block[0].GetCol() + 1);m_Block[3].SetX(m_Block[0].GetX());m_Block[3].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH * 2);m_Block[3].SetRow1(m_Block[0].GetRow1() + 2);m_Block[3].SetRow2(m_Block[0].GetRow2() + 2);m_Block[3].SetCol(m_Block[0].GetCol());break;case Shape5:m_Block[1].SetX(m_Block[0].GetX() + BLOCKSIDELENGTH);m_Block[1].SetY(m_Block[0].GetY());m_Block[1].SetRow1(m_Block[0].GetRow1());m_Block[1].SetRow2(m_Block[0].GetRow2());m_Block[1].SetCol(m_Block[0].GetCol() + 1);m_Block[2].SetX(m_Block[0].GetX() + BLOCKSIDELENGTH * 2);m_Block[2].SetY(m_Block[0].GetY());m_Block[2].SetRow1(m_Block[0].GetRow1());m_Block[2].SetRow2(m_Block[0].GetRow2());m_Block[2].SetCol(m_Block[0].GetCol() + 2);m_Block[3].SetX(m_Block[0].GetX() + BLOCKSIDELENGTH);m_Block[3].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH);m_Block[3].SetRow1(m_Block[0].GetRow1() + 1);m_Block[3].SetRow2(m_Block[0].GetRow2() + 1);m_Block[3].SetCol(m_Block[0].GetCol() + 1);break;case Shape6:m_Block[1].SetX(m_Block[0].GetX() - BLOCKSIDELENGTH);m_Block[1].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH);m_Block[1].SetRow1(m_Block[0].GetRow1() + 1);m_Block[1].SetRow2(m_Block[0].GetRow2() + 1);m_Block[1].SetCol(m_Block[0].GetCol() - 1);m_Block[2].SetX(m_Block[0].GetX());m_Block[2].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH);m_Block[2].SetRow1(m_Block[0].GetRow1() + 1);m_Block[2].SetRow2(m_Block[0].GetRow2() + 1);m_Block[2].SetCol(m_Block[0].GetCol());m_Block[3].SetX(m_Block[0].GetX());m_Block[3].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH * 2);m_Block[3].SetRow1(m_Block[0].GetRow1() + 2);m_Block[3].SetRow2(m_Block[0].GetRow2() + 2);m_Block[3].SetCol(m_Block[0].GetCol());break;case Shape7:m_Block[1].SetX(m_Block[0].GetX() + BLOCKSIDELENGTH);m_Block[1].SetY(m_Block[0].GetY());m_Block[1].SetRow1(m_Block[0].GetRow1());m_Block[1].SetRow2(m_Block[0].GetRow2());m_Block[1].SetCol(m_Block[0].GetCol() + 1);m_Block[2].SetX(m_Block[0].GetX() + BLOCKSIDELENGTH * 2);m_Block[2].SetY(m_Block[0].GetY());m_Block[2].SetRow1(m_Block[0].GetRow1());m_Block[2].SetRow2(m_Block[0].GetRow2());m_Block[2].SetCol(m_Block[0].GetCol() + 2);m_Block[3].SetX(m_Block[0].GetX() + BLOCKSIDELENGTH * 2);m_Block[3].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH);m_Block[3].SetRow1(m_Block[0].GetRow1() + 1);m_Block[3].SetRow2(m_Block[0].GetRow2() + 1);m_Block[3].SetCol(m_Block[0].GetCol() + 2);break;case Shape8:m_Block[1].SetX(m_Block[0].GetX());m_Block[1].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH);m_Block[1].SetRow1(m_Block[0].GetRow1() + 1);m_Block[1].SetRow2(m_Block[0].GetRow2() + 1);m_Block[1].SetCol(m_Block[0].GetCol());m_Block[2].SetX(m_Block[0].GetX() - BLOCKSIDELENGTH);m_Block[2].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH * 2);m_Block[2].SetRow1(m_Block[0].GetRow1() + 2);m_Block[2].SetRow2(m_Block[0].GetRow2() + 2);m_Block[2].SetCol(m_Block[0].GetCol() - 1);m_Block[3].SetX(m_Block[0].GetX());m_Block[3].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH * 2);m_Block[3].SetRow1(m_Block[0].GetRow1() + 2);m_Block[3].SetRow2(m_Block[0].GetRow2() + 2);m_Block[3].SetCol(m_Block[0].GetCol());break;case Shape9:m_Block[1].SetX(m_Block[0].GetX());m_Block[1].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH);m_Block[1].SetRow1(m_Block[0].GetRow1() + 1);m_Block[1].SetRow2(m_Block[0].GetRow2() + 1);m_Block[1].SetCol(m_Block[0].GetCol());m_Block[2].SetX(m_Block[0].GetX() + BLOCKSIDELENGTH);m_Block[2].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH);m_Block[2].SetRow1(m_Block[0].GetRow1() + 1);m_Block[2].SetRow2(m_Block[0].GetRow2() + 1);m_Block[2].SetCol(m_Block[0].GetCol() + 1);m_Block[3].SetX(m_Block[0].GetX() + BLOCKSIDELENGTH * 2);m_Block[3].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH);m_Block[3].SetRow1(m_Block[0].GetRow1() + 1);m_Block[3].SetRow2(m_Block[0].GetRow2() + 1);m_Block[3].SetCol(m_Block[0].GetCol() + 2);break;case Shape10:m_Block[1].SetX(m_Block[0].GetX() + BLOCKSIDELENGTH);m_Block[1].SetY(m_Block[0].GetY());m_Block[1].SetRow1(m_Block[0].GetRow1());m_Block[1].SetRow2(m_Block[0].GetRow2());m_Block[1].SetCol(m_Block[0].GetCol() + 1);m_Block[2].SetX(m_Block[0].GetX());m_Block[2].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH);m_Block[2].SetRow1(m_Block[0].GetRow1() + 1);m_Block[2].SetRow2(m_Block[0].GetRow2() + 1);m_Block[2].SetCol(m_Block[0].GetCol());m_Block[3].SetX(m_Block[0].GetX());m_Block[3].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH * 2);m_Block[3].SetRow1(m_Block[0].GetRow1() + 2);m_Block[3].SetRow2(m_Block[0].GetRow2() + 2);m_Block[3].SetCol(m_Block[0].GetCol());break;case Shape11:m_Block[1].SetX(m_Block[0].GetX() + BLOCKSIDELENGTH);m_Block[1].SetY(m_Block[0].GetY());m_Block[1].SetRow1(m_Block[0].GetRow1());m_Block[1].SetRow2(m_Block[0].GetRow2());m_Block[1].SetCol(m_Block[0].GetCol() + 1);m_Block[2].SetX(m_Block[0].GetX() + BLOCKSIDELENGTH * 2);m_Block[2].SetY(m_Block[0].GetY());m_Block[2].SetRow1(m_Block[0].GetRow1());m_Block[2].SetRow2(m_Block[0].GetRow2());m_Block[2].SetCol(m_Block[0].GetCol() + 2);m_Block[3].SetX(m_Block[0].GetX());m_Block[3].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH);m_Block[3].SetRow1(m_Block[0].GetRow1() + 1);m_Block[3].SetRow2(m_Block[0].GetRow2() + 1);m_Block[3].SetCol(m_Block[0].GetCol());break;case Shape12:m_Block[1].SetX(m_Block[0].GetX() + BLOCKSIDELENGTH);m_Block[1].SetY(m_Block[0].GetY());m_Block[1].SetRow1(m_Block[0].GetRow1());m_Block[1].SetRow2(m_Block[0].GetRow2());m_Block[1].SetCol(m_Block[0].GetCol() + 1);m_Block[2].SetX(m_Block[0].GetX() + BLOCKSIDELENGTH);m_Block[2].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH);m_Block[2].SetRow1(m_Block[0].GetRow1() + 1);m_Block[2].SetRow2(m_Block[0].GetRow2() + 1);m_Block[2].SetCol(m_Block[0].GetCol() + 1);m_Block[3].SetX(m_Block[0].GetX() + BLOCKSIDELENGTH);m_Block[3].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH * 2);m_Block[3].SetRow1(m_Block[0].GetRow1() + 2);m_Block[3].SetRow2(m_Block[0].GetRow2() + 2);m_Block[3].SetCol(m_Block[0].GetCol() + 1);break;case Shape13:m_Block[1].SetX(m_Block[0].GetX() - BLOCKSIDELENGTH * 2);m_Block[1].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH);m_Block[1].SetRow1(m_Block[0].GetRow1() + 1);m_Block[1].SetRow2(m_Block[0].GetRow2() + 1);m_Block[1].SetCol(m_Block[0].GetCol() - 2);m_Block[2].SetX(m_Block[0].GetX() - BLOCKSIDELENGTH);m_Block[2].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH);m_Block[2].SetRow1(m_Block[0].GetRow1() + 1);m_Block[2].SetRow2(m_Block[0].GetRow2() + 1);m_Block[2].SetCol(m_Block[0].GetCol() - 1);m_Block[3].SetX(m_Block[0].GetX());m_Block[3].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH);m_Block[3].SetRow1(m_Block[0].GetRow1() + 1);m_Block[3].SetRow2(m_Block[0].GetRow2() + 1);m_Block[3].SetCol(m_Block[0].GetCol());break;case Shape14:m_Block[1].SetX(m_Block[0].GetX());m_Block[1].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH);m_Block[1].SetRow1(m_Block[0].GetRow1() + 1);m_Block[1].SetRow2(m_Block[0].GetRow2() + 1);m_Block[1].SetCol(m_Block[0].GetCol());m_Block[2].SetX(m_Block[0].GetX());m_Block[2].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH * 2);m_Block[2].SetRow1(m_Block[0].GetRow1() + 2);m_Block[2].SetRow2(m_Block[0].GetRow2() + 2);m_Block[2].SetCol(m_Block[0].GetCol());m_Block[3].SetX(m_Block[0].GetX() + BLOCKSIDELENGTH);m_Block[3].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH * 2);m_Block[3].SetRow1(m_Block[0].GetRow1() + 2);m_Block[3].SetRow2(m_Block[0].GetRow2() + 2);m_Block[3].SetCol(m_Block[0].GetCol() + 1);break;case Shape15:m_Block[1].SetX(m_Block[0].GetX() + BLOCKSIDELENGTH);m_Block[1].SetY(m_Block[0].GetY());m_Block[1].SetRow1(m_Block[0].GetRow1());m_Block[1].SetRow2(m_Block[0].GetRow2());m_Block[1].SetCol(m_Block[0].GetCol() + 1);m_Block[2].SetX(m_Block[0].GetX() + BLOCKSIDELENGTH);m_Block[2].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH);m_Block[2].SetRow1(m_Block[0].GetRow1() + 1);m_Block[2].SetRow2(m_Block[0].GetRow2() + 1);m_Block[2].SetCol(m_Block[0].GetCol() + 1);m_Block[3].SetX(m_Block[0].GetX() + BLOCKSIDELENGTH * 2);m_Block[3].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH);m_Block[3].SetRow1(m_Block[0].GetRow1() + 1);m_Block[3].SetRow2(m_Block[0].GetRow2() + 1);m_Block[3].SetCol(m_Block[0].GetCol() + 2);break;case Shape16:m_Block[1].SetX(m_Block[0].GetX() - BLOCKSIDELENGTH);m_Block[1].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH);m_Block[1].SetRow1(m_Block[0].GetRow1() + 1);m_Block[1].SetRow2(m_Block[0].GetRow2() + 1);m_Block[1].SetCol(m_Block[0].GetCol() - 1);m_Block[2].SetX(m_Block[0].GetX());m_Block[2].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH);m_Block[2].SetRow1(m_Block[0].GetRow1() + 1);m_Block[2].SetRow2(m_Block[0].GetRow2() + 1);m_Block[2].SetCol(m_Block[0].GetCol());m_Block[3].SetX(m_Block[0].GetX() - BLOCKSIDELENGTH);m_Block[3].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH * 2);m_Block[3].SetRow1(m_Block[0].GetRow1() + 2);m_Block[3].SetRow2(m_Block[0].GetRow2() + 2);m_Block[3].SetCol(m_Block[0].GetCol() - 1);break;case Shape17:m_Block[1].SetX(m_Block[0].GetX() + BLOCKSIDELENGTH);m_Block[1].SetY(m_Block[0].GetY());m_Block[1].SetRow1(m_Block[0].GetRow1());m_Block[1].SetRow2(m_Block[0].GetRow2());m_Block[1].SetCol(m_Block[0].GetCol() + 1);m_Block[2].SetX(m_Block[0].GetX() - BLOCKSIDELENGTH);m_Block[2].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH);m_Block[2].SetRow1(m_Block[0].GetRow1() + 1);m_Block[2].SetRow2(m_Block[0].GetRow2() + 1);m_Block[2].SetCol(m_Block[0].GetCol() - 1);m_Block[3].SetX(m_Block[0].GetX());m_Block[3].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH);m_Block[3].SetRow1(m_Block[0].GetRow1() + 1);m_Block[3].SetRow2(m_Block[0].GetRow2() + 1);m_Block[3].SetCol(m_Block[0].GetCol());break;case Shape18:m_Block[1].SetX(m_Block[0].GetX());m_Block[1].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH);m_Block[1].SetRow1(m_Block[0].GetRow1() + 1);m_Block[1].SetRow2(m_Block[0].GetRow2() + 1);m_Block[1].SetCol(m_Block[0].GetCol());m_Block[2].SetX(m_Block[0].GetX() + BLOCKSIDELENGTH);m_Block[2].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH);m_Block[2].SetRow1(m_Block[0].GetRow1() + 1);m_Block[2].SetRow2(m_Block[0].GetRow2() + 1);m_Block[2].SetCol(m_Block[0].GetCol() + 1);m_Block[3].SetX(m_Block[0].GetX() + BLOCKSIDELENGTH);m_Block[3].SetY(m_Block[0].GetY() + BLOCKSIDELENGTH * 2);m_Block[3].SetRow1(m_Block[0].GetRow1() + 2);m_Block[3].SetRow2(m_Block[0].GetRow2() + 2);m_Block[3].SetCol(m_Block[0].GetCol() + 1);break;default:break;}m_NextShape = (m_NextShape + 1) % 4;
}void CFigure::SetIsExist(bool I_IsExist)
{m_IsExist = I_IsExist;return;
}bool CFigure::GetIsExist() const
{return m_IsExist;
}void CFigure::Create()
{if (m_IsExist){return;}srand(time(nullptr));int Shape = rand() % 7;switch (Shape){case 0:Set_m_Block(Shape0);m_Shape[0] = Shape0;m_Shape[1] = Shape0;m_Shape[2] = Shape0;m_Shape[3] = Shape0;break;case 1:Set_m_Block(Shape1);m_Shape[0] = Shape1;m_Shape[1] = Shape2;m_Shape[2] = Shape1;m_Shape[3] = Shape2;break;case 2:Set_m_Block(Shape3);m_Shape[0] = Shape3;m_Shape[1] = Shape4;m_Shape[2] = Shape5;m_Shape[3] = Shape6;break;case 3:Set_m_Block(Shape7);m_Shape[0] = Shape7;m_Shape[1] = Shape8;m_Shape[2] = Shape9;m_Shape[3] = Shape10;break;case 4:Set_m_Block(Shape11);m_Shape[0] = Shape11;m_Shape[1] = Shape12;m_Shape[2] = Shape13;m_Shape[3] = Shape14;break;case 5:Set_m_Block(Shape15);m_Shape[0] = Shape15;m_Shape[1] = Shape16;m_Shape[2] = Shape15;m_Shape[3] = Shape16;break;case 6:Set_m_Block(Shape17);m_Shape[0] = Shape17;m_Shape[1] = Shape18;m_Shape[2] = Shape17;m_Shape[3] = Shape18;break;default:break;}m_NextShape = 1;m_IsExist = true;
}void CFigure::Set_m_Block(ShapeCode I_ShapeCode)
{switch (I_ShapeCode){case Shape0:m_Block[0].Create(XINIT, YINIT, Color0, true, -2, 4);m_Block[1].Create(XINIT + BLOCKSIDELENGTH, YINIT, Color0, true, -2, 5);m_Block[2].Create(XINIT, YINIT + BLOCKSIDELENGTH, Color0, true, -1, 4);m_Block[3].Create(XINIT + BLOCKSIDELENGTH, YINIT + BLOCKSIDELENGTH, Color0, true, -1, 5);break;case Shape1:m_Block[0].Create(XINIT, YINIT, Color1, true, -2, 4);m_Block[1].Create(XINIT + BLOCKSIDELENGTH, YINIT, Color1, true, -2, 5);m_Block[2].Create(XINIT + BLOCKSIDELENGTH * 2, YINIT, Color1, true, -2, 6);m_Block[3].Create(XINIT + BLOCKSIDELENGTH * 3, YINIT, Color1, true, -2, 7);break;case Shape3:m_Block[0].Create(XINIT, YINIT, Color2, true, -2, 4);m_Block[1].Create(XINIT - BLOCKSIDELENGTH, YINIT + BLOCKSIDELENGTH, Color2, true, -1, 3);m_Block[2].Create(XINIT, YINIT + BLOCKSIDELENGTH, Color2, true, -1, 4);m_Block[3].Create(XINIT + BLOCKSIDELENGTH, YINIT + BLOCKSIDELENGTH, Color2, true, -1, 5);break;case Shape7:m_Block[0].Create(XINIT, YINIT, Color3, true, -2, 4);m_Block[1].Create(XINIT + BLOCKSIDELENGTH, YINIT, Color3, true, -2, 5);m_Block[2].Create(XINIT + BLOCKSIDELENGTH * 2, YINIT, Color3, true, -2, 6);m_Block[3].Create(XINIT + BLOCKSIDELENGTH * 2, YINIT + BLOCKSIDELENGTH, Color3, true, -1, 6);break;case Shape11:m_Block[0].Create(XINIT, YINIT, Color4, true, -2, 4);m_Block[1].Create(XINIT + BLOCKSIDELENGTH, YINIT, Color4, true, -2, 5);m_Block[2].Create(XINIT + BLOCKSIDELENGTH * 2, YINIT, Color4, true, -2, 6);m_Block[3].Create(XINIT, YINIT + BLOCKSIDELENGTH, Color4, true, -1, 4);break;case Shape15:m_Block[0].Create(XINIT, YINIT, Color5, true, -2, 4);m_Block[1].Create(XINIT + BLOCKSIDELENGTH, YINIT, Color5, true, -2, 5);m_Block[2].Create(XINIT + BLOCKSIDELENGTH, YINIT + BLOCKSIDELENGTH, Color5, true, -1, 5);m_Block[3].Create(XINIT + BLOCKSIDELENGTH * 2, YINIT + BLOCKSIDELENGTH, Color5, true, -1, 6);break;case Shape17:m_Block[0].Create(XINIT, YINIT, Color6, true, -2, 4);m_Block[1].Create(XINIT + BLOCKSIDELENGTH, YINIT, Color6, true, -2, 5);m_Block[2].Create(XINIT - BLOCKSIDELENGTH, YINIT + BLOCKSIDELENGTH, Color6, true, -1, 3);m_Block[3].Create(XINIT, YINIT + BLOCKSIDELENGTH, Color6, true, -1, 4);break;default:break;}
}CBlock *CFigure::Get_m_Block()
{return m_Block;
}ShapeCode *CFigure::Get_m_Shape()
{return m_Shape;
}int CFigure::GetNextShape() const
{return m_NextShape;
}CTetris::CTetris(QWidget *parent)
: QWidget(parent)
{ui.setupUi(this);connect(&m_StartButton, &QPushButton::clicked, this, &CTetris::GameStartSlot);connect(this, &CTetris::GameOverSignal, this, &CTetris::GameOverSlot);setFixedSize(WINW, WINH);m_StartButton.setParent(this);m_StartButton.setText("开始游戏");m_StartButton.move(15, 0);startTimer(100);this->grabKeyboard();m_IsStart = false;
}CTetris::~CTetris()
{}void CTetris::GameStartSlot()
{m_StartButton.setEnabled(false);Start();
}void CTetris::GameOverSlot()
{Over();m_StartButton.setEnabled(true);
}void CTetris::paintEvent(QPaintEvent *)
{if (m_IsStart){Draw();}
}void CTetris::timerEvent(QTimerEvent *)
{if (m_IsStart){//下落if (CheckDropDown())//可以下落{m_Figure.DropDown();update();}else//不能下落{if (IsOver()){emit this->GameOverSignal();}else{FixFigure();CalculateScore();update();}}}
}void CTetris::keyPressEvent(QKeyEvent *I_Event)
{if (m_IsStart){char Key = I_Event->key();switch (Key){case 'A':case 'a':case 'D':case 'd':if (CheckMove(Key)){m_Figure.Move(Key);update();}break;case 'W':case 'w':if (CheckVary()){m_Figure.Vary();update();}break;case 'S':case 's':if (CheckDropDownS()){m_Figure.DropDown(CalDropDownRow());update();}break;default:break;}}
}void CTetris::keyReleaseEvent(QKeyEvent *I_Event)
{}void CTetris::Start()
{if (m_IsStart){return;}m_Figure.Create();m_Score = 0;m_IsStart = true;
}void CTetris::Over()
{m_IsStart = false;m_Figure.SetIsExist(false);for (int i = 0; i < ROWNUM; i++){for (int j = 0; j < COLNUM; j++){m_BlockArr[i][j].SetIsExist(false);}}
}void CTetris::Draw()
{m_Painter.begin(this);QPen Pen(Qt::black);QBrush Brush(QColor(255, 165, 0));m_Painter.setPen(Pen);m_Painter.setBrush(Brush);Brush.setStyle(Qt::SolidPattern);//绘制游戏界面整体框架for (int X = XINIT - BLOCKSIDELENGTH*3; X < XINIT + BLOCKSIDELENGTH * 5; X += BLOCKSIDELENGTH){m_Painter.drawRect(X, YUP - BLOCKSIDELENGTH*3 - 5, BLOCKSIDELENGTH, BLOCKSIDELENGTH);}for (int X = XLEFT; X < XINIT-BLOCKSIDELENGTH * 2; X += BLOCKSIDELENGTH){m_Painter.drawRect(X, YUP - BLOCKSIDELENGTH - 5, BLOCKSIDELENGTH, BLOCKSIDELENGTH);}for (int X = XINIT+BLOCKSIDELENGTH*4; X < XRIGHT; X += BLOCKSIDELENGTH){m_Painter.drawRect(X, YUP - BLOCKSIDELENGTH - 5, BLOCKSIDELENGTH, BLOCKSIDELENGTH);}for (int X = XLEFT; X < XRIGHT; X += BLOCKSIDELENGTH){m_Painter.drawRect(X, YDOWN + 5, BLOCKSIDELENGTH, BLOCKSIDELENGTH);}for (int Y = YUP; Y < YDOWN; Y += BLOCKSIDELENGTH){m_Painter.drawRect(XLEFT - BLOCKSIDELENGTH - 5, Y, BLOCKSIDELENGTH, BLOCKSIDELENGTH);m_Painter.drawRect(XRIGHT + 5, Y, BLOCKSIDELENGTH, BLOCKSIDELENGTH);m_Painter.drawRect(XRIGHT + 215, Y, BLOCKSIDELENGTH, BLOCKSIDELENGTH);}for (int X = XRIGHT + 30; X < XRIGHT + 210; X += BLOCKSIDELENGTH){m_Painter.drawRect(X, YUP - BLOCKSIDELENGTH - 5, BLOCKSIDELENGTH, BLOCKSIDELENGTH);m_Painter.drawRect(X, YDOWN + 5, BLOCKSIDELENGTH, BLOCKSIDELENGTH);m_Painter.drawRect(X, YUP + 100, BLOCKSIDELENGTH, BLOCKSIDELENGTH);}m_Painter.drawRect(XLEFT - BLOCKSIDELENGTH - 5, YUP - BLOCKSIDELENGTH - 5, BLOCKSIDELENGTH, BLOCKSIDELENGTH);m_Painter.drawRect(XRIGHT + 5, YUP - BLOCKSIDELENGTH - 5, BLOCKSIDELENGTH, BLOCKSIDELENGTH);m_Painter.drawRect(XLEFT - BLOCKSIDELENGTH - 5, YDOWN + 5, BLOCKSIDELENGTH, BLOCKSIDELENGTH);m_Painter.drawRect(XRIGHT + 5, YDOWN + 5, BLOCKSIDELENGTH, BLOCKSIDELENGTH);m_Painter.drawRect(XRIGHT + 215, YUP - BLOCKSIDELENGTH - 5, BLOCKSIDELENGTH, BLOCKSIDELENGTH);m_Painter.drawRect(XRIGHT + 215, YDOWN + 5, BLOCKSIDELENGTH, BLOCKSIDELENGTH);m_Painter.drawRect(XINIT - BLOCKSIDELENGTH * 3, YUP - BLOCKSIDELENGTH * 2 - 5, BLOCKSIDELENGTH, BLOCKSIDELENGTH);m_Painter.drawRect(XINIT + BLOCKSIDELENGTH * 4, YUP - BLOCKSIDELENGTH * 2 - 5, BLOCKSIDELENGTH, BLOCKSIDELENGTH);m_Painter.drawLine(XLEFT, YUP, XRIGHT, YUP);m_Painter.drawLine(XLEFT, YUP, XLEFT, YDOWN);m_Painter.drawLine(XRIGHT, YUP, XRIGHT, YDOWN);m_Painter.drawLine(XLEFT, YDOWN, XRIGHT, YDOWN);//绘制提示区char Str[24] = { 0 };sprintf_s(Str, "得分:%d", m_Score);m_Painter.drawText(XRIGHT + 60, YUP + 60, Str);m_Painter.drawText(XRIGHT + 60, YUP + 160, "W:调整形状");m_Painter.drawText(XRIGHT + 60, YUP + 200, "A:左移");m_Painter.drawText(XRIGHT + 60, YUP + 240, "D:右移");m_Painter.drawText(XRIGHT + 60, YUP + 280, "S:下落");//绘制游戏区for (int i = 0; i < ROWNUM; i++){for (int j = 0; j < COLNUM; j++){m_BlockArr[i][j].Draw(m_Painter);}}m_Figure.Draw(m_Painter);m_Painter.end();
}bool CTetris::CheckDropDown()
{CBlock *pBlock;pBlock = m_Figure.Get_m_Block();if (pBlock[0].GetRow1() == pBlock[0].GetRow2()){for (int i = 0; i < 4; i++){if ((ROWNUM - 1) == pBlock[i].GetRow1() || (0<=(pBlock[i].GetRow1() + 1)&&m_BlockArr[pBlock[i].GetRow1() + 1][pBlock[i].GetCol()].GetIsExist())){return false;}}}return true;
}bool CTetris::CheckDropDownS()
{CBlock *pBlock;pBlock = m_Figure.Get_m_Block();for (int i = 0; i < 4; i++){if (0 > pBlock[i].GetRow1()){return false;}}return true;
}
int CTetris::CalDropDownRow()
{int Row = 0;bool DropFlag = true;CBlock *pBlock;pBlock = m_Figure.Get_m_Block();while (true){Row++;DropFlag = true;for (int i = 0; i < 4; i++){if ((ROWNUM-1) < (pBlock[i].GetRow2() + Row) || m_BlockArr[pBlock[i].GetRow2() + Row][pBlock[i].GetCol()].GetIsExist()){DropFlag = false;}}if (!DropFlag){Row--;break;}}return Row;
}bool CTetris::CheckMove(char I_Direction)
{CBlock *pBlock;pBlock = m_Figure.Get_m_Block();for (int i = 0; i < 4; i++){if (0 > pBlock[i].GetRow1()){return false;}}if ('A' == I_Direction || 'a' == I_Direction){for (int i = 0; i < 4; i++){if (0 == pBlock[i].GetCol() || m_BlockArr[pBlock[i].GetRow2()][pBlock[i].GetCol() - 1].GetIsExist() || m_BlockArr[pBlock[i].GetRow1()][pBlock[i].GetCol() - 1].GetIsExist()){return false;}}}else if ('D' == I_Direction || 'd' == I_Direction){for (int i = 0; i < 4; i++){if ((COLNUM-1) == pBlock[i].GetCol() || m_BlockArr[pBlock[i].GetRow2()][pBlock[i].GetCol() + 1].GetIsExist() || m_BlockArr[pBlock[i].GetRow1()][pBlock[i].GetCol() + 1].GetIsExist()){return false;}}}return true;
}bool CTetris::CheckVary()
{CBlock *pBlockTemp;pBlockTemp = m_Figure.Get_m_Block();for (int i = 0; i < 4; i++){if (0 > pBlockTemp[i].GetRow1()){return false;}}CFigure TempFigure(m_Figure);TempFigure.Vary();CBlock *pBlock;pBlock = TempFigure.Get_m_Block();for (int i = 0; i < 4; i++){if (0 > pBlock[i].GetCol() || (COLNUM-1) < pBlock[i].GetCol()|| 0 > pBlock[i].GetRow1() || (ROWNUM-1) < pBlock[i].GetRow1()|| 0 > pBlock[i].GetRow2() || (ROWNUM - 1) < pBlock[i].GetRow2()|| m_BlockArr[pBlock[i].GetRow1()][pBlock[i].GetCol()].GetIsExist()|| m_BlockArr[pBlock[i].GetRow2()][pBlock[i].GetCol()].GetIsExist()){return false;}}return true;
}void CTetris::Eliminate(int I_Row)
{for (int i = I_Row; i > 0; i--){for (int j = 0; j < COLNUM; j++){m_BlockArr[i][j].SetColor(m_BlockArr[i - 1][j].GetColor());m_BlockArr[i][j].SetIsExist(m_BlockArr[i - 1][j].GetIsExist());}}for (int j = 0; j < COLNUM; j++){m_BlockArr[0][j].SetIsExist(false);}
}void CTetris::CalculateScore()
{CBlock *pBlock;pBlock = m_Figure.Get_m_Block();bool IsEliminate = true;int MinRow = pBlock[0].GetRow1();int MaxRow = pBlock[3].GetRow1();for (int i = MinRow; i <= MaxRow; i++){for (int j = 0; j < COLNUM; j++){if (!(m_BlockArr[i][j].GetIsExist())){IsEliminate = false;}}if (IsEliminate){Eliminate(i);m_Score += 10;}IsEliminate = true;}m_Figure.Create();
}bool CTetris::IsOver()
{CBlock *pBlock;pBlock = m_Figure.Get_m_Block();for (int i = 0; i < 4; i++){assert(pBlock[i].GetRow1() == pBlock[i].GetRow2());if (0 == pBlock[i].GetRow1()){return true;}}return false;
}void CTetris::FixFigure()
{CBlock *pBlock;pBlock = m_Figure.Get_m_Block();for (int i = 0; i < 4; i++){assert(pBlock[i].GetRow1() == pBlock[i].GetRow2());m_BlockArr[pBlock[i].GetRow1()][pBlock[i].GetCol()].Copy(pBlock[i]);}m_Figure.SetIsExist(false);
}

main.cpp

#include "tetris.h"
#include <QtWidgets/QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);CTetris w;w.show();return a.exec();
}

C++俄罗斯方块源码(Qt版)相关推荐

  1. 自适应端在线玩俄罗斯方块源码开源版源码

    简介: 俄罗斯方块是一直各类程序语言热衷实现的经典游戏,JavaScript的实现版本也有很多,用React 做好俄罗斯方块则成了我一个目标. 响应式 不仅指屏幕的自适应,而是在PC使用键盘.在手机使 ...

  2. Qt大屏电子看板系统源码基础版

    Qt大屏电子看板系统源码基础版 整体总共分三界面,一级界面是整体布局,二级界面是单个功能模块,三界面是单个控件. 子控件包括饼图+圆环图+曲线图+柱状图+柱状分组图+横向柱状图+横向柱状分组图+合格率 ...

  3. python做俄罗斯方块手机版下载_Python俄罗斯方块源码

    <Python俄罗斯方块源码>由会员分享,可在线阅读,更多相关<Python俄罗斯方块源码(10页珍藏版)>请在人人文库网上搜索. 1.Python俄罗斯方块源码诺基亚S60v ...

  4. unity3d俄罗斯方块源码教程+源码和程序下载

    小时候,大家都应玩过或听说过<俄罗斯方块>,它是红白机,掌机等一些电子设备中最常见的一款游戏.而随着时代的发展,信息的进步,游戏画面从简单的黑白方块到彩色方块,游戏的玩法机制从最简单的消方 ...

  5. 飞行熊猫游戏源码android版

    这款游戏是前一段时间完成的一个项目,飞行熊猫游戏源码android版,飞行熊猫基于cocos2d游戏引擎开发,包括了谷歌admob广告支持,没有任何版权问题,大家可以自由修改和上传应用商店. 1.本游 ...

  6. 分享一款最近比较火爆的宝石迷情游戏游戏源码安卓版

    这个是本人上几个月的一个作品,该作品我已经发布到安卓教程网了,现在分享这款宝石迷情游戏游戏源码安卓版吧,这是一款经典的宝石迷情小游戏源码宝石迷情是一款跨平台的宝石消除类游戏,和之前的宝石类消除游戏不同 ...

  7. KuYun企业授权管理系统源码开源版

    简介: KuYun企业授权管理系统源码开源版,带代理.工单.盗版检测管理等功能 1.网站基本管理.系统设置.公告设置.接口设置.价格设置.下载设置. 2.文章管理.广告轮图管理.添加授权.授权列表.授 ...

  8. 爱站CMS综合管理系统源码php版

    简介: 爱站CMS综合管理系统源码php版,运行于以下环境:Apache2.2,PHP Version 5.4.15,Zend Guard Loader 6.0,MySQL-5.5.20 代码全部开源 ...

  9. 微信广告任务平台源码运营版

    介绍: 微信广告任务平台源码运营版|带教程|对接第三方个人免签 微信广告任务平台源码运营版|带教程|对接第三方个人免签,程序采用Thinkphp3.2开发而来! 带第三方个人免签,支持VIP等级充值. ...

  10. php修罗XiunoBBS轻论坛程序源码开源版

    简介: php修罗XiunoBBS轻论坛程序源码开源版,自带99套收费插件. 修罗XiunoBBS源码采用 Bootstrap 4 + JQuery 3 作为前端类库,全面支持移动端浏览器: 后端 X ...

最新文章

  1. 分布式监控报警平台Centreon之:Centreon安装(1)
  2. Spring Boot 集成 Activiti
  3. OSI七层网络模型与TCP/IP五层网络模型
  4. STL源码剖析 第七章 仿函数(函数对象)
  5. postgres 把一个表的值转成另一个表的字段名_用LUT来做一个可动态配置的卷积核...
  6. java模式设计视频教程_全新JAVA设计模式详解视频教程 完整版课程
  7. 【剑指offer】旋转数组的最小数字
  8. Linux C语言实现清除文件中的内容
  9. Android Studio NDK报错:mips64el-linux-android-strip 找不到
  10. Kienct与Arduino学习笔记(2) 深度图像与现实世界的深度图的坐标
  11. Xilinx:词汇表
  12. Beta 反(tu)思(cao) 获小黄衫感言
  13. 推动铅蓄电池绿色“转身”
  14. wxs 实现小程序拖拽功能
  15. 人物-作家-卡耐基:戴尔·卡耐基
  16. foo:function(){}与function foo(){}还有foo=function()三者间的区别
  17. MethodIntrospector工具类使用
  18. 基于微信小程序+爬虫制作一个表情包小程序
  19. utf8和utf-8 bom
  20. java加载资源文件的3种方式

热门文章

  1. 电脑蓝屏,报错信息0xc000007b
  2. python用表格中的数据画柱状图_Python数据可视化:5种绘制柱状图表的方法(附源码)...
  3. Windows Phone开发-- 多任务之墓碑机制
  4. PHP in_array 函数,解决大量数据判断in_array的效率慢,in_array 效率优化
  5. 已经10月份了,焦虑不断怎么破……
  6. pcf8563c语言程序,PCF8563T标准驱动源程序
  7. 学 android需要什么基础,学习安卓开发需要什么基础?
  8. 垃圾回收之三色标记法
  9. wafw00f--一款基于python识别网站WAF的工具
  10. 低功率、运动传感器 PYQ 1548/7659 特性及应用