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); }
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; }