⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 canvas.cpp

📁 这是学习QT的好代码啊
💻 CPP
📖 第 1 页 / 共 2 页
字号:
            {
                if (getEmpty() > 0) 
                {
                    int z = makeCoor();
                    setDose(intSugges[i], z / 9, z % 9);
                    int iRe = caReward(z / 9, z % 9);
                    if (iRe != 0) 
                    {
                        intSuc++;
                        setReward(intSuc, iRe);
                    }
                    intSugges[i] = makeBall();
                }
                else 
                {
                    //overGame();
                    break;
                }
            }
            if (getEmpty() <= 0) 
            {
                //overGame();
            }
        }
    }
}

void Canvas::paintEvent(QPaintEvent * /* event */)
{
    const int SIZE = 30;
    GameTimer ++ ;
    //const int NUM  = 9;   
    QRect background(1,1,width()-1,height()-1);
    
    QRect rect(2,2,28,28);
    
    QPainter painter(this);
    
    if ( isChoice )
        if(GameTimer % 5 == 0)
        {
            painter.save();
            painter.translate(intAfPos_x * SIZE, intAfPos_y * SIZE);
            setCurBrush(intBallColour[ intAfPos_x ][ intAfPos_y ]);
            painter.setBrush(brush);
            painter.drawEllipse(rect);
            painter.restore();
        }
    
    for(int x = 0; x  < 9; x++){
        for(int y = 0; y  < 9; y++){
            painter.save();
            painter.translate(x * SIZE, y * SIZE);
            painter.drawLine(background.topLeft(), background.topRight());
            painter.drawLine(background.topLeft(), background.bottomLeft());
            if(intBallColour[ x ][ y ] !=0)
            {
                setCurBrush(intBallColour[ x ][ y ]);
                painter.setBrush(brush);
                painter.drawEllipse(rect);
                //printf("Colour is : %d .\n",intBallColour[ x ][ y ]);
            }
            //painter.setPen(pen);
            painter.drawText(5, 20,
                     tr("") + QString::number(intBallColour[ x ][ y ]) + tr("-")+QString::number(Table[x][y]) );
            painter.restore();
        }
    }
    
    //painter.drawText(10, 30,
//                     tr("intPrPos_x = ") + QString::number(intPrPos_x));
//    painter.drawText(10, 50,
//                     tr("intPrPos_y = ") + QString::number(intPrPos_y));

//    painter.drawText(10, 10,
//                     tr("width = ") + QString::number(width()));
//    painter.drawText(10, 30,
//                     tr("height = ") + QString::number(height()));
//                
//    painter.drawText(10, 50,
//                     tr("random = ") + QString::number(rand()%10));

    painter.setPen(pen);
    painter.drawLine(background.topLeft(), background.topRight());
    painter.drawLine(background.topLeft(), background.bottomLeft());
    painter.drawLine(background.bottomLeft(), background.bottomRight());
    painter.drawLine(background.topRight(), background.bottomRight());
    
}

