亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

簡易掃雷bot

2019-11-14 09:30:13
字體:
來源:轉載
供稿:網友

簡易掃雷bot


掃雷

掃雷中,你需要在不點錯雷的情況下盡可能快的將所有的雷都標記出來,如果你點錯,就得重新開始,所以掃雷也有一定的運氣成分。但是在botzone中,你點錯并不重新開始,而是只是在最后的分中扣分。

掃雷中數字的含義表示九宮格內雷的數目。

這就是掃雷規則。

實際游戲中還有操作技巧問題,例如雙擊和定式。我們寫bot不考慮這一點,我們采取盲掃的方式來實現一個輕量級的掃雷bot。這很適合初學者來練習。


botzone

首先給大家推薦一下botzone,botzone平臺為很多種游戲bot對戰提供了技術支持,使用json實現交互。例如北大計算概論(A)的黑白棋就是在這個平臺上完成的。最后我給出的完整代碼可以提交在botzone上直接運行。


思路

首先掃雷的規則大家都很清楚了。我們平時玩掃雷的時候關鍵是背定式。但是我們的bot可以直接枚舉不考慮時間代價。

那么我們先想一個粗放的框架:先計算出每個點是空白的概率,然后挑選一個概率最大的點點擊。事實上其實在游戲的大部分情況下幾乎每一步都不需要猜,甚至都不需要考慮剩余雷的問題,直到最后才需要猜一下。所以既然是掃雷的簡易bot,我們可以做以下簡化:我們僅僅挑選出一定不是雷的地點點擊,如果不存在這樣的地點,我們在可能不是雷的地點任意挑選一個點擊。

那么為了完成以上功能,我們至少要做以下幾步:1.在地圖中找到一定是雷的地方,2.在地圖中找到一定不是雷的地方。

也就是說,首先要實現在以下格式求解1.2.兩個問題的函數,數據格式為:

int fieldHeight, fieldWidth;int mineField[MAX_HEIGHT][MAX_WIDTH]; //[row][col]/* * 0-8: digits * 9: mine * 10: unrevealed */

解答

這個問題其實十分簡單,可以作為初學者的思考題,但是很有意思。下面是一個簡單的解答,但不是很美妙:

int surround_min_mines(int row, int col){ int r, c, dr, dc, count = 0; for (dr = -1; dr <= 1; dr++) for (dc = -1; dc <= 1; dc++) { r = row + dr; c = col + dc; if ((r >= 0) && (r < fieldHeight) && (c >= 0) && (c < fieldWidth) && ((dr!= 0) || (dc!= 0))) { if (mineField[r][c] == 9) count++; } } return count;}int surround_max_mines(int row, int col){ int r, c, dr, dc, count = 0; for (dr = -1; dr <= 1; dr++) for (dc = -1; dc <= 1; dc++) { r = row + dr; c = col + dc; if ((r >= 0) && (r < fieldHeight) && (c >= 0) && (c < fieldWidth) && ((dr!= 0) || (dc!= 0))) { if ((mineField[r][c] == 9) or (mineField[r][c] == 10)) count++; } } return count;}bool must_not_a_mine(int row, int col){ int r, c, dr, dc; for (dr = -1; dr <= 1; dr++) for (dc = -1; dc <= 1; dc++) { r = row + dr; c = col + dc; if ((r >= 0) && (r < fieldHeight) && (c >= 0) && (c < fieldWidth) && (mineField[r][c] < 9) && ((dr!= 0) || (dc!= 0))) { if (surround_min_mines(r, c) == mineField[r][c]) return true; } } return false;}bool must_be_a_mine(int row, int col){ int r, c, dr, dc; for (dr = -1; dr <= 1; dr++) for (dc = -1; dc <= 1; dc++) { r = row + dr; c = col + dc; if ((r >= 0) && (r < fieldHeight) && (c >= 0) && (c < fieldWidth) && (mineField[r][c] < 9) && ((dr!= 0) || (dc!= 0))) { if (surround_max_mines(r, c) == mineField[r][c]) return true; } } return false;}

有了這兩個函數就很簡單了,我們可以寫出函數decide()決定點擊位置,這是decide()的一個解答:

void decide(int& decidedRow, int& decidedCol){ int unrevealedPos[MAX_HEIGHT * MAX_WIDTH][2], unrevealedScore[MAX_HEIGHT * MAX_WIDTH]; int unrevealedCount = 0; int row, col; for (row = 0; row < fieldHeight; row++) for (col = 0; col < fieldWidth; col++) if ((mineField[row][col] == 10) && must_be_a_mine(row, col)) { mineField[row][col] = 9; unrevealedPos[unrevealedCount][0] = row; unrevealedPos[unrevealedCount][1] = col; unrevealedScore[unrevealedCount] = -1; unrevealedCount++; } for (row = 0; row < fieldHeight; row++) { for (col = 0; col < fieldWidth; col++) { if (mineField[row][col] == 10) { unrevealedPos[unrevealedCount][0] = row; unrevealedPos[unrevealedCount][1] = col; unrevealedScore[unrevealedCount] = must_not_a_mine(row, col); unrevealedCount++; } } } int myChoice = 0; for (int i = 1; i < unrevealedCount; i++) if (unrevealedScore[i] > unrevealedScore[myChoice]) myChoice = i; decidedRow = unrevealedPos[myChoice][0]; decidedCol = unrevealedPos[myChoice][1]; return;}

