?? 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 + -