c#写的汉诺塔程序

/Files/hanyulcf/WinHanio.rar好久前写的一个程序了,刚开始的时候学c也好其他也好,都是用的控制台版的汉诺塔,一直没有写过图形界面的汉诺塔程序,刚接触c#的时候,就乱七八糟的谢了一堆代码实现汉诺塔的程序,用的button空间模拟塔层。
本来要添加一个手动解的模块,后来要把button空间严格固定位置实在是很麻烦,就直接这样写了,有心人可以添加上去。
代码全部无偿开放,哈哈
界面如下:

代码如下:
ContractedBlock.gif ExpandedBlockStart.gif hanio
  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Data;
  5 using System.Drawing;
  6 using System.Linq;
  7 using System.Text;
  8 using System.Windows.Forms;
  9 
 10 namespace WinHanio
 11 {
 12     public partial class Form1 : Form
 13     {
 14         public static Point p1 = new Point(200280),p2=new Point(342,280),p3=new Point(484,280);
 15         public static Button[] btn = new Button[9];
 16         public static LinkList[] T=new LinkList[3];
 17 
 18         public int sumnum = 0;
 19         public Form1()
 20         {
 21             InitializeComponent();
 22         }
 23 
 24         private void Grbox1_Enter(object sender, EventArgs e)
 25         {
 26 
 27         }
 28 
 29         private void Form1_Load(object sender, EventArgs e)
 30         {
 31             //Graphics g =this.CreateGraphics();
 32             //Pen pn = new Pen(Color.Red);
 33             //g.DrawLine(pn,200,280,300,280);
 34             for (int k = 0; k < 3; k++)
 35                 T[k] = new LinkList();
 36         }
 37 
 38         public static void move(int from,int target)
 39         {
 40             //T[2]
 41             string ms = "把第" + from.ToString() + "个杆最上面的圆盘放到第" + target.ToString()+"个杆上面;";
 42             MessageBox.Show(ms);
 43           //  this.listBox1.Items.Add(ms);
 44             //T[from - 1].head.data;是按钮数组的索引号
 45             Point pt=new Point();
 46             pt.X = 250 + (target-1* 142-btn[T[from - 1].head.data].Width/2;
 47             pt.Y = 255 - T[target - 1].length*20;
 48             btn[T[from - 1].head.data].Location = pt;            
 49             T[target - 1].add(T[from - 1].head.data);
 50             T[from - 1].del();
 51             
 52 
 53         }
 54 
 55         private void makeHanio(int t_num, int from, int mid, int target)
 56         {
 57             if (t_num == 1)
 58             {
 59                 Form1.move(from, target);
 60                 string ms = "把第" + from.ToString() + "个杆最上面的圆盘放到第" + target.ToString() + "个杆上面;";
 61                // MessageBox.Show(ms);
 62                 this.listBox1.Items.Add(ms);
 63                // this.listBox1
 64             }
 65             else
 66             {
 67                 makeHanio(t_num - 1, from, target, mid);
 68                 makeHanio(1, from, mid, target);
 69                 makeHanio(t_num - 1, mid, from, target);
 70             }
 71         }   
 72 
 73         private void button1_Click(object sender, EventArgs e)
 74         {
 75             
 76             //Graphics g = this.CreateGraphics();
 77             //Pen pn = new Pen(Color.Red);
 78             //g.DrawLine(pn, 200, 280, 300, 280);
 79             if (T[0].head != null)
 80             {
 81                 makeHanio(sumnum, 123);
 82             }
 83 
 84             Graphics g = CreateGraphics();
 85             Pen pn = new Pen(Color.Red);
 86             g.DrawLine(pn, 200280300280);//横行
 87             g.DrawLine(pn, 25030250280);//竖行
 88             g.DrawLine(pn, 342280442280);//横行
 89             g.DrawLine(pn, 39230392280);//竖行
 90             g.DrawLine(pn, 484280584280);//横行
 91             g.DrawLine(pn, 53430534280);//竖行
 92 
 93         }
 94 
 95         private void button2_Click(object sender, EventArgs e)
 96         {
 97             this.listBox1.Items.Clear();
 98             for (int k = 0; k < 9; k++)
 99             {
100                 if (btn[k] != null)
101                 {
102                     this.Controls.Remove(btn[k]);
103                     btn[k] = null;
104                 }
105             }
106             //以下全部是初始化界面
107             Graphics g = this.CreateGraphics();
108             Pen pn = new Pen(Color.Red);
109             g.DrawLine(pn, 200280300280);//横行
110             g.DrawLine(pn, 25030250280);//竖行
111             g.DrawLine(pn, 342280442280);//横行
112             g.DrawLine(pn, 39230392280);//竖行
113             g.DrawLine(pn, 484280584280);//横行
114             g.DrawLine(pn, 53430534280);//竖行
115             //初始化界面完毕
116 
117             sumnum = this.comboBox1.SelectedIndex + 1;
118            // this.button1.Text = i.ToString();
119             //i表示存储层数
120             //Button[] btn;
121 
122             
123 
124             for (int j = sumnum-1; j >=0;j-- )
125             {
126                 btn[j] = new Button();
127                 //btn[j]出现的位置
128 
129                 btn[j].Size = new Size(100 - 10 * (sumnum-j-1), 20);
130                 btn[j].Location = new Point(250 - btn[j].Size.Width / 2255 - (sumnum - j - 1* btn[j].Size.Height);
131 
132                 btn[j].Name = "btn" + j.ToString();
133                 btn[j].Text = (j+1).ToString();
134                 this.Controls.Add(btn[j]);  
135                 T[0].add(j);
136                
137             }
138             T[1].length = 0;
139             T[1].head = null;
140             T[2].length = 0;
141             T[2].head = null;
142 
143         }
144 
145         private void Form1_Activated(object sender, EventArgs e)
146         {
147             Graphics g = CreateGraphics();
148             Pen pn = new Pen(Color.Red);
149             g.DrawLine(pn, 200280300280);//横行
150             g.DrawLine(pn, 25030250280);//竖行
151             g.DrawLine(pn, 342280442280);//横行
152             g.DrawLine(pn, 39230392280);//竖行
153             g.DrawLine(pn, 484280584280);//横行
154             g.DrawLine(pn, 53430534280);//竖行
155             this.label5.Text = "解的详细步骤:(共" + (this.listBox1.Items.Count+1).ToString()+"步)";
156         }
157 
158         private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
159         {
160 
161         }
162 
163         
164     }
165     public class Node
166         //链表节点
167     {
168         public int data = 0;
169         public Node next=null;
170     }
171     public class LinkList
172     {//链表,直指链表尾,开始是要作为一个链表,发现不行,要改成一个栈,方便起见,类名字不再更改
173         public int length=0;
174         public Node head;
175         public void add(int snum)
176         {
177            
178             Node newnode=new Node();
179             newnode.data=snum;
180             if (length == 0)
181             {
182                 head = newnode;
183                 newnode.next = null;
184                 //head = newnode;
185                 length++;
186             }
187             else
188             {
189                 newnode.next = head;
190                 head = newnode;
191                // head = newnode;
192                 length++;
193             }
194         }
195         public void del()
196         {
197             if (length > 0)
198             {
199                 if (length == 1)
200                 {
201                     length = 0;
202                     head = null;
203                 }
204                 else
205                 {
206                    // Node k = head.next;
207                    // while (k.next != head)
208                     //    k = k.next;
209                     //k.next = head.next;
210                     head = head.next;
211                     length--;
212                 }
213             }
214         }
215     }
216 
217     public class hanio
218     {
219         //private int[] T = new int[3];//表示三根杆,每个值表示当前杆上有几个
220         private void makeHanio(int t_num,int from,int mid,int target)
221         {
222             if (t_num == 1)
223             {
224                 Form1.move(from,target);
225             }
226             else
227             {
228                 makeHanio(t_num-1,from,target,mid);
229                 makeHanio(1,from,mid,target);
230                 makeHanio(t_num-1,mid,from,target);
231             }
232         }        
233     }
234 }
235 


exe文件在下:

转载于:https://www.cnblogs.com/hanyulcf/archive/2009/07/30/1534917.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值