最終bot

綜合上面的函數,外加調試模塊,我們可以寫出最終解答,這個解答就是我的bot版本,經過測試,效果不錯,基本只會在首雷或者最后要猜的情況下觸雷,而這是不可避免的。以下為完整的最終bot,供參考。如果調試不對可以去botzone上跑一跑,還有圖形界面。

/* * minesweeper(botzone) * naive */#define TESTx//TEST is test mode#include <iostream>#include <string>#include <cstdlib>#include <cstdio>#ifndef TEST#include "jsoncpp/json.h"#endif#define MAX_WIDTH 80#define MAX_HEIGHT 40using namespace std;int mineCount;#ifdef TESTint fieldHeight = 3, fieldWidth = 3;int mineField[MAX_HEIGHT][MAX_WIDTH] = { { 10, 10, 10, 10}, { 10, 8, 10, 4}, { 10, 10, 10, 2}, };#elseint fieldHeight, fieldWidth;int mineField[MAX_HEIGHT][MAX_WIDTH]; //[row][col]#endif/* * 0-8: digits * 9: mine * 10: unrevealed */int surround_min_mines(int row, int col){ int r, c, dr, dc, count = 0; for (dr = -1; dr <= 1; dr++) for (dc = -1; dc <= 1; dc++) { r = row + dr; c = col + dc; if ((r >= 0) && (r < fieldHeight) && (c >= 0) && (c < fieldWidth) && ((dr!= 0) || (dc!= 0))) { if (mineField[r][c] == 9) count++; } } return count;}int surround_max_mines(int row, int col){ int r, c, dr, dc, count = 0; for (dr = -1; dr <= 1; dr++) for (dc = -1; dc <= 1; dc++) { r = row + dr; c = col + dc; if ((r >= 0) && (r < fieldHeight) && (c >= 0) && (c < fieldWidth) && ((dr!= 0) || (dc!= 0))) { if ((mineField[r][c] == 9) or (mineField[r][c] == 10)) count++; } } return count;}bool must_not_a_mine(int row, int col){ int r, c, dr, dc; for (dr = -1; dr <= 1; dr++) for (dc = -1; dc <= 1; dc++) { r = row + dr; c = col + dc; if ((r >= 0) && (r < fieldHeight) && (c >= 0) && (c < fieldWidth) && (mineField[r][c] < 9) && ((dr!= 0) || (dc!= 0))) { if (surround_min_mines(r, c) == mineField[r][c]) return true; } } return false;}bool must_be_a_mine(int row, int col){ int r, c, dr, dc; for (dr = -1; dr <= 1; dr++) for (dc = -1; dc <= 1; dc++) { r = row + dr; c = col + dc; if ((r >= 0) && (r < fieldHeight) && (c >= 0) && (c < fieldWidth) && (mineField[r][c] < 9) && ((dr!= 0) || (dc!= 0))) { if (surround_max_mines(r, c) == mineField[r][c]) return true; } } return false;}void decide(int& decidedRow, int& decidedCol){ int unrevealedPos[MAX_HEIGHT * MAX_WIDTH][2], unrevealedScore[MAX_HEIGHT * MAX_WIDTH]; int unrevealedCount = 0; int row, col; for (row = 0; row < fieldHeight; row++) for (col = 0; col < fieldWidth; col++) if ((mineField[row][col] == 10) && must_be_a_mine(row, col)) { mineField[row][col] = 9; unrevealedPos[unrevealedCount][0] = row; unrevealedPos[unrevealedCount][1] = col; unrevealedScore[unrevealedCount] = -1; unrevealedCount++; } for (row = 0; row < fieldHeight; row++) { for (col = 0; col < fieldWidth; col++) { if (mineField[row][col] == 10) { unrevealedPos[unrevealedCount][0] = row; unrevealedPos[unrevealedCount][1] = col; unrevealedScore[unrevealedCount] = must_not_a_mine(row, col); unrevealedCount++; } } } int myChoice = 0; for (int i = 1; i < unrevealedCount; i++) if (unrevealedScore[i] > unrevealedScore[myChoice]) myChoice = i; decidedRow = unrevealedPos[myChoice][0]; decidedCol = unrevealedPos[myChoice][1]; return;}#ifdef TESTint main(){ int row, col;
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
最近更新的2019中文字幕| 青草成人免费视频| 在线视频欧美日韩精品| 亚洲999一在线观看www| 136fldh精品导航福利| 日韩欧美一区二区三区久久| 日韩一区二区欧美| 国产精品视频在线观看| 国产情人节一区| 精品国产91久久久| 91精品久久久久久久久久| 日韩成人在线网站| 91精品国产综合久久香蕉922| 亚洲电影av在线| 亚洲欧美一区二区三区四区| 欧洲日韩成人av| 欧美老女人性视频| 美日韩精品免费视频| 热久久免费视频精品| 亚洲第一天堂无码专区| 日日噜噜噜夜夜爽亚洲精品| 欧美高清不卡在线| 亚洲国产中文字幕在线观看| 欧美亚洲国产另类| 亚洲国产高清福利视频| 最近2019年中文视频免费在线观看| 亚洲国产精品久久久久秋霞不卡| 亚洲成人a**站| 亚洲一区二区免费在线| 懂色av中文一区二区三区天美| 91高清免费视频| 国产精品手机播放| 亚洲欧美日韩中文在线| 国产精品网站大全| 亚洲精品国产精品久久清纯直播| 91探花福利精品国产自产在线| 久久av资源网站| 久久躁日日躁aaaaxxxx| 亚洲午夜未满十八勿入免费观看全集| 蜜月aⅴ免费一区二区三区| 国产精品专区h在线观看| 久久影院资源站| 欧美国产日产韩国视频| 日韩不卡中文字幕| 国产91精品久久久久久久| 日本一区二区在线免费播放| 992tv成人免费视频| 日韩av在线影院| 欧美性生交xxxxx久久久| 日本精品视频网站| 久久精品国产成人| 精品香蕉在线观看视频一| 精品综合久久久久久97| 国产精品免费一区豆花| 18一19gay欧美视频网站| 姬川优奈aav一区二区| 91精品免费久久久久久久久| 91爱爱小视频k| 国产精品久久久久久久久久ktv| 国产精品高潮呻吟久久av野狼| www.99久久热国产日韩欧美.com| 国产精品网站视频| 成人福利网站在线观看11| 中文字幕在线观看亚洲| 亚洲精品一二区| 97在线免费视频| 久久久国产精品x99av| 日韩视频免费大全中文字幕| 日韩成人在线电影网| 亚洲免费精彩视频| 精品小视频在线| 国产精品自拍小视频| 亚洲精品欧美一区二区三区| 久久久久久久久国产| 国产丝袜一区二区| 久久男人资源视频| 98视频在线噜噜噜国产| 久久久人成影片一区二区三区| 日韩av手机在线观看| 91精品久久久久久久久| 一区二区三区精品99久久| 日韩av影片在线观看| 黑人欧美xxxx| 成人欧美一区二区三区在线| 日韩免费在线看| 国产精品第二页| 国产一区二区成人| 中文字幕精品在线| 国产精品极品美女在线观看免费| 91影院在线免费观看视频| 久久久亚洲国产天美传媒修理工| 日韩欧美在线看| 欧美激情一区二区三区成人| 国产日韩在线看片| www日韩中文字幕在线看| 亚洲精品福利免费在线观看| 成人精品视频在线| 国产精品免费久久久久久| 欧美日韩亚洲91| 欧美激情a∨在线视频播放| 亚洲黄在线观看| 欧美日韩在线免费观看| 一本色道久久综合狠狠躁篇怎么玩| 亚洲免费电影在线观看| 国产精品在线看| 成人国产精品日本在线| 66m—66摸成人免费视频| 一区二区欧美亚洲| 国产精品激情自拍| 日韩在线播放一区| 亚洲欧美中文日韩v在线观看| 91探花福利精品国产自产在线| 亚洲日本欧美日韩高观看| 国产亚洲视频在线观看| 欧美成人激情视频免费观看| 国产精品夫妻激情| 精品视频—区二区三区免费| 亚洲第一福利网站| 精品国偷自产在线| 成人性生交xxxxx网站| 国产成人一区二区三区| 国产精品91在线观看| 97视频在线观看免费高清完整版在线观看| 日韩免费视频在线观看| 亚洲另类欧美自拍| 欧美极品第一页| 精品国产一区二区三区久久久| 欧美日韩亚洲一区二区| 欧美老女人bb| 成人高h视频在线| 久久五月情影视| 久久99精品国产99久久6尤物| 一级做a爰片久久毛片美女图片| 中文字幕成人在线| 91成人天堂久久成人| www.欧美三级电影.com| 日韩av在线直播| 日本国产一区二区三区| 欧美性极品xxxx做受| 中文字幕亚洲欧美日韩高清| 在线观看国产精品日韩av| 午夜精品一区二区三区在线视频| 欧美资源在线观看| 成人久久一区二区| 中文字幕日韩视频| 久久久久久尹人网香蕉| 国产亚洲一区二区精品| 久久成年人视频| 91天堂在线观看| 欧美一乱一性一交一视频| 欧美一级电影免费在线观看| 91久久国产综合久久91精品网站| xvideos国产精品| 欧美午夜无遮挡| 欧美高清视频在线播放| 91精品国产91久久久久久最新| 97国产suv精品一区二区62| 中文字幕日韩免费视频| 中文字幕欧美专区| 美女久久久久久久久久久| 国产99久久精品一区二区 夜夜躁日日躁| 久久香蕉国产线看观看av| 欧美一级大片在线免费观看| 久久久精品美女|