📄 canvas.cpp
字号:
{
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 + -