<script language="javascript" src="http://usms.tom.com/wxqy_subscribe_new.js?tomuserid=9247" type="text/javascript"></script> | 在ImageList控件里加入空白棋子的两幅图片. using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; namespace WindowsApplication2 { public class Form1 : System.Windows.Forms.Form { private System.Windows.Forms.MainMenu mainMenu1; private System.Windows.Forms.MenuItem menuItem1; private System.Windows.Forms.MenuItem menuItem2; private System.Windows.Forms.MenuItem menuItem3; private System.Windows.Forms.MenuItem menuItem4; private System.Windows.Forms.MenuItem menuItem5; private System.Windows.Forms.MenuItem menuItem6; private System.Windows.Forms.MenuItem menuItem7; private System.ComponentModel.IContainer components; private System.Windows.Forms.ImageList imageList1; private const int None = -1;//没有棋子 private const int White = 0;//代表白棋 private const int Black = 1;//代表黑棋 private int [,]checkerBoard = new int [15, 15];//棋盘(用来保存每一个棋子) private int nextPlayer;//下一个选手 private int Player { get { return nextPlayer; } set { nextPlayer = value; ReDrawNextPlayerMark(); } } private System.Windows.Forms.MenuItem menuItem8; private System.Windows.Forms.MenuItem menuItem9; private System.Windows.Forms.MenuItem menuItem10;//下一次该黑棋还是白棋下 private Stack History;//下棋的历史记录 public Form1() { // // Required for Windows Form Designer support // InitializeComponent(); // // TODO: Add any constructor code after InitializeComponent call // checkerBoard = new int [15,15]; History = new Stack(); Player = White;//默认设置为白棋先下 Reset(); } /// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.components = new System.ComponentModel.Container(); System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Form1)); this.menuItem8 = new System.Windows.Forms.MenuItem(); this.menuItem9 = new System.Windows.Forms.MenuItem(); this.menuItem4 = new System.Windows.Forms.MenuItem(); this.menuItem5 = new System.Windows.Forms.MenuItem(); this.menuItem6 = new System.Windows.Forms.MenuItem(); this.menuItem7 = new System.Windows.Forms.MenuItem(); this.menuItem1 = new System.Windows.Forms.MenuItem(); this.menuItem10 = new System.Windows.Forms.MenuItem(); this.menuItem2 = new System.Windows.Forms.MenuItem(); this.menuItem3 = new System.Windows.Forms.MenuItem(); this.mainMenu1 = new System.Windows.Forms.MainMenu(); this.imageList1 = new System.Windows.Forms.ImageList(this.components); // // menuItem8 // this.menuItem8.Index = 3; this.menuItem8.Shortcut = System.Windows.Forms.Shortcut.AltBksp; this.menuItem8.Text = "悔一步棋 (&H)"; this.menuItem8.Click += new System.EventHandler(this.menuItem8_Click); // // menuItem9 // this.menuItem9.Index = 1; this.menuItem9.Text = "-"; // // menuItem4 // this.menuItem4.Index = 1; this.menuItem4.Text = "关于… (&A)"; this.menuItem4.Click += new System.EventHandler(this.menuItem4_Click_1); // // menuItem5 // this.menuItem5.Index = 0; this.menuItem5.Shortcut = System.Windows.Forms.Shortcut.CtrlN; this.menuItem5.Text = "重新开始 (&N)"; this.menuItem5.Click += new System.EventHandler(this.menuItem5_Click); // // menuItem6 // this.menuItem6.Index = 5; this.menuItem6.Shortcut = System.Windows.Forms.Shortcut.CtrlX; this.menuItem6.Text = "退出 (&X)"; this.menuItem6.Click += new System.EventHandler(this.menuItem6_Click); // // menuItem7 // this.menuItem7.Index = 4; this.menuItem7.Text = "-"; // // menuItem1 // this.menuItem1.Index = 0; this.menuItem1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.menuItem5, this.menuItem9, this.menuItem10, this.menuItem8, this.menuItem7, this.menuItem6}); this.menuItem1.Text = "系统 (&S)"; this.menuItem1.Popup += new System.EventHandler(this.menuItem1_Popup); this.menuItem1.Click += new System.EventHandler(this.menuItem1_Click); // // menuItem10 // this.menuItem10.Index = 2; this.menuItem10.Text = "黑棋先下 (&B)"; this.menuItem10.Click += new System.EventHandler(this.menuItem10_Click); // // menuItem2 // this.menuItem2.Index = 1; this.menuItem2.MdiList = true; this.menuItem2.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.menuItem3, this.menuItem4}); this.menuItem2.Text = "帮助 (&H)"; this.menuItem2.Click += new System.EventHandler(this.menuItem2_Click); // // menuItem3 // this.menuItem3.Index = 0; this.menuItem3.Shortcut = System.Windows.Forms.Shortcut.F1; this.menuItem3.Text = "使用方法"; this.menuItem3.Click += new System.EventHandler(this.menuItem3_Click_1); // // mainMenu1 // this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.menuItem1, this.menuItem2}); // // imageList1 // this.imageList1.ColorDepth = System.Windows.Forms.ColorDepth.Depth24Bit; this.imageList1.ImageSize = new System.Drawing.Size(20, 20); this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream"))); this.imageList1.TransparentColor = System.Drawing.Color.Transparent; // // Form1 // this.AccessibleDescription = ""; this.AllowDrop = true; this.AutoScale = false; this.AutoScaleBaseSize = new System.Drawing.Size(10, 25); this.BackgroundImage = ((System.Drawing.Bitmap)(resources.GetObject("$this.BackgroundImage"))); this.ClientSize = new System.Drawing.Size(325, 333); this.Cursor = System.Windows.Forms.Cursors.Hand; this.Font = new System.Drawing.Font("Microsoft Sans Serif", 16F); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.ImeMode = System.Windows.Forms.ImeMode.Off; this.MaximizeBox = false; this.Menu = this.mainMenu1; this.Name = "Form1"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "五子棋"; this.Load += new System.EventHandler(this.Form1_Load); } #endregion /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.Run(new Form1()); } private void menuItem4_Click(object sender, System.EventArgs e) { this.Close(); } private void menuItem3_Click(object sender, System.EventArgs e) { } private void Form1_Load(object sender, System.EventArgs e) { } private void menuItem1_Click(object sender, System.EventArgs e) { } private void menuItem4_Click_1(object sender, System.EventArgs e) { (new About()).ShowDialog(); } private void menuItem2_Click(object sender, System.EventArgs e) { } private void menuItem3_Click_1(object sender, System.EventArgs e) { new Help().ShowDialog(); } private void menuItem6_Click(object sender, System.EventArgs e) { this.Close(); } private void menuItem5_Click(object sender, System.EventArgs e) { if(History.Count > 0) this.Reset(); } private void menuItem8_Click(object sender, System.EventArgs e) { Penitence(); } //重载重画函数 protected override void OnPaint(PaintEventArgs e) { System.Drawing.Graphics g = this.CreateGraphics(); for(int x = 0; x < 15; x++) { for(int y= 0; y < 15; y++) { if(checkerBoard[ y, x ] != None) DrawChess(new Point(x, y), checkerBoard[ y, x ]); } } ReDrawNextPlayerMark(); base.OnPaint(e); } //重载鼠标按下事件 protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs e) { base.OnMouseDown(e); switch( e.Button ) { //take left button down case MouseButtons.Left: if( (History.Count == 0) && (2 < e.X) && (e.X < 22) && (309 < e.Y) && (e.Y < 329) ) Player = (Player == White)? Black: White; else AddChess( MToA( new Point(e.X, e.Y) ) ); break; //take right button down case MouseButtons.Right: // OnRButtonDown(new Point(e.X,e.Y)); break; } } //把鼠标坐标转换成棋盘坐标 private Point MToA(Point p) { return new Point( (p.X - 15) / 20, (p.Y - 6) / 20); } //开始新的棋局,所有数据复位并重画棋盘 private void Reset() { for( int i = 0; i < 15; i++ ) { for( int j = 0; j < 15; j++) { checkerBoard[i,j] = None; } } History.Clear();//清空历史记录 DrawCheckerBoard();//重画棋盘 } //重画棋盘 private void DrawCheckerBoard() { this.BackColor = System.Drawing.SystemColors.Desktop; this.BackColor = System.Drawing.SystemColors.Control; } //重画下一个选手的标志棋子 private void ReDrawNextPlayerMark() { System.Drawing.Graphics g = this.CreateGraphics(); imageList1.Draw(g, 2, 309, 20, 20, Player); } //在棋盘上画一个棋子 private void DrawChess(Point pCoordinates,int iPlayer) { System.Drawing.Graphics g = this.CreateGraphics(); imageList1.Draw(g, 15 + pCoordinates.X * 20, 6 + pCoordinates.Y * 20, 20, 20, iPlayer); } //在指定的棋盘坐标位置添加一个棋子 private void AddChess(Point p) { //判断是否超出边界 if( (p.X < 0 || p.X > 14) || (p.Y < 0 || p.Y > 14) ) return; //判断该位置有无棋子 if( checkerBoard[ p.Y, p.X ] != None ) return;//如果已经有了棋子则退出(这颗棋不能下) DrawChess( p,Player ); if(Player == White)//该白棋下 { checkerBoard[ p.Y, p.X ] = White; Player = Black; } else { checkerBoard[ p.Y, p.X ] = Black; Player = White; } History.Push( new Point(p.X, p.Y) );//添加历史记录 CheckGameResult( p ); } //检查游戏结果 /* * 算法: * 由于根据游戏规则,只有先放成 5 个相连的棋子的一方或剩, * 所以只要以刚刚下过的那个棋子为中心,检查有没有 5 个相连的同颜色棋子就好了。 */ private void CheckGameResult(Point sourcePoint) { int x,y; int LastPlayer = (Player == White)? Black: White; int n; //检查行 n = 1; y = sourcePoint.Y; for(x = sourcePoint.X - 1; x >= 0; x--) { if(checkerBoard[ y, x ] == LastPlayer) n++; else break; } for(x = sourcePoint.X + 1; x < 15; x++) { if(checkerBoard[ y, x ] == LastPlayer) n++; else break; } if(n >= 5) { Win(LastPlayer); return; } //检查列 n = 1; x = sourcePoint.X; for(y = sourcePoint.Y - 1; y >= 0; y--) { if(checkerBoard[ y, x ] == LastPlayer) n++; else break; } for(y = sourcePoint.Y + 1; y < 15; y++) { if(checkerBoard[ y, x ] == LastPlayer) n++; else break; } if(n >= 5) { Win(LastPlayer); return; } //检查左斜线 n=1; for(x = sourcePoint.X + 1 , y = sourcePoint.Y - 1; x < 15 && y >= 0; x++, y--)//检查左斜线的上半截 { if(checkerBoard[ y, x ] == LastPlayer) n++; else break; } for(x = sourcePoint.X - 1 , y = sourcePoint.Y + 1; x >= 0 && y < 15; x--, y++)//检查左斜线的下半截 { if(checkerBoard[ y, x ] == LastPlayer) n++; else break; } if(n >= 5) { Win(LastPlayer); return; } //检查右斜线 n = 1; for(x = sourcePoint.X - 1 , y = sourcePoint.Y - 1; x >= 0 && y >= 0; x--, y--)//检查右斜线的上半截 { if(checkerBoard[ y, x ] == LastPlayer) n++; else break; } for(x = sourcePoint.X + 1 , y = sourcePoint.Y + 1; x < 15 && y < 15; x++, y++)//检查右斜线的下半截 { if(checkerBoard[ y, x ] == LastPlayer) n++; else break; } if(n >= 5) { Win(LastPlayer); return; } //棋盘满棋,平手 if(History.Count >= 225) { Win(None); return; } } //显示指定选手的获胜信息 private void Win(int NPlayer) { switch(NPlayer) { case None: MessageBox.Show("本局平手!","恭喜!"); break; case White: MessageBox.Show("本局 白棋 获胜 !","恭喜!"); break; case Black: MessageBox.Show("本局 黑棋 获胜 !","恭喜!"); break; } Reset(); } //悔棋 1 步 private void Penitence() { if(History.Count > 0) { Point p = (Point)History.Pop(); checkerBoard[ p.Y, p.X ] = None; nextPlayer = (Player == White)? Black: White; DrawCheckerBoard(); } } private void menuItem10_Click(object sender, System.EventArgs e) { Player = (Player == White)? Black: White; } private void menuItem1_Popup(object sender, System.EventArgs e) { if(History.Count == 0) { menuItem10.Visible = true; menuItem10.Text = (Player == White)? "黑棋先下 (&B)": "白棋先下 (&W)"; } else menuItem10.Visible = false; } } } |