// マウスのクリックでプレイする(左:黒, 右:白)
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Collections;
using System.Diagnostics;
public class MyForm : Form
{
int[,] m_t = new int[8, 8]
{{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 1, -1, 0, 0, 0 },
{ 0, 0, 0, -1, 1, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0 }};
// Constructor
public MyForm()
{
BackColor = SystemColors.AppWorkspace;
Width = 560;
Height = 600;
Paint += new PaintEventHandler(MyHandler);
MouseDown += new MouseEventHandler(OnMyMouseDown);
}
// オセロ盤の描画
private void MyHandler(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
g.DrawImage(new Bitmap("c:\\data\\test\\ban.gif"), new PointF(10F, 10F));
for (int y = 0; y < 8; y++)
{
for (int x = 0; x < 8; x++)
{
if (m_t[y, x] == 1) g.DrawImage(new Bitmap("c:\\data\\test\\koma_b.gif"), new PointF(x * 61 + 28, y * 61 + 24));
if (m_t[y, x] == -1) g.DrawImage(new Bitmap("c:\\data\\test\\koma_w.gif"), new PointF(x * 61 + 28, y * 61 + 24));
}
}
if (Count(0, m_t) == 0)
{
string str = "★Game Over 黒:" + Count(1, m_t).ToString() + " 白:" + Count(-1, m_t).ToString();
MessageBox.Show(str);
}
}
// マウスのクリック
private void OnMyMouseDown(object sender, MouseEventArgs e)
{
int x, y;
x = (e.X - 28) / 61;
y = (e.Y - 24) / 61;
if (e.Button == MouseButtons.Left)
{
if (Reverse(1, x, y, m_t) == false) MessageBox.Show("置くことはできません");
}
if (e.Button == MouseButtons.Right)
{
if (Reverse(-1, x, y, m_t) == false) MessageBox.Show("置くことはできません");
}
Invalidate();
}
// t[y,x] に駒を置いて、挟んだ駒を裏返す
bool Reverse(int c, int xp, int yp, int[,] t)
{
int i, j, x, y;
bool sw = false;
int nc = 0-c;
if (yp > 7 || xp > 7 || yp < 0 || xp < 0 || c == 0 || t[yp, xp] != 0) return false;
for (i = -1; i < 2; i++)
for (j = -1; j < 2; j++)
{
y = yp + i;
x = xp + j;
if (y < 8 && x < 8 && y >= 0 && x >= 0 && t[y, x] == nc)
{
for (; y < 8 && x < 8 && y >= 0 && x >= 0 && t[y, x] == nc; y += i, x += j) ;
if (y < 8 && x < 8 && y >= 0 && x >= 0 && t[y, x] == c)
{
for (; y != yp || x != xp; y -= i, x -= j) t[y, x] = c;
sw = true;
}
}
}
if (sw == false) return false;
t[yp, xp] = c;
return true;
}
// 駒のカウント
int Count(int c, int[,] t)
{
int cnt= 0;
for (int y = 0; y < 8; y++)
{
for (int x = 0; x < 8; x++)
if (t[y, x] == c) cnt++;
}
return cnt;
}
void t_Log(int sz, int[,] t)
{
string str = "";
for (int y = 0; y < sz; y++)
{
for (int x = 0; x < sz; x++)
{
if (t[y, x] == 0) str = str + ".";
if (t[y, x] == 1) str = str + "X";
if (t[y, x] == -1) str = str + "O";
}
str = str + "\n";
}
Debug.Write(str);
}
}
class osero
{
public static void Main()
{
MyForm mf = new MyForm();
Application.Run(mf);
}
}
|