スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2048AIコンテスト

本日はKMC(京大マイコンクラブ)にて2048AIコンテストが開催されました. 自分もjson取得できたし軽い気持ちで参加するかーって思って参加しましたが,桁が他の人より1つ違う最下位でつらい感じに. 2048AIsource.png
第二回があるそうなので,もっとちゃんとしたの作りたいですよね. やみくもに作るのも楽しいけど,すこしアルゴリズムについても勉強しようと思っています...
電子工作,競技プログラミング勉強,サーバーとかbashとかのお勉強,アプリ開発,アニメ,その他女の子などやりたいことはたくさんあるけど全部はできない感じ.どうしたものか...

つらくなったので寝る.
あまり日記的なこと書こうと思ってなかったけど,今後なにしようかなということで記録.
スポンサーサイト

"2048"AIをC++ で動かす (C++でjson取得,パースする)

2048

最近流行ってる"2048"のゲームのAIをつくろう!ということで数日間奮闘していました.
いや,正確にはAIをつくる下準備に奮闘していました.

http://2048.semantics3.com/hi/start/json
にアクセスすると,セッションID,盤の状況,などの情報が入ったjsonが降ってきます.
そして
http://2048.semantics3.com/hi/state/セッションID/move/動く方向(0,1,2,3)/json"
にアクセスすると,またjsonが降ってきます.

要するにjsonを取得してパースして,表示するプログラムをつくってたのです.

jsonって何死ね?て僕もはじめ思っていましたが,ようするに決まった様式でデータが書かれているテキストデータのことで,パースってのはそれをちゃんと一つ一つのデータに分けるってだけなんです.

picojsonってのはkazuho氏がつくったjsonを簡単にパースしてくれるライブラリのことです.

結局大事なところはコピペソースです.
1.C++でcurlを用いてjsonを取得するプログラム(フニゲの開発日記 様
2.picojsonでのパースするプログラムnirasan's tech blog様

あと困ったのは,1で取得するjson(テキストデータ)がstring型で,それをpicojsonのvalueっていう型に変換するところでした.Twitterで
istringstream is(buffer.c_str() ); is >> v;
でできると教えてもらいました.(#include <sstream>が必要)

とにもかくにもあとはメインを書くだけですね(いやここが重要なんですが)

★使いたい人へ
 HTMLの書式とぶつかってるせいかソースが一部乱れて表示されているので,こちらからmain.cppをダウンロードしてください.

 次にkazuho氏のpicojson.hをダウンロード:ここからダウンロードできます.main.cppをおいた場所と同じ所に保存します.

 あとはmain.cppをコンパイルするだけなのですが,jsonを取得するのに使用している の機能がそのままでは正しく動かないらしいので,
 g++ -lcurl main.cppというように"-lcurl"を挿入してコンパイルしてください.
 えと...VisualStudioなどで開発している人は...何かをライブラリとして追加すればいいと思います(現在模索中)

ぼちぼちAIをつくっていこうとおもいます・・・できるのかな
以下に一応ソースを貼り付けておきます(一部乱れて表示されてます)


#include
#include
#include
#include <curl/curl.h>
#include "picojson.h"
using namespace std;

static char* errorBuffer;
string buffer;
picojson::value v;

static int writer(char *data, size_t size, size_t nmemb, string *buffer);
int JsonFirstLoad();
int MoveJsonGet(int move);
int JsonParse();
void ShowState();

int data[4][4];
bool over;
long long int score;
int cnt=0;
string ssid;
#define UP 0
#define RIGHT 1
#define DOWN 2
#define LEFT 3

int main(){
if(!JsonFirstLoad()){
//Jsonのロードに失敗
cout<<"JsonLoadError"< return 0;
}
if(!JsonParse()){
cout << "JsonParseError" << endl;
}else{
cout << "SessionID:" << ssid << endl << "GameStart" << endl;;
}

while(1){
//ゲーム開始
ShowState();
if(over==true){
cout << "GameOver" << endl;
break;
}

//ここでdata[][]に基づいてどの方向に動かすかを考える!!!!ここがメイン!!!

int dir=cnt%4;//UP,LEFT,DOWN,RIGHTいずれか

MoveJsonGet(dir);
JsonParse();
cnt++;
}
return 0;
}

static int writer(char *data, size_t size, size_t nmemb, string *buffer){
int result = 0;
if (buffer != NULL) {
buffer->append(data, size * nmemb);
result = size * nmemb;
}
return result;
}

int JsonFirstLoad(){
CURL *curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer);
curl_easy_setopt(curl, CURLOPT_URL, "http://2048.semantics3.com/hi/start/json");
curl_easy_setopt(curl, CURLOPT_HEADER, 0);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);

CURLcode result = curl_easy_perform(curl);
curl_easy_cleanup(curl);
if (result == CURLE_OK) {
return 1;
} else {
return 0;
}
}
return -1;
}

int MoveJsonGet(int move){
buffer=" ";
char MoveUrl[100];
sprintf(MoveUrl,"http://2048.semantics3.com/hi/state/%s/move/%d/json",ssid.c_str(),move);
CURL *curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer);
curl_easy_setopt(curl, CURLOPT_URL, MoveUrl);
curl_easy_setopt(curl, CURLOPT_HEADER, 0);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);

CURLcode result = curl_easy_perform(curl);
curl_easy_cleanup(curl);
if (result == CURLE_OK) {
return 1;
} else {
return 0;
}
}
return -1;

}

int JsonParse(){
istringstream is(buffer.c_str() ); is >> v;
string err = picojson::get_last_error();
if(!err.empty()) {
cerr << err << endl;
return 0;
}
picojson::object& o = v.get();
over = o["over"].get();
score = (int) o["score"].get();
ssid = o["session_id"].get();
picojson::array grid = o["grid"].get();
for (int i = 0; i < 4; i++) {
picojson::array line = grid[i].get();
for (int j = 0; j < 4; j++) {
data[i][j] = line[j].get();
}
}
return 1;
}

void ShowState(){
for(int i=0;i<4;i++){
for(int j=0; j<4;j++){
cout< if(j!=3) cout << "|";
}
cout< }
cout << "Score:" << score << " MoveCount:" << cnt<}

検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。