/**
* 总分数
*
* @param i int 连续消球的次数
* @param j int 本次消球的奖分
*/
const void Canvas::setReward ( int i , int j ) {
    intReward = intReward + j * i ;
}

 /**
 * 计算分数
 *
 * @param x int 小球移动的最后位置的x坐标
 * @param y int 小球移动的最后位置的y坐标
 * @return int  移动这个小球带来的奖分
 */
 const int Canvas::caReward ( int x , int y ) {
     int iN = 0 ; //一条直线上颜色相同的小球的个数
     int iNl ; //半条直线上颜色相同的小球的个数
     int iNr ; //半条直线上颜色相同的小球的个数
     int iR = 0 ; //本次消球的总得分
     int iS = 0 ; //同时消球的组数
     //计算左斜线上的得分
     iN = 1 ; //将个数清零
     intNum = 0 ;
     up_left ( x , y ) ;
     iN += intNum ;
     iNl = intNum ;
     intNum = 0 ;
     down_right ( x , y ) ;
     iN += intNum ;
     iNr = intNum ;
     if ( iN >= 5 ) 
     {
         iR += ( iN * ( iN - 4 ) ) ; //左斜线上的得分
         iS++ ;
         //将消掉的小球的棋盘格清零
         for ( int i = 1 ; i <= iNl ; i++ ) 
         {
             setDose ( 0 , x - i , y - i ) ;
             intEmpty++ ;
         }
         for ( int i = 1 ; i <= iNr ; i++ ) 
         {
             setDose ( 0 , x + i , y + i ) ;
             intEmpty++ ;
         }
     }
     //计算右斜线上的得分
     iN = 1 ;
     intNum = 0 ;
     up_right ( x , y ) ;
     iN += intNum ;
     iNl = intNum ;
     intNum = 0 ;
     down_left ( x , y ) ;
     iN += intNum ;
     iNr = intNum ;
     if ( iN >= 5 ) 
     {
         iR += ( iN * ( iN - 4 ) ) ; //右斜线上的得分
         iS++ ;
         for ( int i = 1 ; i <= iNl ; i++ ) 
         {
             setDose ( 0 , x + i , y - i ) ;
             intEmpty++ ;
         }
         for ( int i = 1 ; i <= iNr ; i++ ) 
         {
             setDose ( 0 , x - i , y + i ) ;
             intEmpty++ ;
         }
     }
     //计算横线上的得分
     iN = 1 ;
     intNum = 0 ;
     left ( x , y ) ;
     iN += intNum ;
     iNl = intNum ;
     intNum = 0 ;
     right ( x , y ) ;
     iN += intNum ;
     iNr = intNum ;
     if ( iN >= 5 ) 
     {
         iR += ( iN * ( iN- 4 ) ) ; //横线上的得分
         iS++ ;
         for ( int i = 1 ; i <= iNl ; i++ ) 
         {
             setDose ( 0 , x - i , y ) ;
             intEmpty++ ;
         }
         for ( int i = 1 ; i <= iNr ; i++ ) 
         {
             setDose ( 0 , x + i , y ) ;
             intEmpty++ ;
         }
     }
     //计算竖线上的得分
     iN = 1 ;
     intNum = 0 ;
     up ( x , y ) ;
     iN += intNum ;
     iNl = intNum ;
     intNum = 0 ;
     down ( x , y ) ;
     iN += intNum ;
     iNr = intNum ;
     if ( iN >= 5 ) 
     {
         iR += ( iN * ( iN - 4 ) ) ; //竖线上的得分
         iS++ ;
        for ( int i = 1 ; i <= iNl ; i++ ) 
        {
            setDose ( 0 , x , y - i ) ;
            intEmpty++ ;
        }
        for ( int i = 1 ; i <= iNr ; i++ ) 
        {
            setDose ( 0 , x , y + i ) ;
            intEmpty++ ;
        }
     }
     iR = iR * iS ;
     if ( iR != 0 ) {
        setDose ( 0 , x , y ) ;
        intEmpty++ ;
     }
     return iR ;
 }
 
 /**
 * 检查左上方格内球的颜色是否相同
 *
 * @param x int
 * @param y int
 */
 const void Canvas::up_left ( int x , int y ) 
 {
    int se = getBallColour ( x , y ) ;
    if ( ( x - 1 >= 0 ) && ( y - 1 >= 0 ) ) 
    {
        if ( getBallColour ( x - 1 , y - 1 ) == se ) 
        {
            intNum++ ;
            up_left ( x - 1 , y - 1 ) ;
        }
    }
 }
 
 /**
 * 检查右下方格内球的颜色是否相同
 *
 * @param x int
 * @param y int
 */
 const void Canvas::down_right ( int x , int y ) 
 {
    int se = getBallColour ( x , y ) ;
    if ( ( x + 1 <= 8 ) && ( y + 1 <= 8 ) ) 
    {
        if ( getBallColour ( x + 1 , y + 1 ) == se ) 
        {
            intNum++ ;
            down_right ( x + 1 , y + 1 ) ;
        }
    }
 }
 
 /**
     * 检查右上方格内球的颜色是否相同
     *
     * @param x int
     * @param y int
     */
    const void Canvas::up_right ( int x , int y ) {
        int se = getBallColour ( x , y ) ;
        if ( ( x + 1 <= 8 ) && ( y - 1 >= 0 ) ) {
            if ( getBallColour ( x + 1 , y - 1 ) == se ) {
                intNum++ ;
                up_right ( x + 1 , y - 1 ) ;
            }
        }
    }
    
    /**
     * 检查左下方格内球的颜色是否相同
     *
     * @param x int
     * @param y int
     */
    const void Canvas::down_left ( int x , int y ) {
        int se = getBallColour ( x , y ) ;
        if ( ( x - 1 >= 0 ) && ( y + 1 <= 8 ) ) {
            if ( getBallColour ( x - 1 , y + 1 ) == se ) {
                intNum++ ;
                down_left ( x - 1 , y + 1 ) ;
            }
        }
    }
    
    /**
     * 检查左方格内球的颜色是否相同
     *
     * @param x int
     * @param y int
     */
    const void Canvas::left ( int x , int y ) {
        int se = getBallColour ( x , y ) ;
        if ( x - 1 >= 0 ) {
            if ( getBallColour ( x - 1 , y ) == se ) {
                intNum++ ;
                left ( x - 1 , y ) ;
            }
        }
    }

    /**
     * 检查右方格内球的颜色是否相同
     *
     * @param x int
     * @param y int
     */
    const void Canvas::right ( int x , int y ) {
        int se = getBallColour ( x , y ) ;
        if ( x + 1 <= 8 ) {
            if ( getBallColour ( x + 1 , y ) == se ) {
                intNum++ ;
                right ( x + 1 , y ) ;
            }
        }
    }

    /**
     * 检查上方格内球的颜色是否相同
     *
     * @param x int
     * @param y int
     */
    const void Canvas::up ( int x , int y ) {
        int se = getBallColour ( x , y ) ;
        if ( y - 1 >= 0 ) {
            if ( getBallColour ( x , y - 1 ) == se ) {
                intNum++ ;
                up ( x , y - 1 ) ;
            }
        }
    }

/**
* 检查下方格内球的颜色是否相同
*
* @param x int
* @param y int
*/
const void Canvas::down ( int x , int y ) 
{
    int se = getBallColour ( x , y ) ;
    if ( y + 1 <= 8 ) {
        if ( getBallColour ( x , y + 1 ) == se ) 
        {
            intNum++ ;
            down ( x , y + 1 ) ;
        }
    }
}

/**
* 返回棋盘上没有小球的空棋盘格的数量
*
* @return int
*/
const int Canvas::getEmpty () {
    return intEmpty ;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -