% !TEX encoding = UTF-8 Unicode
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%	tani_resume.syt 使用例
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%#! platex resume.tex
\documentclass[a4paper]{jarticle}

\usepackage{tani_resume}

\alignbeforeskip -5mm
\alignafterskip -5mm
\eqnarraybeforeskip -5mm
\eqnarrayafterskip -5mm

\jptitle{大貧民PC対人間のストレスなき実現}
\etitle{}
\jpauthor{長谷川 貴啓}
\eauthor{Takahiro Hasegawa}
\course{谷聖一　研究室}
\year{24}
\abstract{%
電気通信大学が主催する大貧民大会では，各参加者が戦略をクライアントプログラムに実装し，各クライアントプログラムがサーバーと相互的にデータのやりとりをすることによりゲームが進行する．本演習では，このクライアントプログラムを読み込み，人間とPCが対戦できるシステムを構築した．
}

% 最終更新時刻の挿入
%\compheading

\begin{document}

% タイトルを表示させる
\maketitle

\begin{multicols}{2}

%こうやって2段組にします．
\section{はじめに}\setcounter{page}{17}
ふとここ１０年を振り返る．電車の改札を通る時は切符を通す代わりにカードをかざす．テレビはより鮮明になり，実際にクイズ番組に参加することもできる．携帯電話はボタンではなく直接画面に触れて操作．そして傾きを検知する機能はもはやあって当たり前になった．今日，人間の生活において，情報科学の寄与は著しく，IT社会と言われるほど，もはや人間には欠かせないパートナーとなった．しかし，ここまで発展しているITであっても，人間の方が優れている部分が存在する．人間ができる思考と対等以上の働きをするシステムを実現することは，情報科学の発展において大きな目標の１つである．しかし，実際に人間より優れた働きが出来るかどのように判定すればよいのだろうか．その方法の１つとして，勝敗の決まる状況下でAIと人間が対決して，勝つことができるかどうか調べることが考えられる．そうすれば，少なくともその状況下で，人間以上の働きをするかどうか判定することができる．\\
　これまで，コンピュータプログラムはオセロ，チェス，将棋，囲碁などのゲームで人間と戦ってきた．今回，谷研究室の長谷川，佐藤，松藤の３人で電気通信大学で開催された大貧民大会(略称UECda)([3])に参加し，最強の大貧民のプレイヤーAIを作りあげるべく奮闘してきた．結果は敗退だったが，そこには今の段階で世界最強のAIが存在した．大貧民は，上記に挙げた４つのゲームとは異なり，不完全情報多人数ゲームである．この状況下で，果たして人間はこのプログラムに勝てるのだろうか．答えは，「わからない」．なぜなら，容易に大貧民プログラムと戦うことを可能にするシステムが現段階で筆者のまわりにはないからだ．そこで，私はそれを実現するシステムを開発することにした．以下そのシステムを「大貧民VS」と呼ぶこととする．\\
UEC-daでは，サーバークライアントシステムが用いられる．サーバーはカードの配布，及び受理などのゲーム進行管理を行い，クライアントはそれに従いカードを受け取ったり，提出したりしてゲームは進行する．今回，私はWindowsアプリケーションとして実装しようとしているので，まずサーバープログラムに当たるプログラムを実装し，さらにクライアントプログラムを自動で大貧民VSで使用できるようなプログラムに変換するシステムを開発する必要がある．その為に，カード交換，カード提出などモジュール別に自動で関数化し，大貧民VSで使用できるようなファイルとして保存するシステムを実装する．今回はサーバープログラムにあたるシステムの実装にVisualC＋＋，変換処理の実装にHSP([2])という神言語を使用する．\\
　本演習以外にも，大貧民大会のクライアントプログラムと人間が戦えるシステムを，サーバークライアントシステム上での実現を目標に，開発するチームが存在している．まだ未完成（2012年１２月現在）のようだが，これならば，クライアントプログラムを変換する必要もなくなり，自分の大貧民VSよりスムーズに対人間が可能になるように思える．しかしこれには，ネット環境，あるいはプレイヤーのPCにサーバーの動作環境がないと使えないなどのデメリットも存在している．今回私は，アプリとして開発し，なるべく変換をスムーズにすることで，よりデメリットの少ないシステムを作りあげるべく，開発を進めた．

\section{システムの仕組み}
大貧民VSは，大きく分けて２つに分けることができる．
クライアントプログラムを変換する「変換」と，実際ゲームを遊べる「ゲーム」である．
\subsection{変換}
変換の説明の前に，大会参加者が，どのように大会用にクライアントプログラムを作るかを簡単に説明する．まず始めに参加者はUEC-daからデフォルトプログラム(年度で内容が異なる)をダウンロード，その後プログラムのカード交換部分や，カードを提出する部分などを書き換えることによりオリジナルの戦略を持ったクライアントプログラムを開発していく．ちなみに大会側は，必要条件として上記のようにデフォルトプログラムから開発することを求めていないが，特別な事情がないかぎり，筆者の知る限りでは，上記の方法以外で開発されることはない．またjava言語を使用して開発することも認められているが，今回は時間の関係で，c言語のデフォルトクライアントプログラムから作成したクライアントプログラムのみを対象としている．\\

