
int[,,] m_t = new int[9,9,11]; //ナンプレ・テーブル
|
private void MyHandler(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
if (m_back.bmp == null) Application.Exit();
for (int y = 0; y < 9; y++)
{
for (int x = 0; x < 9; x++)
{
if (m_t[y, x, 10]>0 && m_t[y, x, 10]<7)
m_color.View(g, m_t[y, x, 10]-1, x*60+10, y*60+30);
if (m_t[y, x, 0]>0 && m_t[y, x, 0]<10)
m_num.View(g, m_t[y, x, 0], x*60+10, y*60+30);
if (m_hint && m_t[y, x, 0]==0) // Hint
{
for(int k=0; k<9; k++)
if (m_t[y, x, k+1] != 0)
{
int xw = x * 60 + 10 + (k % 3) * 20;
int yw = y * 60 + 30 + (k / 3) * 20;
m_mini.View(g, m_t[y, x, k+1], xw, yw);
}
}
}
}
m_back.View(g, 10, 30);
m_number.View(g, 10, 580);
if (m_OK)
{ Font f = new Font("MS ゴシック", 30);
g.DrawString("完成しました! \(^o^)/", f, Brushes.Red, new PointF(30F, 260F));
m_OK = false;
}
}
|
private void OnMyMouseDown(object sender, MouseEventArgs e)
{
int xp, yp, zp, k;
xp = (e.X - 10) / 60;
yp = (e.Y - 30) / 60;
zp = ((((e.Y - 30) % 60) / 20) * 3) + (((e.X - 10) % 60) / 20);
zp++;
if (e.Y > 580)
{ m_no = xp;
return;
}
if (xp > 8 || yp > 8) return; //0(1)~8(9)
if (m_t[yp, xp, 10] == 0) return; //出題文字
if (e.Button == MouseButtons.Left) //マウスの左ボタン(マスの設定)
{
if (m_col==false) //数字の設定/削除
{
for(k=1; k<10; k++) m_t[yp,xp,k] = 0;
if (m_t[yp, xp, 0] == 0) m_t[yp, xp, 0] = m_no + 1;
else m_t[yp, xp, 0] = 0;
}
else //マスの色を設定
{ if (m_t[yp, xp, 10] != 0)
{ m_t[yp, xp, 10] = (m_t[yp, xp, 10] + 1) % 5;
if (m_t[yp, xp, 10] == 0) m_t[yp, xp, 10] = 1;
}
}
}
if (e.Button == MouseButtons.Right) //マウスの右ボタン(ヒント数字の設定/削除)
{
if (zp>10) return;
m_hint = true;
if (m_col==false) //Hint 文字を設定
{
if (m_t[yp, xp, zp] == 0) m_t[yp, xp, zp] = zp;
else m_t[yp, xp, zp] = 0;
}
else //Hint 文字に色を設定
{ if (m_t[yp, xp, 0] == 0)
m_t[yp, xp, zp] = (m_t[yp, xp, zp]+10) % 60;
}
}
Invalidate();
}
|
public void SetHint()
{ int x,y,k,wn;
for(y=0; y<9; y++)
for(x=0; x<9; x++)
{ if (m_t[y,x,10]>4) m_t[y,x,10] = 1;
for(k=1; k<10; k++) m_t[y,x,k] = k;
}
for(y=0; y<9; y++)
for(x=0; x<9; x++)
{ wn = m_t[y,x,0];
if (wn!=0)
for(k=0; k<9; k++)
{ m_t[y,k,wn] = 0; //y行から消す
m_t[k,x,wn] = 0; //x列から消す
Del33(y,x); //3*3から消す
}
}
//Debug(m_ht);
}
|
// グループを調べてヒントをカラー表示する
private bool HintCor()
{ int[] chk = new int[10];
int i,j,k,wk,pt=0;
bool flag = false;
bool flg = false;
for(i=0; i<9; i++)
for(j=0; j<9; j++)
for(k=1; k<10; k++) m_t[i, j, k] = m_t[i, j, k] % 10;
// Hint から候補が一個のマスを調べる(赤色で表示)
for(i=0; i<9; i++)
for(j=0; j<9; j++)
{ if (m_t[i, j, 0] != 0) continue; //出題文字
wk = 0;
for(k=1; k<10; k++)
if (m_t[i, j, k]!=0)
{ wk++;
pt = k;
}
if (wk == 1)
{ m_t[i, j, pt] = pt + 50; //赤色に設定
flag = true;
//Debug("赤色設定", pt);
}
}
// グループ内で一個だけの数字を検索(確定)
for(i=0; i<29; i++)
{ if (i%10==9) continue;
GetLine(i); //グループを m_s[9,11] に抜き出す
flg = false;
for(k=0; k<10; k++) chk[k] = 0;
for(j=0; j<9; j++)
if (m_s[j,0]==0)
for(k=1; k<10; k++)
if (m_s[j, k] != 0) chk[k]++;
//Debug(chk);
for (k = 1; k < 10; k++)
{
if (chk[k] == 1) //グループ内でkは一個
for (j = 0; j < 9; j++)
if (m_s[j, 0] == 0 && m_s[j, k] == k)
{ m_s[j, k] = k + 40;
flg = true;
flag = true;
}
}
if (flg) SetLine(i);
}
return flag;
}
|


[Next Chapter ↓] 世界一数独
[Previous Chapter ↑] Alpha 版の実行