日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MFC随机博弈黑白棋

發布時間:2024/7/19 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MFC随机博弈黑白棋 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

隨機博弈黑白棋

隨機博弈黑白棋

TxyITxs | 隨機博弈黑白棋 | 2019.04.21

摘要

通過隨機落子,實現黑白棋的博弈。無任何落子規則,棋子死活與圍棋中棋子的死活一致,即存在至少一口氣。動態模擬雙方博弈,但棋盤無落子位置時停止。

設計思路

主要基于時鐘來實現動態博弈,考慮博弈的持續性數據修改,黑白雙方需要互斥訪問數據以及正確界面繪制,通過設置兩個時鐘,一個時鐘主要負責界面背景,棋盤網格,黑白棋子繪制,繪制完后,釋放數據使用權;另一個時鐘主要負責博弈落子(即修改數據),通過在可落子位置隨機選擇一個,然后釋放數據使用權。

棋盤數據使用N*N大小的一維數組Tdata存儲,棋子坐標(x,y)對應的數組通過x*N+y計算。棋盤所用可落子位置通過向量vector<CPoint>Tpos來存儲,通過隨機產生一個索引來得到一個落子位置,然后將該索引對應Tpos的位置刪除,修改Tdata中對應位置的值。

1. UI設計

1.1 利用基于對環框的MFC程序框架來搭建UI界面,主要涉及到界面背景色繪制,棋盤網格繪制,以及通過訪問數據繪制棋子。

1.2 棋盤背景繪制

void TChessBgUI(CClientDC *dc)

{

CPen pen(PS_SOLID, 1, RGB(0, 0, 0));

CBrush *pbrush = CBrush::FromHandle((HBRUSH)GetStockObject(GRAY_BRUSH));

dc->SelectObject(&pen);

dc->SelectObject(pbrush);

CRect bg;

GetClientRect(bg);

dc->FillRect(bg, pbrush);

}

1.3 棋盤網格繪制,繪制的起始位置CPoint Tst,繪制的結束位置CpointTed,網格間距Tchline,網格的大小N*N。

void TChessUI(CClientDC *dc)

{

CPen pen(PS_SOLID, 1, RGB(0, 0, 0));

dc->SelectObject(&pen);

for (int i = Tst.x; i <= Ted.x; i += Tchline)

{

dc->MoveTo(i, Tst.y);

dc->LineTo(i, Ted.y);

}?????????????

for (int j = Tst.y; j <= Ted.y; j += Tchline)

{

dc->MoveTo(Tst.x, j);

dc->LineTo(Ted.x, j);

}

}

?

1.4 繪制棋子

void TshowLayout(CClientDC *dc)

{

CPen pen(PS_SOLID, 1, RGB(0, 0, 0));

CBrush *pbrush = NULL;

dc->SelectObject(&pen);

int PieceSize = 10;

for (int i = 0; i < Tcount; i++)

{

for (int j = 0; j < Tcount; j++)

{

??????? if (Tdata[i*Tcount + j] ==1)

??????? {

?????????????? pbrush = CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH));

??????? dc->SelectObject(pbrush);

??????? dc->Ellipse(Tst.x+Tchline*i-PieceSize, Tst.y+Tchline *j- PieceSize, Tst.x + Tchline*i + PieceSize, Tst.y + Tchline *j + PieceSize);

??????? }

??????? if (Tdata[i*Tcount + j] == -1)

??????? {

?????????????? pbrush = CBrush::FromHandle((HBRUSH)GetStockObject(BLACK_BRUSH));

??????? dc->SelectObject(pbrush);

??????? dc->Ellipse(Tst.x + Tchline*i - PieceSize, Tst.y + Tchline *j - PieceSize, Tst.x + Tchline*i + PieceSize, Tst.y + Tchline *j + PieceSize);

??????? }

}

}

}

2.數據存儲

? 2.1 全局變量,需要初始化。

vector<int> Tdata;數值0、1、-1,0代表該位置為空,1代表白棋,-1代表黑棋

?????? vector<CPoint> Tpos;棋盤可落子位置

?????? int Tcount =19;棋盤大小

?????? int Tchline = 30;網格間距

?????? CPoint? Tst;棋盤起始位置

?????? CPoint Ted;1棋盤結束位置

?????? int Twhite = -1;先手指示器

?????? bool Ttime = false;時鐘調度指示器

3.博弈算法

3.1 隨機落子模擬

void SimulationData()

{

default_random_engine dre;//隨機數引擎

dre.seed((unsigned)time(NULL));

int pos = -1;

if(!Tpos.empty())

{

pos = dre() % Tpos.size();

if (Twhite==1)

{

??????? Tdata[Tpos[pos].x*Tcount + Tpos[pos].y] = 1;

??????? Twhite = -Twhite;//此時指示需提子的棋子顏色,以及下次落子的顏色

}

else if(Twhite == -1)

{

??????? Tdata[Tpos[pos].x*Tcount + Tpos[pos].y] = -1;

??????? Twhite = -Twhite;

}

Tpos.erase(Tpos.begin() + pos);

}

}

?

隨機索引位置的產生,利用C++ 11新特性,使用隨機數random類來產生,頭文件#include<random>。

?

?

?

3.2 ?提子過程,將棋盤上Twhite指示的棋子的死子提出,增加棋盤落子可用位置;

?

void grape()

{

if (Twhite == 0)return;

else

{

vector<CPoint> grap;

vector<bool> visi;

visi.resize(Tcount*Tcount, false);

grap.clear();

for (int i = 0; i < Tcount; i++)

{

??????? for (int j = 0; j < Tcount; j++)

??????? {

?????????????? if (Tdata[i*Tcount + j] == Twhite)

?????????????? {

???????????????????visi.resize(Tcount*Tcount, false);??

? ? ? ? ? ? ? ? ? ? if (TisLive(i, j,visi) == false)

????????????????????? ?????? grap.push_back(CPoint(i, j));

?????????????? }

??????? }

}

while (!grap.empty())

{

??????? CPoint p=grap.front();

??????? Tdata[p.x*Tcount+p.y] = 0;

??????? Tpos.push_back(p);

??????? grap.erase(grap.begin());

}

}

?}

?

3.3 提子過程需要判斷棋子的死活,利用深度搜索算法,判斷棋子s(x,y)的死活,則需判斷其四鄰接棋子的死活,若s,為活棋,無需提子,返回ture,若s為死棋,則返回false;通過遞歸來實現。

bool TisLive(unsigned int i, unsigned int j, vector<bool>& visi)

{

if (i<0 || i>Tcount || j<0 || j>Tcount)

?????? ?????? return false;

?????? else if (Tdata[i*Tcount + j] == -Twhite)

?????? {

????????????? return false;

?????? }

?????? else if (Tdata[i*Tcount + j] == 0)

?????? {

????????????? return true;

?????? }

?????? else if(Tdata[i*Tcount+j]==Twhite&&visi[i*Tcount + j]==false)

?????? {

????????????? visi[i*Tcount + j] = true;

????????????? if (TisLive(i - 1, j,visi))

return true;

????????????? if(TisLive(i, j - 1, visi))

?return true;

????????????? if(TisLive(i+1, j, visi))??

return true;

????????????? if(TisLive(i , j+ 1, visi))

?return true;

?????? }

??????

?? ??? ?else return false;
?? ??? ?return false;

????? }

3.4 onTimer函數

? ? ? ?在初始化函數中設置兩個時鐘;

???? ?SetTimer(0, 1000, NULL);
? ? ? SetTimer(1, 10, NULL);

? ? ? ?兩個時鐘總用一個onTimer,通過nIDEvent來識別執行此函數的時鐘。一個時鐘負責UI繪制,一個時鐘模擬數據變化。

void CWhiteBlackChessDlg::OnTimer(UINT_PTR nIDEvent)
{

?? ?CClientDC dc(this);
?? ?switch (nIDEvent)
?? ?{
?? ?case 0:
?? ?{
?? ??? ?if (Ttime)
?? ??? ?{?? ?
?? ??? ??? ??? ?SimulationData();
?? ??? ??? ??? ?grape();
?? ??? ??? ??? ?Ttime = false;
?? ??? ?}
?? ?}
?? ??? ?break;
?? ?case 1:
?? ?{?? ?
?? ??? ?
?? ??? ?if (!Ttime)
?? ??? ?{?? ??? ?
?? ??? ??? ?TChessBgUI(&dc);
?? ??? ??? ?TChessUI(&dc);
?? ??? ??? ?TshowLayout(&dc);
?? ??? ??? ?Ttime = true;?? ??? ?
?? ??? ??? ?if (Tpos.empty())
?? ??? ??? ?{
?? ??? ??? ??? ?KillTimer(0);?? ?
?? ??? ??? ??? ?KillTimer(1);
?? ??? ??? ?}
?? ??? ?}
?? ?}break;
?? ?default:break;
?? ?}
?? ?CDialogEx::OnTimer(nIDEvent);
}

?

3.5 初始化函數

void TInit()
?? ?{
?? ??? ?Tdata.resize(Tcount*Tcount,0);
?? ??? ?Tpos.resize(Tcount*Tcount);
?? ??? ?Tst.SetPoint(30, 30);
?? ??? ?Ted.SetPoint(Tchline * Tcount, Tchline * Tcount);
?? ??? ?for (int i = 0; i < Tcount; i++)
?? ??? ?{
?? ??? ??? ?for (int j = 0; j < Tcount; j++)
?? ??? ??? ??? ?Tpos[i*Tcount + j] = CPoint(i, j);
?? ??? ?}
?? ?}

總結

  • 在實踐過程中,動態模擬的持續性,采用面向過程的算法設計思路,常常導致程序阻塞,因為動態模擬需要使用循環,這可能導致數據一直動態修改,由于循環,導致無法執行到界面繪制代碼,界面的控制信息無法捕捉和執行,鑒于這種情況,可以采用時鐘或者多線程來實現。
  • UI界面采用了模塊化設計思路,對程序的復用提供了可能;
  • 可以利用該框架,重寫提子或落子函數,模擬自然界中的動態變化現象,可以通過直觀UI看到變化情況。
  • 目前程序尚不完善。
  • ?

    總結

    以上是生活随笔為你收集整理的MFC随机博弈黑白棋的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚州综合网 | 国产精品久久久久久久久久久新郎 | 日韩伦理av | 欧美 日韩 视频 | 秋霞影院午夜伦 | 男人天堂综合网 | 免费黄色在线看 | 欧美做受高潮中文字幕 | 天天干,夜夜操 | 生活片av| 黄色a毛片| 国产一级一片免费播放 | 国产美女无遮挡永久免费 | 亚洲欧美综合在线观看 | 国产99久久九九精品无码免费 | 人人超碰97| 在线视频导航 | 黑人黄色录像 | 天天干天天上 | 欧美一区二区三区久久 | 中文字幕有码在线播放 | 婷婷亚洲天堂 | 日韩欧美国产三级 | 无码人妻精品一区二区蜜桃色欲 | 成人欧美一级特黄 | 成年午夜视频 | 国际av在线| 色老妹 | 五月婷婷视频 | 在线播放网址 | 日韩精品电影在线 | www.国产.com | 三级三级久久三级久久18 | 好吊妞视频一区二区三区 | 久久精品国产亚洲AV成人雅虎 | 国产精品亚洲二区 | 成人午夜视频免费在线观看 | 国产高清免费在线播放 | 天天操天天干视频 | 国产精品久久中文字幕 | 久久桃花网| 精品国产影院 | 欧美性猛交xxxx偷拍洗澡 | 国产精品无码av在线有声小说 | 一级二级三级黄色片 | 好色成人网 | av在线浏览| 我和单位漂亮少妇激情 | 色骚综合| 国产欧美日韩精品在线观看 | 亚欧成人精品一区二区 | 欧美精品欧美精品系列 | 成人不卡av | 国产精品亚洲а∨天堂免在线 | 动漫艳母在线观看 | 99国产免费 | 在线国产观看 | 国产成人精品视频 | sese久久 | 中文字幕无码精品亚洲资源网久久 | 最近中文字幕在线中文高清版 | 亚洲日本一区二区 | 青青青在线观看视频 | 色偷偷免费费视频在线 | 日韩三级视频在线观看 | 一色桃子juy758在线播放 | 久草网址| 天天干夜夜夜 | 亚洲欧美一区二区三区在线观看 | 久久综合久久鬼色 | 天天躁日日躁狠狠躁av麻豆 | 国产精品二区一区二区aⅴ 一卡二卡三卡在线观看 | 岛国午夜视频 | 翔田千里在线播放 | 欧美顶级毛片在线播放 | 男人的天堂av网 | 亚洲乱色| 国产精品一区二区三区不卡 | 国产美女久久久久 | 精品美女久久久 | 亚洲色图综合 | 国产精品视频无码 | 久久99久久99| 男男play视频 | 欧美日一区二区三区 | 色女人天堂 | 乱熟女高潮一区二区在线 | 天天噜夜夜噜 | 99视频网站 | 女人脱了内裤趴开腿让男躁 | 中文字幕在线观看播放 | 少妇精品视频一区二区 | 97香蕉碰碰人妻国产欧美 | 日韩成人av片 | 最好看的日本字幕mv视频大全 | 天堂av资源| 91精品一区| 亚洲综合三区 | 蜜桃成熟时李丽珍在线观看 |