今回，上記の事を踏まえ，入力として「ファイル名」，「使用したデフォルトクライアントの年度」，出力として「変換後ファイル」を出力するプログラムを開発した．変換の大まかな流れとして，まず「クライアントプログラムのcソースファイル」，及び「クライアントプログラムが使用するc，hファイル」を読み込み，モジュール別(カードを出す処理，交換する処理など)に関数化して別ファイルとして保存する．それを「ゲーム」でincludeする事によって実際にゲームができる仕組みだ．本来クライアントプログラムはmakeを使用して動作するプログラムなので，必要なファイルが必ずしもincludeされていない．そこで，クライアントプログラムと同じ階層にあるc，及びhファイル名を抽出し，必要なファイルをincludeに追加する仕組みにした．またデフォルトで配布されているライブラリ(中に入っている関数「カードテーブルの初期化」，「カードテーブルのコピー」，また「カード交換」，「カード提出」など)は，「ゲーム」の方でincludeして，プレイヤー全員で共用しようと考えていたのだが，このライブラリを直接いじるユーザーも存在した．なので，各プレイヤーが自分のライブラリを使用出来るよう，各プレイヤーの使用するライブラリ内の関数名の語尾に「1〜4」をそれぞれ付加し，各ユーザーが自分の関数を使用することが出来るようにした．また大貧民VSで使用している関数名が使わる事のないよう，大貧民VSで使用する関数には，語尾に「\_hasetaka」がついている．

\begin{center}
\includegraphics[width=5cm,bb=0 0 256 540]{hurotya.png}\\
\figurename{「変換」のフローチャート}
\end{center}

\begin{center}
\includegraphics[width=8cm,bb=0 0 406 228]{henkan1.png}\\
\figurename{「変換」スクリーンショット１}
\end{center}

\begin{center}
\includegraphics[width=8cm,bb=0 0 1366 768]{henkan2.png}\\
\figurename{「変換」スクリーンショット２}
\end{center}

\subsection{ゲーム}
今回，より効率的に開発する為ゲームライブラリである「DXライブラリ([3])」を使用した．
UEC-daでは２次元配列で表現される「カードテーブル」という，カード情報を示す２次元テーブルによりカードをやりとりする．
大貧民大会でも同様に，２次元配列のカードテーブルを用いてカードのやりとりを行う事にした．
　主に「ゲーム」はカードの配布，受理といった，ゲーム進行をするプログラムとなっており，
2013年2月現在では，４つのプログラムと１人の人間で遊ぶことが出来る用になっている．
まずゲームが始まると，大貧民VS用に変換したクライアントプログラムを４つ読み込む．
そしてカードを配り，ゲームを開始するのだが，カードは５３枚あるので，プレイヤーによってカードの枚数が異なってくる．
配るカードとカード枚数は，どちらもrnd関数を用いてランダムに決められる．
ゲーム中の進行は，ターンがきたプレイヤーがグローバルで見れる情報（前のカード情報，しばりの有無，全プレイヤーの階級など）を駆使し，
自分の出すカードを選択．カードテーブルに出すカードのフラグをたてて提出する．「ゲーム」プログラムはこれを受理し，グローバルで見れる情報を更新する．パスをするには，何もフラグがたっていないカードテーブルを提出してもらうことにより成立する．
人間のターンでは，提出したいカードを全て選択し，決定ボタンを押すことによりカードを提出出来る．
ちなみに出せないカードを出そうとすると出さないようになっている．本来何もカードを選択しないまま決定を押せば（空のカードテーブルを提出した事となり）パスとなるはずなのだが，誤操作を避けるため，パスは別に「パスボタン」が用意されている．
\begin{center}
\includegraphics[width=10cm,bb=0 0 650 512]{daVS1.png}\\ƒ
\figurename{「ゲーム」スクリーンショット１}
\end{center}

\begin{center}
\includegraphics[width=10cm,bb=0 0 650 512]{daVS2.png}\\
\figurename{「ゲーム」スクリーンショット２}
\end{center}

\section{考察}
プログラムの開発には時間を取られる．今回もやりたかったものが全て実装出来たとは，到底言えるものではなかった．少しでも開発時間を効率化し，より成果のあるものにするためには，「車輪の再発見」を出来る限り避けることが重要だ．
今回時間の関係で，「ゲーム」で実装することのできなかったものとして，「交換」，「複数の人間が遊ぶ」.「変換」で実装出来なかったものとして「2011年度以前のクライアントプログラムへの対応」などが挙げられる．
また，日本大学の北原教授から、より直感的に操作出来るよう，マウスのみで遊べるようなインターフェイスにすべきではというご指摘も頂いた.
卒業演習としてはここまでだが，これからも個人でキリのいいところまで開発していきたいと考えている．
\end{multicols}%2段落の文章の終わり

\begin{thebibliography}{6}%参考文献({2}：2つ参考文献があるという意味)
	\bibitem{a}電気通信大学 UECコンピュータ大貧民大会 http://uecda.nishino-lab.jp/\\(アクセス日付:2013/2/22)
	\bibitem{b}ONION software HSPTV!   http://hsp.tv/\\(アクセス日付:2013/2/22)
	\bibitem{c}山田 巧 ＤＸライブラリ置き場 http://homepage2.nifty.com/natupaji/DxLib/\\(アクセス日付:2013/2/22)
		
\end{thebibliography}%参考文献終わり
\end{document}

