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 版の実行