📄 canvas.cpp
字号:
#include <stdlib.h>
#include <stdio.h>
#include <QPainter>
#include <QtGui>
#include "canvas.h"
int dx[4]={0,0,-1,1}; //四种移动方向对x和y坐标的影响
int dy[4]={-1,1,0,0};
Canvas::Canvas(QWidget *parent)
: QWidget(parent)
{
setPalette(QPalette(QColor(255,255,255)));
setAutoFillBackground(true);
loadLevel();
QRadialGradient radialGradient(20, 20, 20, 20, 20);
radialGradient.setColorAt(0.0, Qt::white);
radialGradient.setColorAt(0.2, Qt::green);
radialGradient.setColorAt(1.0, Qt::black);
this->brush = radialGradient;
update();
}
Canvas::~Canvas()
{
}
int Canvas::intDegree = 1;
int Canvas::intDx = 3;
/**
* 设置游戏的难度
*
* @param d int
*/
const void Canvas::setDegree ( int d ) {
intDegree = d ;
switch ( intDegree ) {
case 1:
intDx = 3 ;
break ;
case 2:
intDx = 5 ;
break ;
case 3:
intDx = 7 ;
break ;
}
//System.out.println("intDegree is:"+intDegree+" intDx is:"+intDx);
}
void Canvas::loadLevel()
{
initializeGame () ; //初始化游戏各参数
intSuc = 0 ; //连续消球的次数
intAfPos_x = -1 ; //按下选择键后光标位置的x坐标、y坐标
intAfPos_y = -1 ;
intPrPos_x = 4 ; //当前光标位置的x坐标、y坐标
intPrPos_y = 4 ;
for ( int i = 0 ; i < 5 ; i++ ) {
int c = makeBall () ;
int z = makeCoor () ;
int x = z / 9 ;
int y = z % 9 ;
setDose ( c , x , y ) ;
}
isChoice = false ;
isOver = false ;
for ( int i = 0 ; i < 3 ; i++ ) {
intSugges[i] = makeBall () ;
}
}
/**初始化游戏数据*/
const void Canvas::initializeGame () {
initializeBoard () ;
intReward = 0 ;
intReDis = 0 ;
intAlDis = 0 ;
intEmpty = 81 ;
GameTimer = 0;
isChoice = false;
Str_Pos = QString("");
setInitTest();
}
/**初始化棋盘,将所有棋盘格清空*/
const void Canvas::initializeBoard () {
for ( int i = 0 ; i < 9 ; i++ ) {
for ( int j = 0 ; j < 9 ; j++ ) {
intBallColour[ i ][ j ] = 0 ;
}
}
}
/**
* 随机返回1种颜色的代码(1~7)
*
* @return 返回int
*/
const int Canvas::makeBall () {
//int i = 1;
int i = ( rand () % intDx ) + 1 ;
return i ;
}
/**
* 随机返回一个整数,这个整数=没有球的棋盘格的x坐标×9+y坐标
*
* @return 返回int
*/
const int Canvas::makeCoor () {
int i ;
int x , y ;
do {
i = ( rand () % 81 ) ;
x = i / 9 ;
y = i % 9 ;
} while ( intBallColour[ x ][ y ] != 0 ) ;
intEmpty-- ; //棋盘上没有小球的空地个数
return i ;
}
/**
* 设置一个棋盘格内小球的颜色
*
* @param c int 小球的颜色
* @param x int 小球的x坐标
* @param y int 小球的y坐标
*/
const void Canvas::setDose ( int c , int x , int y )
{
intBallColour[ x ][ y ] = c ;
}
/**
* 返回指定的棋盘格内小球颜色
*
* @param x int 指定的棋盘格x坐标
* @param y int 指定的棋盘格y坐标
* @return int 棋盘格内小球的颜色
*/
const int Canvas::getBallColour ( int x , int y )
{
return intBallColour[ x ][ y ] ;
}
void Canvas::setInitTest()
{
MaxAct=4; //移动方向总数
//Table[9][9]={0}; //是否已到过
for(int i = 0 ; i < 9 ; i ++)
for(int j=0; j < 9; j ++)
Table[i][j] = 0;
Level=-1; //第几步
LevelComplete=0; //这一步的搜索是否完成
AllComplete=0; //全部搜索是否完成
//Act[1000]={0}; //每一步的移动方向,搜索1000步
for(int i=0;i<1000;i++)
Act[i]=0;
x=0,y=0; //现在的x和y坐标
TargetX=0,TargetY=0; //目标x和y坐标
TestPassOver = false;
}
bool Canvas::TestMain(int Ox,int Oy,int Tx,int Ty)
{
x = Ox;
y = Oy;
TargetX = Tx;
TargetY = Ty;
Table[x][y]=1; //做已到过标记
while (!AllComplete) //是否全部搜索完
{
Level++;LevelComplete=0; //搜索下一步
while (!LevelComplete)
{
Act[Level]++; //改变移动方向
if (ActOK( )) //移动方向是否合理
{
Test( ); //测试是否已到目标
LevelComplete=1; //该步搜索完成
}
else
{
if (Act[Level]>MaxAct) //已搜索完所有方向
Back( ); //回上一步
if (Level<0) //全部搜索完仍无结果
{
TestPassOver = false;
LevelComplete=AllComplete=1; //退出
}
}
}
}
return TestPassOver;
}
void Canvas::Test( )
{
if ((x==TargetX)&&(y==TargetY)) //已到目标
{
TestPassOver = true;
//for (int i=0;i<=Level;i++)
//Act[i]=0;
//cout<<(int)Act[i]; //输出结果
LevelComplete=AllComplete=1; //完成搜索
}
}
int Canvas::ActOK( )
{
int tx=x+dx[Act[Level]-1]; //将到点的x坐标
int ty=y+dy[Act[Level]-1]; //将到点的y坐标
if (Act[Level]>MaxAct) //方向错误?
return 0;
if ((tx>=9)||(tx<0)) //x坐标出界?
return 0;
if ((ty>=9)||(ty<0)) //y坐标出界?
return 0;
if (Table[ty][tx]==1) //已到过?
return 0;
if (intBallColour[ty][tx]!=0) //有障碍?
return 0;
x=tx;
y=ty; //移动
Table[y][x]=1; //做已到过标记
return 1;
}
void Canvas::Back( )
{
x-=dx[Act[Level-1]-1];
y-=dy[Act[Level-1]-1]; //退回原来的点
Table[y][x]=0; //清除已到过标记
Act[Level]=0; //清除方向
Level--; //回上一层
}
void Canvas::setBrush(const QBrush &brush)
{
this->brush = brush;
update();
}
void Canvas::setPen(const QPen &pen)
{
this->pen = pen;
update();
}
void Canvas::setCurBrush( int colour )
{
QRadialGradient curBrush(20, 20, 20, 20, 20);
switch(colour)
{
case 1:
curBrush.setColorAt(0.0, Qt::white);
curBrush.setColorAt(0.2, Qt::green);
curBrush.setColorAt(1.0, Qt::black);
break;
case 2:
curBrush.setColorAt(0.0, Qt::white);
curBrush.setColorAt(0.2, Qt::red);
curBrush.setColorAt(1.0, Qt::black);
break;
case 3:
curBrush.setColorAt(0.0, Qt::white);
curBrush.setColorAt(0.2, Qt::blue);
curBrush.setColorAt(1.0, Qt::black);
break;
case 4:
curBrush.setColorAt(0.0, Qt::white);
curBrush.setColorAt(0.4, Qt::green);
curBrush.setColorAt(1.0, Qt::black);
break;
case 5:
curBrush.setColorAt(0.0, Qt::white);
curBrush.setColorAt(0.4, Qt::red);
curBrush.setColorAt(1.0, Qt::black);
break;
case 6:
curBrush.setColorAt(0.0, Qt::white);
curBrush.setColorAt(0.4, Qt::blue);
curBrush.setColorAt(1.0, Qt::black);
break;
case 7:
curBrush.setColorAt(0.0, Qt::white);
curBrush.setColorAt(0.6, Qt::green);
curBrush.setColorAt(1.0, Qt::black);
break;
}
setBrush(curBrush);
}
//void Canvas::mouseMoveEvent(QMouseEvent *event)
//{
// QString str = QString( "x=%1, y=%2" ).arg( event->x() ).arg( event->y() );
//}
void Canvas::mouseDoubleClickEvent(QMouseEvent *event )
{
Str_Pos = QString( "x=%1, y=%2" ).arg( event->x() ).arg( event->y() );
}
void Canvas::mousePressEvent ( QMouseEvent *event )
{
Str_Pos = QString( "x=%1, y=%2" ).arg( event->x() ).arg( event->y() );
intPrPos_x = event->x() / 30;
intPrPos_y = event->y() / 30;
intPrPos_c = getBallColour(intPrPos_x, intPrPos_y);//获取按下选择键时,当前光标处小球的颜色
if (intPrPos_c != 0 && isChoice == false) //当前光标处有小球,则让这个小球开始闪烁,并将这个格清为空格
{
intAfPos_x = intPrPos_x;
intAfPos_y = intPrPos_y;
intAfPos_c = intPrPos_c;
intChoice = intPrPos_c;
isChoice = true;
setDose(0, intAfPos_x, intAfPos_y);
}
else if (intPrPos_c != 0 && isChoice == true )
{
isChoice = false;
setDose(intAfPos_c, intAfPos_x, intAfPos_y);
}
else if(intPrPos_c == 0 && isChoice == true)//有小球在闪烁,则将闪烁的小球移动到当前位置
{
if(intAfPos_x==intPrPos_x&&intAfPos_y==intPrPos_y)
{
isChoice = false;
setDose(intAfPos_c, intAfPos_x, intAfPos_y);
return;
}
setInitTest();
isChoice = false;
intAfPos_c = intChoice;
if(!TestMain(intAfPos_x,intAfPos_y,intPrPos_x,intPrPos_y)){
setDose(intAfPos_c, intAfPos_x, intAfPos_y);
return;
}
else
setDose(intAfPos_c, intPrPos_x, intPrPos_y);
setInitTest();
int iR = caReward(intPrPos_x, intPrPos_y);//当小球移动到目的地后,计算相关得分
if (iR != 0) //如果得到奖分,累计一次消球成功,并把得分加到总分里
{
intSuc++;
setReward(intSuc, iR);
}
else
{
/**如果没有得到奖分,将累计的消球成功次数清零
* 将三个提示球随机的放入棋盘
* 如果放入棋盘的提示球很巧合的得到了奖分
* 累计一次消球,并把得分加入总分
* 再随机生成三个小球,放入提示球数组
* 如果棋盘空位置没有了,则游戏结束
*/
intSuc = 0;
for (int i = 0; i < 3; i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -