1. 程式人生 > >visual stdio2017 MFC自制五子傻瓜棋^_^

visual stdio2017 MFC自制五子傻瓜棋^_^

1.首先在visual stdio2017中建立一個MFC的單文件(目前還不清楚為什麼不用多文件),然後其他的預設就好了,不需要改什麼。
2.其次在原始檔中找到(你建立的MFC的名字)view.cpp裡面的on draw(CDC *),左鍵單擊後,視窗就會自動跳轉到這個函式。
在這裡插入圖片描述
3.現在用on draw(CDC *)畫五子棋棋盤(這裡需要了解lineto()和moveto()這兩個函式的用法)。下面給出畫棋盤的程式碼(僅供參考):
pDC->MoveTo(50, 50);
for (int i = 50; i <=800;)
{
pDC->LineTo(i, 550);
pDC->MoveTo(i + 50, 50);
i += 50;
}
pDC->MoveTo(50, 50);
for (int j = 50; j <= 800;)
{
pDC->LineTo(800, j);
pDC->MoveTo(50, j + 50);
j += 50;
}
4.執行之後效果就是這樣醜醜的,沒有背景的樣子。在這裡插入圖片描述

5.為了讓他富有詩意,下面來為其新增背景(這裡涉及到文字圖片的一些知識):
a.將滑鼠移至原始檔處,單擊右鍵,新增->資源->Bitmap,然後點選旁邊的匯入,再選擇你想插入的圖片即可(強調一下:這裡圖片的格式只能選擇bmp型別的,如果事png之類的,可以點選滑鼠右鍵選擇編輯,然後再另存為,選擇bmp格式即可)。
b.然後需要輸入程式碼把匯入的圖片插程序序裡面了,這裡我就只給出程式碼了:
CBitmap Bitmap;
Bitmap.LoadBitmap(IDB_BITMAP1);
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
CBitmap *OldBitmap = MemDC.SelectObject(&Bitmap);
BITMAP bm;
Bitmap.GetBitmap(&bm);
pDC->BitBlt(0, 0, 1000, 1000, &MemDC, 0, 0, SRCCOPY);
pDC->SelectObject(OldBitmap);

6.All Right!接下來就是讓電腦落子階段了。
a.這裡我們需要用到Buttonlup和Buttonldown來傳入左擊滑鼠的資訊(注意:這裡的操作和vc6.0有點差別),將滑鼠移至原始檔然後右擊,選擇類嚮導,裡面有一項訊息,下面就是很多可以用的函式,我們在裡面找到Buttonlup和Buttonldown,然後新增,就可以在最下面找到這兩個函數了。
b.先明白兩個函式 GetCursorPos(&pt), ScreenToClient(&pt),第一個函式主要是用來得到滑鼠的位置並把位置儲存在pt裡面(前面已經用Point定義了pt),第二個函式是把螢幕切換成使用者的螢幕(簡而言之:就是獲取用的螢幕座標,不然的話你滑鼠點在一個地方的時候,顯示的東西總會是在你滑鼠下面某個距離處)。
c.然後就是要畫圓嘛,然後還要填充圓(這裡涉及到了如何使用畫筆和筆刷)
CBrush BrushNew1;
CBrush OldBrush;
OldBrush = (CBrush

)pDC->SelectStockObject(NULL_PEN);
BrushNew1.CreateSolidBrush(RGB(0, 0, 0));
pDC->SelectObject(BrushNew1);
d.下面這行程式碼是讓棋子能落在網線格上(有點low了,可以自行取整來做)
if (pt.x % 50 >= 25 && pt.y % 50 >= 25)
{
pt.x = pt.x + (50 - pt.x % 50);
pt.y = pt.y + (50 - pt.y % 50);
pDC->Ellipse(pt.x - 15, pt.y - 15, pt.x + 15, pt.y + 15);
pDC->SelectObject(OldBrush);
}
else if (pt.x % 50 >= 25 && pt.y % 50 < 25)
{
pt.x = pt.x + (50 - pt.x % 50);
pt.y = pt.y - pt.y % 50;
pDC->Ellipse(pt.x - 15, pt.y - 15, pt.x + 15, pt.y + 15);
pDC->SelectObject(OldBrush);
}
else if (pt.x % 50 < 25 && pt.y % 50 >= 25)
{
pt.x = pt.x - pt.x % 50;
pt.y = pt.y + (50 - pt.y % 50);
pDC->Ellipse(pt.x - 15, pt.y - 15, pt.x + 15, pt.y + 15);
pDC->SelectObject(OldBrush);
}
else if (pt.x % 50 < 25 && pt.y % 50 < 25)
{
pt.x = pt.x - pt.x % 50;
pt.y = pt.y - pt.y % 50;
pDC->Ellipse(pt.x - 15, pt.y - 15, pt.x + 15, pt.y + 15);
pDC->SelectObject(OldBrush);
}

