這期內容當中小編將會給大傢帶來有關利用Qt實現壹個簡單的五子棋小遊戲,文章內容豐富且以專業的角度為大傢分析和敘述,閱讀完這篇文章希望大傢可以有所收穫。
下圖為遊戲主窗口頁麵:
第壹步:窗口繪圖的實現(QPaintEvent繪圖事件 和 QMouseEvent鼠標事件)
①鼠標事件(這里我的是mouseDoubleClickEvent()雙擊事件)
void GamePage::mouseDoubleClickEvent(QMouseEvent *event)//鼠標雙擊事件
{
m_dx = event->x();
m_dy = event->y();
//避免亂點時存入坐標 需添加:標誌符--》game狀態 坐標的界限(點)
if(m_dx < POINT_X_MAX && m_dy < POINT_Y_MAX && m_bRunState == true)
{
//如果點在交叉點周圍則設置點在交叉點上(判斷點位置)
QPointF newPoint(gainPointPosition(QPointF(m_dx,m_dy)));
if(!m_VectorRedPoint.contains(newPoint) &&
!m_VectorBlackPoint.contains(newPoint))//判斷點是否已經存在
{
if(m_iFlagWho == 0)//紅棋
{
m_VectorRedPoint.append(newPoint);
m_iFlagWho = 1;
}
else//黑棋
{
m_VectorBlackPoint.append(newPoint);
m_iFlagWho = 0;
}
}
}
}
在這里窗口網格圖是通過直接繪畫以及鼠標雙擊選擇坐標來存儲棋子和繪畫棋子,因此對點進行了壹個設置位置函數以便處於兩線之間的交接處,代碼如下:.
領Qt學習資料→
QPointF GamePage::gainPointPosition(QPointF srcPoint)//返回壹個處於格子兩線交接處的坐標點
{
QPointF tmp;
for(int i = 0;i < 12;i++)
{
if(srcPoint.x() >= 50*i && srcPoint.x() <= (50*i+25))//X判斷
{
tmp.setX(50*i);//如果處於50*i ~ 50*i+25)之間則設置點坐標點為50*i
}
else if (srcPoint.x() >= (50*i + 25) && srcPoint.x() <= 50*(i+1))
{
tmp.setX(50*(i+1));//如果處於50*i+25 ~ 50*(i+1)之間則設置點坐標點為50*(i+1)
}
if(srcPoint.y() >= 50*i && srcPoint.y() <= (50*i+25))//Y判斷
{
tmp.setY(50*i);//同上
}
else if (srcPoint.y() >= (50*i + 25) && srcPoint.y() <= 50*(i+1))
{
tmp.setY(50*(i+1));//同上
}
}
return tmp;
}
②繪圖事件( 主要是網格圖、黑棋、紅棋的繪畫 )
棋子坐標的存儲主要是通過QVector容器來實現,並對容器進行叠代循環繪圖,實現代碼如下:
void GamePage::paintEvent(QPaintEvent *event)//繪畫事件
{
QPainter *pater = new QPainter(this);
pater->begin(this);
//網格圖
pater->setPen(Qt::black);
for(int i = 0;i <= 12;i++)
{
pater->drawLine(0,50*i,600,50*i);
pater->drawLine(50*i,0,50*i,600);
}
//紅色棋繪畫
QVector::iterator iter;
for(iter = m_VectorRedPoint.begin();iter != m_VectorRedPoint.end();iter++)
{
pater->setBrush(QBrush(Qt::red, Qt::SolidPattern));
pater->setPen(Qt::red);
pater->drawEllipse(*iter,15,15);
}
//黑色棋繪畫
QVector::iterator iter1;
for(iter1 = m_VectorBlackPoint.begin();iter1 != m_VectorBlackPoint.end();iter1++)
{
pater->setBrush(QBrush(Qt::black, Qt::SolidPattern));
pater->setPen(Qt::black);
pater->drawEllipse(*iter1,15,15);
}
pater->end();
update();
}
第二步:輸贏的計算
上圖列出了計算的關係規律,下麵就用代碼分別實現三個不同方向的計算:
①橫向
bool GamePage::checkXPointF(QVector vector) //檢查X軸方向的
{
int num_L= 1;
int num_R = 1;
QVector::iterator iter;
QVector::iterator itertmp;
for(iter = vector.begin();iter != vector.end();iter++)
{
QPointF tmp = *iter;
for(int k = 1;k < 5;k++)//左方向的查找
{
for(itertmp = vector.begin();itertmp != vector.end();itertmp++)
{
qDebug()<<*itertmp<<"X compare"<②縱向(與橫向同理)
bool GamePage::checkYPointF(QVector vector)
{
qDebug()<<"enter Y***************";
int num_U = 1;
int num_D = 1;
QVector::iterator iter;
QVector::iterator itertmp;
for(iter = vector.begin();iter != vector.end();iter++)
{
QPointF tmp = *iter;
for(int k = 1;k < 5;k++)//上
{
for(itertmp = vector.begin();itertmp != vector.end();itertmp++)
{
qDebug()<<*itertmp<<"Y compare"<③斜向(從上圖可知,以坐標係為例,分為四個象限的計算和計數來判斷是否達到要求)
int GamePage::findSeriesPointF(bool flag, QPointF tmp, QVector vector)
{
bool flag_iter = false;
int forward_count = 1;//壹象限的數量
int reverse_count = 1;
int forward_count2 = 1;
int reverse_count2 = 1;
QVector::iterator iter= vector.begin();
while(iter != vector.end())
{
qDebug()<<*iter<<"compare"<以上橫、縱、斜三個方向的運算都是通過最簡單的算法是實現,易於理解。
④定時器實現紅黑旗的定時檢查功能
void GamePage::slotCheckWhetherWin()//定時器檢查是否輸贏功能
{
m_pVerVector.clear();
m_pVerVectorB.clear();
m_pHerVector.clear();
m_pHerVectorB.clear();
QVector::iterator iterRed;
for(iterRed = m_VectorRedPoint.begin();iterRed != m_VectorRedPoint.end();iterRed++)
{
qDebug()<<*iterRed;
}
QVector tmpRed = m_VectorRedPoint;
//紅棋判斷
if(m_VectorRedPoint.size() >= 5)
{
for(iterRed = m_VectorRedPoint.begin();iterRed != m_VectorRedPoint.end();iterRed++)
{
QPointF tmp = *iterRed;//獲取第壹個點
qDebug()<<"tmp:"<::iterator itertmp;
for(itertmp = tmpRed.begin();itertmp != tmpRed.end();itertmp++)
{
qDebug()<<"tmpRed:"<<*itertmp;
//橫向連續5個點
if((*itertmp).y() - tmp.y() >= -0.000001 && (*itertmp).y() - tmp.y() <= 0.000001)//先判斷y是同壹坐標
{
m_pHerVector.append(*itertmp);
}
//縱向連續5個點
if((*itertmp).x() - tmp.x() >= -0.000001 && (*itertmp).x() - tmp.x() <= 0.000001)//先判斷y是同壹坐標
{
m_pVerVector.append(*itertmp);
}
}
//對容器進行操作
if(checkXPointF(m_pHerVector) || checkYPointF(m_pVerVector))
{
QMessageBox::warning(nullptr,"warning","紅方XY贏了!");
m_ptimer->stop();
return;
}
else
{
m_pHerVector.clear();//清空
m_pVerVector.clear();//清空
count = 0;
}
//其他都是斜向
if(findSeriesPointF(true,tmp,m_VectorRedPoint) == 5)
{
QMessageBox::warning(nullptr,"warning","紅方斜線贏了!");
m_ptimer->stop();
return;
}
}
}
//黑棋判斷
QVector::iterator iterBlack;
QVector tmpBlack = m_VectorBlackPoint;
if(m_VectorBlackPoint.size() >= 5)
{
for(iterBlack = m_VectorBlackPoint.begin();iterBlack != m_VectorBlackPoint.end();iterBlack++)
{
QPointF tmp = *iterBlack;//獲取第壹個點
qDebug()<<"tmp:"<::iterator itertmp;
for(itertmp = tmpBlack.begin();itertmp != tmpBlack.end();itertmp++)//正向
{
qDebug()<<"tmpRed:"<<*itertmp;
//橫向連續5個點
if((*itertmp).y() - tmp.y() >= -0.000001 && (*itertmp).y() - tmp.y() <= 0.000001)//先判斷y是同壹坐標
{
m_pHerVectorB.append(*itertmp);
}
//縱向連續5個點
if((*itertmp).x() - tmp.x() >= -0.000001 && (*itertmp).x() - tmp.x() <= 0.000001)//先判斷y是同壹坐標
{
m_pVerVectorB.append(*itertmp);
}
}
//對容器進行操作
if(checkXPointF(m_pHerVectorB) || checkYPointF(m_pVerVectorB))
{
QMessageBox::warning(nullptr,"warning","黑方XY贏了!");
m_ptimer->stop();
return;
}
else
{
m_pHerVectorB.clear();//清空
m_pVerVectorB.clear();//清空
count = 0;
}
//其他都是斜向
if(findSeriesPointF(true,tmp,m_VectorBlackPoint) == 5)
{
QMessageBox::warning(nullptr,"warning","黑方斜線贏了!");
m_ptimer->stop();
return;
}
}
}
}
IT之傢 5 月 20 日消息,今年 4 月,AMD 推出了 Ryzen 7 7800X3D CPU,這款處理器在上市第二個月就打破了德國 Mindfactory 平臺的銷售記錄。
AMD Ryzen 7 7800X3D 非常受歡迎,最新的 3D V-Cache CPU 銷量幾乎是 5800X3D 的兩倍。
根據 TechEpiphany 分享的統計數據,AMD Ryzen 7 7800X3D 在德國零售商 MindFactory 的銷量達到了 4720 顆。相比之下,AMD Ryzen 7 5800X3D 僅售出 2510 顆,這隻比 7800X3D 的壹半稍多壹點。
目前,AMD Ryzen 7 7800X3D 3D V-Cache CPU 定價為 449 美元(IT之傢備註:當前約 3152 元人民幣),與 Ryzen 7 5800X3D 基本持平。
除此之外,英特爾酷睿 i9-13900K 得益於其不錯的遊戲性能,哪怕定價高達 550 美元以上,但仍然不斷可以蠶食 7950X3D 和 7900X3D 的銷量。這迫使更高核心數的 3D V-Cache 處理器進行降價,而 AMD Ryzen 7 7800X3D 則由於太受歡迎沒有出現類似的降價。
從美國壹些零售商銷量榜來看,AMD Ryzen 7 7800X3D 銷量不及酷睿 i9-13900K 和 i7-13700K,甚至還不如 R7 5700X 和 R5 5600 等舊型號。
作者:admin | 分類:淘寶保險 | 瀏覽:11 | 迴響:0