using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;namespace FiveChess
{
public partial class Form1 : Form
{
private int Player = 1;
private string game = "";
private int [,]Position=new int[15,15];
private int count = 0; public Form1()
{
InitializeComponent();
} private void Change()
{
for(int i=0;i<15;++i)
for(int j=0;j<15;++j)
Position[i,j]=2; //2表示空地,1表示黑棋,0表示白棋
} protected override void OnPaint(PaintEventArgs e) //画棋盘
{
Point StartPoint = new Point(30, 50);
Pen BlackPen = new Pen(Brushes.Black);
BlackPen.Width = 1.5F;
for (int i = 0; i < 15; ++i) //行
{
e.Graphics.DrawLine(BlackPen, new Point(30, 50 + 30 * i), new Point(450, 50 + 30 * i));
}
for (int i = 0; i < 15; ++i) //列
{
e.Graphics.DrawLine(BlackPen, new Point(30 + 30 * i, 50), new Point(30 + 30 * i, 470));
}
BlackPen.Dispose();
e.Graphics.Dispose();
} private void Form1_MouseClick(object sender, MouseEventArgs e) //下棋
{
Graphics g = this.CreateGraphics();
if (e.X < 465 && e.X > 20 && e.Y < 485 && e.Y > 40 && e.X % 30 <= 15 && (e.Y - 50) % 30 <= 15 && game == "开始")
{
PaintChess(g, e.X - e.X % 30, e.Y - (e.Y - 50) % 30);
}
g.Dispose();
} private void PaintChess(Graphics g, int x, int y) //画棋子
{
Brush BrushChess;
if (Position[x / 30 - 1, (y - 50) / 30] == 2)
{
if (Player == 1)
{
BrushChess = new SolidBrush(Color.Black);
Position[x / 30 - 1, (y - 50) / 30] = 1;
g.FillEllipse(BrushChess, x - 10, y - 10, 20, 20);
this.labelPlayer.Text = "白";
BrushChess.Dispose();
}
else
{
BrushChess = new SolidBrush(Color.White);
Position[x / 30 - 1, (y - 50) / 30] = 0;
g.FillEllipse(BrushChess, x - 10, y - 10, 20, 20);
this.labelPlayer.Text = "黑";
BrushChess.Dispose();
}
CheckResult(x / 30 - 1, (y - 50) / 30);
count++;
Player = (Player + 1) % 2;
}
else
MessageBox.Show("此处已有棋子,请在空处下棋子");
g.Dispose();
}
private void CheckResult(int x,int y) //此处所说的棋盘不是窗口上面的棋盘,而是按照数学中直角坐标系构建的棋盘
{
int n,a,b;
a = x;
b = y; //检查行
n = 0;
for (a = x ; a >= 0; --a) //检查左边
{
if (Position[a, b] == Player)
++n;
else
break;
}
for (a = x ; a < 15; ++a) //检查右边
{
if (Position[a, b] == Player)
++n;
else
break;
}
if (n > 5)
{
Win(Player);
return;
} //检查列,下,上。
n = 0; a = x;
for (b = y ; b >= 0; --b)
{
if (Position[a, b] == Player)
++n;
else
break;
}
for (b = y ; b < 15;++b )
{
if (Position[a, b] == Player)
++n;
else
break;
}
if (n > 5)
{
Win(Player);
return;
} //检查左斜线
n = 0;
for (a = x , b = y; a < 15 && b <15; a++, b++)//检查左斜线的上半截
{
if (Position[a, b] == Player)
++n;
else
break;
}
for (a = x, b = y ; a >= 0 && b >=0; a--, b--)//检查左斜线的下半截
{
if (Position[a, b] == Player)
++n;
else
break;
}
if (n > 5)
{
Win(Player);
return;
} //检查右斜线
n = 0;
for (a=x , b=y ; a >= 0 && b <15; a--, b++)//检查右斜线的上半截
{
if (Position[a, b] == Player)
++n;
else
break;
}
for (a = x, b = y ; a <15 && b >=0; a++, b--)//检查右斜线的下半截
{
if (Position[a, b] == Player)
++n;
else
break;
}
if (n > 5)
{
Win(Player);
return;
}
} private void Win(int w)
{
if (count == 225)
MessageBox.Show("本局平手!");
else
{
if (w == 1)
MessageBox.Show("本局黑棋获胜!");
if (w == 0)
MessageBox.Show("本局白棋获胜!");
}
Application.Exit();
} private void 开始ToolStripMenuItem_Click(object sender, EventArgs e)
{
game = "开始";
this.labelPlayer.Text = "黑";
Change();
} private void 结束ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (MessageBox.Show("是否确定退出游戏?", "选择", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
Application.Exit();
} private void 关于ToolStripMenuItem_Click(object sender, EventArgs e)
{
string output;
output="规则简单,大家都知道,在此不多说。\r\n";
output += "由于技术浅薄,本游戏暂时不支持悔棋。\r\n";
output += "感谢各位朋友对作者精神和技术上的帮助!!不胜感激!!\r\n";
MessageBox.Show(output);
}
}
}代码如上,当最小化或者窗口被别的窗口遮盖住之后,所遮盖部分的棋子就会被清除,但是棋盘不会被清除。我想,如果把画棋子的那部分也加到OnPain里面的话,那每下一次棋子就要重新画之前的每个棋子,很麻烦。不知道又没有别的和OnPaint类似的函数,可以让棋子不被覆盖。
我是初学者,刚刚大三,纯属自学,又没有获得哪个的亲自指导,非常多非常多的东西还不懂,希望高手帮忙解决一下。而且我也没多少分可以给,希望大家就当是做点好事,帮帮我。
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;namespace FiveChess
{
public partial class Form1 : Form
{
private int Player = 1;
private string game = "";
private int [,]Position=new int[15,15];
private int count = 0; public Form1()
{
InitializeComponent();
} private void Change()
{
for(int i=0;i<15;++i)
for(int j=0;j<15;++j)
Position[i,j]=2; //2表示空地,1表示黑棋,0表示白棋
} protected override void OnPaint(PaintEventArgs e) //画棋盘
{
Point StartPoint = new Point(30, 50);
Pen BlackPen = new Pen(Brushes.Black);
BlackPen.Width = 1.5F;
for (int i = 0; i < 15; ++i) //行
{
e.Graphics.DrawLine(BlackPen, new Point(30, 50 + 30 * i), new Point(450, 50 + 30 * i));
}
for (int i = 0; i < 15; ++i) //列
{
e.Graphics.DrawLine(BlackPen, new Point(30 + 30 * i, 50), new Point(30 + 30 * i, 470));
}
BlackPen.Dispose();
e.Graphics.Dispose();
} private void Form1_MouseClick(object sender, MouseEventArgs e) //下棋
{
Graphics g = this.CreateGraphics();
if (e.X < 465 && e.X > 20 && e.Y < 485 && e.Y > 40 && e.X % 30 <= 15 && (e.Y - 50) % 30 <= 15 && game == "开始")
{
PaintChess(g, e.X - e.X % 30, e.Y - (e.Y - 50) % 30);
}
g.Dispose();
} private void PaintChess(Graphics g, int x, int y) //画棋子
{
Brush BrushChess;
if (Position[x / 30 - 1, (y - 50) / 30] == 2)
{
if (Player == 1)
{
BrushChess = new SolidBrush(Color.Black);
Position[x / 30 - 1, (y - 50) / 30] = 1;
g.FillEllipse(BrushChess, x - 10, y - 10, 20, 20);
this.labelPlayer.Text = "白";
BrushChess.Dispose();
}
else
{
BrushChess = new SolidBrush(Color.White);
Position[x / 30 - 1, (y - 50) / 30] = 0;
g.FillEllipse(BrushChess, x - 10, y - 10, 20, 20);
this.labelPlayer.Text = "黑";
BrushChess.Dispose();
}
CheckResult(x / 30 - 1, (y - 50) / 30);
count++;
Player = (Player + 1) % 2;
}
else
MessageBox.Show("此处已有棋子,请在空处下棋子");
g.Dispose();
}
private void CheckResult(int x,int y) //此处所说的棋盘不是窗口上面的棋盘,而是按照数学中直角坐标系构建的棋盘
{
int n,a,b;
a = x;
b = y; //检查行
n = 0;
for (a = x ; a >= 0; --a) //检查左边
{
if (Position[a, b] == Player)
++n;
else
break;
}
for (a = x ; a < 15; ++a) //检查右边
{
if (Position[a, b] == Player)
++n;
else
break;
}
if (n > 5)
{
Win(Player);
return;
} //检查列,下,上。
n = 0; a = x;
for (b = y ; b >= 0; --b)
{
if (Position[a, b] == Player)
++n;
else
break;
}
for (b = y ; b < 15;++b )
{
if (Position[a, b] == Player)
++n;
else
break;
}
if (n > 5)
{
Win(Player);
return;
} //检查左斜线
n = 0;
for (a = x , b = y; a < 15 && b <15; a++, b++)//检查左斜线的上半截
{
if (Position[a, b] == Player)
++n;
else
break;
}
for (a = x, b = y ; a >= 0 && b >=0; a--, b--)//检查左斜线的下半截
{
if (Position[a, b] == Player)
++n;
else
break;
}
if (n > 5)
{
Win(Player);
return;
} //检查右斜线
n = 0;
for (a=x , b=y ; a >= 0 && b <15; a--, b++)//检查右斜线的上半截
{
if (Position[a, b] == Player)
++n;
else
break;
}
for (a = x, b = y ; a <15 && b >=0; a++, b--)//检查右斜线的下半截
{
if (Position[a, b] == Player)
++n;
else
break;
}
if (n > 5)
{
Win(Player);
return;
}
} private void Win(int w)
{
if (count == 225)
MessageBox.Show("本局平手!");
else
{
if (w == 1)
MessageBox.Show("本局黑棋获胜!");
if (w == 0)
MessageBox.Show("本局白棋获胜!");
}
Application.Exit();
} private void 开始ToolStripMenuItem_Click(object sender, EventArgs e)
{
game = "开始";
this.labelPlayer.Text = "黑";
Change();
} private void 结束ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (MessageBox.Show("是否确定退出游戏?", "选择", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
Application.Exit();
} private void 关于ToolStripMenuItem_Click(object sender, EventArgs e)
{
string output;
output="规则简单,大家都知道,在此不多说。\r\n";
output += "由于技术浅薄,本游戏暂时不支持悔棋。\r\n";
output += "感谢各位朋友对作者精神和技术上的帮助!!不胜感激!!\r\n";
MessageBox.Show(output);
}
}
}代码如上,当最小化或者窗口被别的窗口遮盖住之后,所遮盖部分的棋子就会被清除,但是棋盘不会被清除。我想,如果把画棋子的那部分也加到OnPain里面的话,那每下一次棋子就要重新画之前的每个棋子,很麻烦。不知道又没有别的和OnPaint类似的函数,可以让棋子不被覆盖。
我是初学者,刚刚大三,纯属自学,又没有获得哪个的亲自指导,非常多非常多的东西还不懂,希望高手帮忙解决一下。而且我也没多少分可以给,希望大家就当是做点好事,帮帮我。
这里有我写的一个五子棋程序.没加注释,看起来可能有点吃力.慢慢看啊.祝你好运啊!