7.至此的話你點選左鍵電腦已經能落子了,但是至於落在哪裡,還需要你自己去涉及座標。下面給出我自己寫的五子棋的演算法(前方高能:這個演算法很傻很傻,只能自己連成五顆,不能來賭你的棋,而且剪枝葉沒用,主要是給出了活二,死二,活三,死三(A,B,C),活四,死四(A,B,C),連五),以後博弈上層臺階後再來完善它吧:
for (int b = -1; b <= 1; b++)
for (int d = -1; d <= 1; d++)
{
for (int j = -1; j <= 1; j++)
for (int g = -1; g <= 1; g++)
{
if (j != 0 && g != 0)
{
stepx[1] = m + b + j; stepy[1] = n + d + g;
stepx[2] = m + b + j * 2; stepy[2] = n + d + g * 2;
stepx[3] = m + b + j * 3; stepy[3] = n + d + g * 3;
stepx[4] = m + b + j * 4; stepy[4] = n + d + g * 4;
stepx[5] = m + b + j * 5; stepy[5] = n + d + g * 5;
stepx[6] = m + b + j * 6; stepy[6] = n + d + g * 6;
stepx[7] = m + b; stepy[7] = n + d;
stepx[8] = m + b - j; stepy[8] = n + d - g;
stepx[9] = m + b - j * 2; stepy[9] = n + d - g * 2;
/活一/
if (flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 0 && flag[stepx[7]][stepy[7]] == 2)
value += 100;
/活二/
if (flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 2 && flag[stepx[7]][stepy[7]] == 0)
value += 650;
/死二A/
if (flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 2 && flag[stepx[7]][stepy[7]] == 0)
value += 150;
/死二B/
if (flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 2 && flag[stepx[3]][stepy[3]] == 1 && flag[stepx[7]][stepy[7]] == 0)
value += 250;
/死二C/
if (flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 0 && flag[stepx[3]][stepy[3]] == 0 && flag[stepx[4]][stepy[4]] == 1 && flag[stepx[5]][stepy[5]] == 0 && flag[stepx[7]][stepy[7]] == 0)
value += 200;
/活三/
if ((flag[stepx[1]][stepy[1]] == 0 && flag[stepx[1]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 1 && flag[stepx[4]][stepy[4]] == 0 && flag[stepx[5]][stepy[5]] == 0 && flag[stepx[7]][stepy[7]] == 0 && flag[stepx[8]][stepy[8]] == 0)
|| (flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 0 && flag[stepx[4]][stepy[4]] == 0 && flag[stepx[7]][stepy[7]] == 1 && flag[stepx[8]][stepy[8]] == 0 && flag[stepx[9]][stepy[9]] == 0))
value += 3000;
/死三A/
if ((flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 1 && flag[stepx[4]][stepy[4]] == 2 && flag[stepx[7]][stepy[7]] == 0 && flag[stepx[8]][stepy[8]] == 0) ||
(flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 2 && flag[stepx[7]][stepy[7]] == 1 && flag[stepx[8]][stepy[8]] == 0 && flag[stepx[9]][stepy[9]] == 0))
value += 500;
/死三B/
if ((flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 0 && flag[stepx[4]][stepy[4]] == 1 && flag[stepx[5]][stepy[5]] == 0 && flag[stepx[7]][stepy[7]] == 0) ||
(flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 0 && flag[stepx[3]][stepy[3]] == 1 && flag[stepx[4]][stepy[4]] == 0 && flag[stepx[7]][stepy[7]] == 1 && flag[stepx[8]][stepy[8]] == 0))
value += 800;
/死三C/
if ((flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 0 && flag[stepx[4]][stepy[4]] == 0 && flag[stepx[5]][stepy[5]] == 1 && flag[stepx[7]][stepy[7]] == 2) ||
(flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 0 && flag[stepx[3]][stepy[3]] == 0 && flag[stepx[4]][stepy[4]] == 1 && flag[stepx[7]][stepy[7]] == 1 && flag[stepx[8]][stepy[8]] == 2))
value += 600;
/活四/
if ((flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 1 && flag[stepx[4]][stepy[4]] == 1 && flag[stepx[5]][stepy[5]] == 0 && flag[stepx[7]][stepy[7]] == 0) ||
(flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 1 && flag[stepx[4]][stepy[4]] == 0 && flag[stepx[7]][stepy[7]] == 1 && flag[stepx[8]][stepy[8]] == 0))
value += 300000;
/死四A/
if ((flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 1 && flag[stepx[4]][stepy[4]] == 1 && flag[stepx[5]][stepy[5]] == 2 && flag[stepx[7]][stepy[7]] == 0) ||
(flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 1 && flag[stepx[4]][stepy[4]] == 2 && flag[stepx[7]][stepy[7]] == 1 && flag[stepx[8]][stepy[8]] == 0))
value += 500;
/死四B/
if ((flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 0 && flag[stepx[3]][stepy[3]] == 1 && flag[stepx[4]][stepy[4]] == 1 && flag[stepx[5]][stepy[5]] == 1 && flag[stepx[6]][stepy[6]] == 2 && flag[stepx[7]][stepy[7]] == 2) ||
(flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 1 && flag[stepx[4]][stepy[4]] == 2 && flag[stepx[7]][stepy[7]] == 0 && flag[stepx[8]][stepy[8]] == 1 && flag[stepx[9]][stepy[9]] == 2))
value += 3000;
/死四C/
if ((flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 0 && flag[stepx[4]][stepy[4]] == 1 && flag[stepx[5]][stepy[5]] == 1 && flag[stepx[6]][stepy[6]] == 2) ||
(flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 0 && flag[stepx[3]][stepy[3]] == 1 && flag[stepx[4]][stepy[4]] == 1 && flag[stepx[5]][stepy[5]] == 2 && flag[stepx[7]][stepy[7]] == 1 && flag[stepx[8]][stepy[8]] == 2))
value += 2600;
/連五/
if ((flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 1 && flag[stepx[4]][stepy[4]] == 1 && flag[stepx[5]][stepy[5]] == 1) ||
(flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 1 && flag[stepx[4]][stepy[4]] == 1 && flag[stepx[7]][stepy[7]] == 1) ||
(flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 1 && flag[stepx[7]][stepy[7]] == 1 && flag[stepx[8]][stepy[8]] == 1))
value += 600000;
if (value > max)
{
max = value;
leafstepx = m50 + b * 50 + j * 50;
leafstepy = n
50 + d * 50 + g * 50;
}
}
value = 0;
}
}
for (int j = -1; j <= 1; j++)
for (int g = -1; g <= 1; g++)
{
if (j != 0 && g != 0)
{
stepx[1] = m + j; stepy[1] = n + g;
stepx[2] = m + j * 2; stepy[2] = n + g * 2;
stepx[3] = m + j * 3; stepy[3] = n + g * 3;
stepx[4] = m + j * 4; stepy[4] = n + g * 4;
stepx[5] = m + j * 5; stepy[5] = n + g * 5;
stepx[6] = m + j * 6; stepy[6] = n + g * 6;
stepx[7] = m; stepy[7] = n;
stepx[8] = m - j; stepy[8] = n - g;
stepx[9] = m - j * 2; stepy[9] = n - g * 2;
/活一/
if (flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 0 && flag[stepx[7]][stepy[7]] == 2)
finalvalue += 100;
/活二/
if (flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 2 && flag[stepx[7]][stepy[7]] == 0)
finalvalue += 650;
/死二A/
if (flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 2 && flag[stepx[7]][stepy[7]] == 0)
finalvalue += 150;
/死二B/
if (flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 2 && flag[stepx[3]][stepy[3]] == 1 && flag[stepx[7]][stepy[7]] == 0)
finalvalue += 250;
/死二C/
if (flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 0 && flag[stepx[3]][stepy[3]] == 0 && flag[stepx[4]][stepy[4]] == 1 && flag[stepx[5]][stepy[5]] == 0 && flag[stepx[7]][stepy[7]] == 0)
finalvalue += 200;
/活三/
if ((flag[stepx[1]][stepy[1]] == 0 && flag[stepx[1]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 1 && flag[stepx[4]][stepy[4]] == 0 && flag[stepx[5]][stepy[5]] == 0 && flag[stepx[7]][stepy[7]] == 0 && flag[stepx[8]][stepy[8]] == 0)
|| (flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 0 && flag[stepx[4]][stepy[4]] == 0 && flag[stepx[7]][stepy[7]] == 1 && flag[stepx[8]][stepy[8]] == 0 && flag[stepx[9]][stepy[9]] == 0))
finalvalue += 3000;
/死三A/
if ((flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 1 && flag[stepx[4]][stepy[4]] == 2 && flag[stepx[7]][stepy[7]] == 0 && flag[stepx[8]][stepy[8]] == 0) ||
(flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 2 && flag[stepx[7]][stepy[7]] == 1 && flag[stepx[8]][stepy[8]] == 0 && flag[stepx[9]][stepy[9]] == 0))
finalvalue += 500;
/死三B/
if ((flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 0 && flag[stepx[4]][stepy[4]] == 1 && flag[stepx[5]][stepy[5]] == 0 && flag[stepx[7]][stepy[7]] == 0) ||
(flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 0 && flag[stepx[3]][stepy[3]] == 1 && flag[stepx[4]][stepy[4]] == 0 && flag[stepx[7]][stepy[7]] == 1 && flag[stepx[8]][stepy[8]] == 0))
finalvalue += 800;
/死三C/
if ((flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 0 && flag[stepx[4]][stepy[4]] == 0 && flag[stepx[5]][stepy[5]] == 1 && flag[stepx[7]][stepy[7]] == 2) ||
(flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 0 && flag[stepx[3]][stepy[3]] == 0 && flag[stepx[4]][stepy[4]] == 1 && flag[stepx[7]][stepy[7]] == 1 && flag[stepx[8]][stepy[8]] == 2))
finalvalue += 600;
/活四/
if ((flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 1 && flag[stepx[4]][stepy[4]] == 1 && flag[stepx[5]][stepy[5]] == 0 && flag[stepx[7]][stepy[7]] == 0) ||
(flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 1 && flag[stepx[4]][stepy[4]] == 0 && flag[stepx[7]][stepy[7]] == 1 && flag[stepx[8]][stepy[8]] == 0))
finalvalue += 300000;
/死四A/
if ((flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 1 && flag[stepx[4]][stepy[4]] == 1 && flag[stepx[5]][stepy[5]] == 2 && flag[stepx[7]][stepy[7]] == 0) ||
(flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 1 && flag[stepx[4]][stepy[4]] == 2 && flag[stepx[7]][stepy[7]] == 1 && flag[stepx[8]][stepy[8]] == 0))
finalvalue += 500;
/死四B/
if ((flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 0 && flag[stepx[3]][stepy[3]] == 1 && flag[stepx[4]][stepy[4]] == 1 && flag[stepx[5]][stepy[5]] == 1 && flag[stepx[6]][stepy[6]] == 2 && flag[stepx[7]][stepy[7]] == 2) ||
(flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 1 && flag[stepx[4]][stepy[4]] == 2 && flag[stepx[7]][stepy[7]] == 0 && flag[stepx[8]][stepy[8]] == 1 && flag[stepx[9]][stepy[9]] == 2))
finalvalue += 3000;
/死四C/
if ((flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 0 && flag[stepx[4]][stepy[4]] == 1 && flag[stepx[5]][stepy[5]] == 1 && flag[stepx[6]][stepy[6]] == 2) ||
(flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 0 && flag[stepx[3]][stepy[3]] == 1 && flag[stepx[4]][stepy[4]] == 1 && flag[stepx[5]][stepy[5]] == 2 && flag[stepx[7]][stepy[7]] == 1 && flag[stepx[8]][stepy[8]] == 2))
finalvalue += 2600;
/連五/
if ((flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 1 && flag[stepx[4]][stepy[4]] == 1 && flag[stepx[5]][stepy[5]] == 1) ||
(flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 1 && flag[stepx[4]][stepy[4]] == 1 && flag[stepx[7]][stepy[7]] == 1) ||
(flag[stepx[1]][stepy[1]] == 0 && flag[stepx[2]][stepy[2]] == 1 && flag[stepx[3]][stepy[3]] == 1 && flag[stepx[7]][stepy[7]] == 1 && flag[stepx[8]][stepy[8]] == 1))
finalvalue += 600000;
if (finalvalue > max)
{
max = finalvalue;
rootstepx = m * 50 + j * 50;
rootstepy = n * 50 + g * 50;
finalstepx = rootstepx;
finalstepy = rootstepy;
}
else
{
finalstepx = leafstepx;
finalstepy = leafstepy;
}
}
finalvalue = 0;
}
flag[finalstepx/50][finalstepy/50] = 1;