Example #1
0
void Game_private::runAI() {
	printf("Thread AI run\n");
	mp_AI->RunAI(mp_chess);
	if (mp_AI->get_ans_tx()) { printf("电脑投降了\n"); gameWin(); return;  }
	mp_chess->setOneData(mp_AI->get_ans_x(), mp_AI->get_ans_y(), 2);
	int judge_ans = mp_chess->judge();
	if (judge_ans == 1) { gameWin(); return; }
	if (judge_ans == 2) { gameOver(); return; }
	mp_area->queue_draw();
	mp_area->setCanUserclick(true);
}
Example #2
0
void Game_private::usergo(int x, int y) {
	if (mp_chess->getData(x, y) != 0) return;
	mp_chess->setOneData(x, y, 1);
	mp_area->setCanUserclick(false);
	int judge_ans = mp_chess->judge();
	if (judge_ans == 1) { gameWin(); return; }
	if (judge_ans == 2) { gameOver(); return; }
	Glib::Threads::Thread::create( sigc::mem_fun(*this, &Game_private::runAI) );
}
// 每次鼠标事件后会发送这个信号来检查鼠标事件的结果
void BlockAreaCatch::checkIt(onePointPosition nowPosition) {
    if (frozon || mygame->map[nowPosition.x][nowPosition.y] == 0) {
        return;
    }
    if (oneReady == 0) {
        positionReady.x = nowPosition.x;
        positionReady.y = nowPosition.y;
        Block *readyBlock = static_cast<Block*>(gridLayout->itemAtPosition(positionReady.x, positionReady.y)->widget());
        onePointPosition pos = readyBlock->getNumber();
        int number = mygame->map[pos.x][pos.y];
        readyBlock->setPixmap(QPixmap(":/image/" + QString("%1").arg(myPicture[number]) + ".png"));
        oneReady = 1;
        return; //这个是没有block被选中的情况,先选中一个准备好
    }
    else {
        // 现在开始就是已经有一个被选中的情况了
        Block *targetBlock1 = static_cast<Block*>(gridLayout->itemAtPosition(positionReady.x, positionReady.y)->widget());
        Block *targetBlock2 = static_cast<Block*>(gridLayout->itemAtPosition(nowPosition.x, nowPosition.y)->widget());
        // 首先保证选中的两个数字都一样
        if (mygame->map[positionReady.x][positionReady.y] == mygame->map[nowPosition.x][nowPosition.y]) {
            // 然后排除掉同一个block点击两次的情况
            if (positionReady.x == nowPosition.x && positionReady.y == nowPosition.y) {
                originalState(targetBlock1);
                oneReady = 0;
            }
            else {
                clickState(targetBlock1);
                clickState(targetBlock2);
                mygame->map[positionReady.x][positionReady.y] = 0;
                mygame->map[nowPosition.x][nowPosition.y] = 0;
                oneReady = 0;
            }
        }
        else {
            originalState(targetBlock1);
            clickState(targetBlock2);
            positionReady.x = nowPosition.x;
            positionReady.y = nowPosition.y;
            oneReady = 1;
        }
    }
    if (mygame->end()) {
        timer.stop();
        frozon = true;
        emit gameWin();
    }
    return;
}