コラム
2026/05/26
プログラミングについて 第129回目
『たまにはオセロで遊ぼうよ! その1』
いつも仕事に必要なプログラムばかりを作っていると、ときには遊びのためのプログラムも作ってみたくなるものです。本当は私の子供がテレビゲームにちょっと飽きてしまって、自宅に置いてあるノートパソコン(モノクロの数世代前のもの)のVZエディタに付録で付いているテトリスゲームをやっていたときに、「お父さんがオセロゲームを作ってやるよ」と言ってしまったのがそもそもの始まりでした。DOSしか動かないパソコンですので、四苦八苦しながらマウスも使えるようにして作ってあげましたが、やはり小学校の低学年ではあまり興味がなかったみたいです。
今回からはWindows版に書き直してみることにします。ゲームの強さはそれほどでもないので、せいぜい気楽に楽しむか、子供用ならば使用に耐えうるといったところです。
多分オセロゲームを知らない人はいないとは思いますが、このゲームが日本生まれのゲームであるということを知らない人が意外と多いようです。発明者の名前は忘れてしまいましたが、その方が怪我か病気で入院しているとき、退屈さを紛らわすために牛乳のふたの片方の面を黒く塗って遊んでいたそうです。これが意外に人気があったので、退院後にオセロゲーム(確かシェークスピアの戯作の題名からとった名前だったと思います)として商品にしたというのが誕生の頃のエピソードです。
それでは少しずつ作っていきましょう。今回は画面をデザインしておき、それを使用して作っていくことにしますので、70回目~78回目までのWindowsのプログラムについての話を参考にして下さい。今回もVisual C++ で作成します。
画面のデザインはVisual C++ のリソースエディタ等で行ないます。このリソースファイルを othello.rc として次のようにしました。
#include "afxres.h"
#include "resource.h"
OTHELLO DIALOG DISCARDABLE 0, 0, 250, 277
STYLE DS_MODALFRAME | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION |
WS_SYSMENU
CAPTION "オセロゲーム"
FONT 9, "MS Pゴシック"
BEGIN
CONTROL "",IDFRAME_BOX,"Static",SS_BLACKFRAME | NOT WS_VISIBLE,4,
31,240,239
LTEXT "",IDBLACK_STATUS,4,4,54,8
LTEXT "",IDWHITE_STATUS,4,15,54,8
CTEXT "",IDMESSAGE,62,9,182,8
END
resource.h は、
#define IDBLACK_STATUS 1000
#define IDWHITE_STATUS 1001
#define IDMESSAGE 1002
#define IDFRAME_BOX 1003
です。この2つのファイルはテキストエディタで作成してもできますが、やはりリソースエディタで作成した方が簡単です。上記のものはそれで作成したものの必要な部分を抜粋したものです。おおよその画面の構成内容は、左上に黒の石の現在の数を表示するテキスト、その下に白の石の現在数を表示するテキスト、この2つの文字の右にメッセージ用のテキストを1つ、更にこの3つの文字の下にオセロのマス目を表示するための輪郭を得るために非表示の四角のコントロールが1つあるようにしています。
この othello.rc は、DOSプロンプトで rc /r othello.rc とリソースコンパイラを起動してコンパイルして othello.res ファイルを作成しておきます。
次にこのリソースを使用してウインドウを開いてみましょう。プログラムのファイルは通常ならば機能単位にソースファイルを分割するのですが、1つのみで行なうように記述してあります。
#include <afxwin.h>
#include "resource.h"
class Othello : public CDialog
{
private:
afx_msg void OnClose();
public:
Othello();
DECLARE_MESSAGE_MAP()
};
class OthelloApp : public CWinApp
{
public:
virtual BOOL InitInstance();
virtual ~OthelloApp();
};
BOOL OthelloApp::InitInstance()
{
m_pMainWnd=new Othello();
return TRUE;
}
OthelloApp::~OthelloApp()
{
delete m_pMainWnd;
}
Othello::Othello()
{
Create("OTHELLO");
}
afx_msg void Othello::OnClose()
{
PostQuitMessage(0);
}
BEGIN_MESSAGE_MAP(Othello,CDialog)
ON_WM_CLOSE()
END_MESSAGE_MAP()
OthelloApp OthelloApp;
次は上のリストの内容の説明です。
#include <afxwin.h>
#include "resource.h"
は、必要なヘッダーファイルをインクルードしています。afxwin.h はWindowsのプログラムを書くときにはお決まりの呪文のようにインクルードします。resource.h はリソースデータのIDとプログラム内でのIDを合わせるのに必要ですので、これも読み込んでおきます。
class Othello : public CDialog
{
private:
afx_msg void OnClose();
public:
Othello();
DECLARE_MESSAGE_MAP()
};
はオセロのウインドウの宣言です。クラス名は Othello で、CDialog クラスから派生させています。ウインドウを開くだけならば、
class Othello : public CDialog
{
public:
Othello();
};
でも可能なのですが、この場合には起動したプログラムを終了させてもWindowsに本当に終わったよということを教えられないので、ウインドウの右上の×をクリックすると見た目にはウインドウが消去されて終了したように見えるのですが、プログラムはそのままメモリー上に残ってしまい不都合がありますので、ウインドウのクローズ処理だけは最初に追加しておきます。
class OthelloApp : public CWinApp
{
public:
virtual BOOL InitInstance();
virtual ~OthelloApp();
};
これはWindowsのプログラムの親になるクラスの宣言で、通常のC言語の main関数に相当するものと思って下さい。CWinApp クラスから派生させて OthelloApp というクラス名にしました。最初の宣言では、インスタンスの作成と、終了時の処理の2つがあればOKです。
BOOL OthelloApp::InitInstance()
{
m_pMainWnd = new Othello();
return TRUE;
}
は OthelloApp クラスのインスタンスが生成されるときの内容を定義するもので、ここでは、Othello クラスのウインドウ(インスタンス)を生成するのみです。
OthelloApp::~OthelloApp()
{
delete m_pMainWnd;
}
は、プログラムの終了時の OthelloApp クラスの処理で、生成してある Othello クラスのインスタンスを消去するのみです。
Othello::Othello()
{
Create("OTHELLO");
}
は Othello クラスのコンストラクタで、リソースの OTHELLO ダイアログをテンプレートにして生成しています。
afx_msg void Othello::OnClose()
{
PostQuitMessage(0);
}
は、ウインドウが閉じられるときの Othello クラスの処理で、Windowsに対して終わったよというメッセージを発行しています。この処理をしておかないと先程お話したようにメモリー上にプログラムが残ってしまいます。
BEGIN_MESSAGE_MAP(Othello,CDialog)
ON_WM_CLOSE()
END_MESSAGE_MAP()
は Othello クラスのメッセージマップでウインドウのクローズメッセージの処理のみを記述してあります。
OthelloApp OthelloApp;
は、OthelloApp クラスを生成しています。
リソースにアイコンを作成したときには、Othello クラスのコンストラクタの宣言を次のようにアイコンのハンドルを引数として受け取るようにし、
class Othello : public CDialog
{
private:
afx_msg void OnClose();
public:
Othello(HICON othello_icon);
DECLARE_MESSAGE_MAP()
};
OthelloApp クラスの InitInstance を、
BOOL OthelloApp::InitInstance()
{
m_pMainWnd=new Othello(LoadIcon("OTHELLO_ICON"));
return TRUE;
}
とします(ここではアイコンのリソース名を OTHELLO_ICON としています。
更に Othello のコンストラクタを、
Othello::Othello(HICON othello_icon)
{
Create("OTHELLO");
SetIcon(othello_icon,TRUE);
}
とするとウインドウのキャプションの左にアイコンが表示されます。しかしながらこのときには、リソースで定義したウインドウのタイトルがアイコンに隠れてしまいますので、次のようにアイコンを設定した後にウインドウのタイトルを設定するようにして下さい。
Othello::Othello(HICON othello_icon)
{
Create("OTHELLO");
SetIcon(othello_icon,TRUE);
SetWindowText("オセロゲーム");
}
プログラムのコンパイルは(プログラムのファイル名を a.cpp とします)DOSプロンプト内では、
cl /c /MT a.cpp
リンクは、
link /subsystem:windows a.obj othello.res
として行ないます。
続きはまた次回。
第129回 プログラミングについて『たまにはオセロで遊ぼうよ!その1』
プログラミングについて 第129回目
『たまにはオセロで遊ぼうよ! その1』
いつも仕事に必要なプログラムばかりを作っていると、ときには遊びのためのプログラムも作ってみたくなるものです。本当は私の子供がテレビゲームにちょっと飽きてしまって、自宅に置いてあるノートパソコン(モノクロの数世代前のもの)のVZエディタに付録で付いているテトリスゲームをやっていたときに、「お父さんがオセロゲームを作ってやるよ」と言ってしまったのがそもそもの始まりでした。DOSしか動かないパソコンですので、四苦八苦しながらマウスも使えるようにして作ってあげましたが、やはり小学校の低学年ではあまり興味がなかったみたいです。
今回からはWindows版に書き直してみることにします。ゲームの強さはそれほどでもないので、せいぜい気楽に楽しむか、子供用ならば使用に耐えうるといったところです。
多分オセロゲームを知らない人はいないとは思いますが、このゲームが日本生まれのゲームであるということを知らない人が意外と多いようです。発明者の名前は忘れてしまいましたが、その方が怪我か病気で入院しているとき、退屈さを紛らわすために牛乳のふたの片方の面を黒く塗って遊んでいたそうです。これが意外に人気があったので、退院後にオセロゲーム(確かシェークスピアの戯作の題名からとった名前だったと思います)として商品にしたというのが誕生の頃のエピソードです。
それでは少しずつ作っていきましょう。今回は画面をデザインしておき、それを使用して作っていくことにしますので、70回目~78回目までのWindowsのプログラムについての話を参考にして下さい。今回もVisual C++ で作成します。
画面のデザインはVisual C++ のリソースエディタ等で行ないます。このリソースファイルを othello.rc として次のようにしました。
#include "afxres.h"
#include "resource.h"
OTHELLO DIALOG DISCARDABLE 0, 0, 250, 277
STYLE DS_MODALFRAME | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION |
WS_SYSMENU
CAPTION "オセロゲーム"
FONT 9, "MS Pゴシック"
BEGIN
CONTROL "",IDFRAME_BOX,"Static",SS_BLACKFRAME | NOT WS_VISIBLE,4,
31,240,239
LTEXT "",IDBLACK_STATUS,4,4,54,8
LTEXT "",IDWHITE_STATUS,4,15,54,8
CTEXT "",IDMESSAGE,62,9,182,8
END
resource.h は、
#define IDBLACK_STATUS 1000
#define IDWHITE_STATUS 1001
#define IDMESSAGE 1002
#define IDFRAME_BOX 1003
です。この2つのファイルはテキストエディタで作成してもできますが、やはりリソースエディタで作成した方が簡単です。上記のものはそれで作成したものの必要な部分を抜粋したものです。おおよその画面の構成内容は、左上に黒の石の現在の数を表示するテキスト、その下に白の石の現在数を表示するテキスト、この2つの文字の右にメッセージ用のテキストを1つ、更にこの3つの文字の下にオセロのマス目を表示するための輪郭を得るために非表示の四角のコントロールが1つあるようにしています。
この othello.rc は、DOSプロンプトで rc /r othello.rc とリソースコンパイラを起動してコンパイルして othello.res ファイルを作成しておきます。
次にこのリソースを使用してウインドウを開いてみましょう。プログラムのファイルは通常ならば機能単位にソースファイルを分割するのですが、1つのみで行なうように記述してあります。
#include <afxwin.h>
#include "resource.h"
class Othello : public CDialog
{
private:
afx_msg void OnClose();
public:
Othello();
DECLARE_MESSAGE_MAP()
};
class OthelloApp : public CWinApp
{
public:
virtual BOOL InitInstance();
virtual ~OthelloApp();
};
BOOL OthelloApp::InitInstance()
{
m_pMainWnd=new Othello();
return TRUE;
}
OthelloApp::~OthelloApp()
{
delete m_pMainWnd;
}
Othello::Othello()
{
Create("OTHELLO");
}
afx_msg void Othello::OnClose()
{
PostQuitMessage(0);
}
BEGIN_MESSAGE_MAP(Othello,CDialog)
ON_WM_CLOSE()
END_MESSAGE_MAP()
OthelloApp OthelloApp;
次は上のリストの内容の説明です。
#include <afxwin.h>
#include "resource.h"
は、必要なヘッダーファイルをインクルードしています。afxwin.h はWindowsのプログラムを書くときにはお決まりの呪文のようにインクルードします。resource.h はリソースデータのIDとプログラム内でのIDを合わせるのに必要ですので、これも読み込んでおきます。
class Othello : public CDialog
{
private:
afx_msg void OnClose();
public:
Othello();
DECLARE_MESSAGE_MAP()
};
はオセロのウインドウの宣言です。クラス名は Othello で、CDialog クラスから派生させています。ウインドウを開くだけならば、
class Othello : public CDialog
{
public:
Othello();
};
でも可能なのですが、この場合には起動したプログラムを終了させてもWindowsに本当に終わったよということを教えられないので、ウインドウの右上の×をクリックすると見た目にはウインドウが消去されて終了したように見えるのですが、プログラムはそのままメモリー上に残ってしまい不都合がありますので、ウインドウのクローズ処理だけは最初に追加しておきます。
class OthelloApp : public CWinApp
{
public:
virtual BOOL InitInstance();
virtual ~OthelloApp();
};
これはWindowsのプログラムの親になるクラスの宣言で、通常のC言語の main関数に相当するものと思って下さい。CWinApp クラスから派生させて OthelloApp というクラス名にしました。最初の宣言では、インスタンスの作成と、終了時の処理の2つがあればOKです。
BOOL OthelloApp::InitInstance()
{
m_pMainWnd = new Othello();
return TRUE;
}
は OthelloApp クラスのインスタンスが生成されるときの内容を定義するもので、ここでは、Othello クラスのウインドウ(インスタンス)を生成するのみです。
OthelloApp::~OthelloApp()
{
delete m_pMainWnd;
}
は、プログラムの終了時の OthelloApp クラスの処理で、生成してある Othello クラスのインスタンスを消去するのみです。
Othello::Othello()
{
Create("OTHELLO");
}
は Othello クラスのコンストラクタで、リソースの OTHELLO ダイアログをテンプレートにして生成しています。
afx_msg void Othello::OnClose()
{
PostQuitMessage(0);
}
は、ウインドウが閉じられるときの Othello クラスの処理で、Windowsに対して終わったよというメッセージを発行しています。この処理をしておかないと先程お話したようにメモリー上にプログラムが残ってしまいます。
BEGIN_MESSAGE_MAP(Othello,CDialog)
ON_WM_CLOSE()
END_MESSAGE_MAP()
は Othello クラスのメッセージマップでウインドウのクローズメッセージの処理のみを記述してあります。
OthelloApp OthelloApp;
は、OthelloApp クラスを生成しています。
リソースにアイコンを作成したときには、Othello クラスのコンストラクタの宣言を次のようにアイコンのハンドルを引数として受け取るようにし、
class Othello : public CDialog
{
private:
afx_msg void OnClose();
public:
Othello(HICON othello_icon);
DECLARE_MESSAGE_MAP()
};
OthelloApp クラスの InitInstance を、
BOOL OthelloApp::InitInstance()
{
m_pMainWnd=new Othello(LoadIcon("OTHELLO_ICON"));
return TRUE;
}
とします(ここではアイコンのリソース名を OTHELLO_ICON としています。
更に Othello のコンストラクタを、
Othello::Othello(HICON othello_icon)
{
Create("OTHELLO");
SetIcon(othello_icon,TRUE);
}
とするとウインドウのキャプションの左にアイコンが表示されます。しかしながらこのときには、リソースで定義したウインドウのタイトルがアイコンに隠れてしまいますので、次のようにアイコンを設定した後にウインドウのタイトルを設定するようにして下さい。
Othello::Othello(HICON othello_icon)
{
Create("OTHELLO");
SetIcon(othello_icon,TRUE);
SetWindowText("オセロゲーム");
}
プログラムのコンパイルは(プログラムのファイル名を a.cpp とします)DOSプロンプト内では、
cl /c /MT a.cpp
リンクは、
link /subsystem:windows a.obj othello.res
として行ないます。
続きはまた次回。






