本来要添加一个手动解的模块,后来要把button空间严格固定位置实在是很麻烦,就直接这样写了,有心人可以添加上去。
代码全部无偿开放,哈哈
界面如下:
代码如下:
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(200, 280),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, 1, 2, 3);
82 }
83
84 Graphics g = CreateGraphics();
85 Pen pn = new Pen(Color.Red);
86 g.DrawLine(pn, 200, 280, 300, 280);//横行
87 g.DrawLine(pn, 250, 30, 250, 280);//竖行
88 g.DrawLine(pn, 342, 280, 442, 280);//横行
89 g.DrawLine(pn, 392, 30, 392, 280);//竖行
90 g.DrawLine(pn, 484, 280, 584, 280);//横行
91 g.DrawLine(pn, 534, 30, 534, 280);//竖行
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, 200, 280, 300, 280);//横行
110 g.DrawLine(pn, 250, 30, 250, 280);//竖行
111 g.DrawLine(pn, 342, 280, 442, 280);//横行
112 g.DrawLine(pn, 392, 30, 392, 280);//竖行
113 g.DrawLine(pn, 484, 280, 584, 280);//横行
114 g.DrawLine(pn, 534, 30, 534, 280);//竖行
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 / 2, 255 - (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, 200, 280, 300, 280);//横行
150 g.DrawLine(pn, 250, 30, 250, 280);//竖行
151 g.DrawLine(pn, 342, 280, 442, 280);//横行
152 g.DrawLine(pn, 392, 30, 392, 280);//竖行
153 g.DrawLine(pn, 484, 280, 584, 280);//横行
154 g.DrawLine(pn, 534, 30, 534, 280);//竖行
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
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(200, 280),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, 1, 2, 3);
82 }
83
84 Graphics g = CreateGraphics();
85 Pen pn = new Pen(Color.Red);
86 g.DrawLine(pn, 200, 280, 300, 280);//横行
87 g.DrawLine(pn, 250, 30, 250, 280);//竖行
88 g.DrawLine(pn, 342, 280, 442, 280);//横行
89 g.DrawLine(pn, 392, 30, 392, 280);//竖行
90 g.DrawLine(pn, 484, 280, 584, 280);//横行
91 g.DrawLine(pn, 534, 30, 534, 280);//竖行
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, 200, 280, 300, 280);//横行
110 g.DrawLine(pn, 250, 30, 250, 280);//竖行
111 g.DrawLine(pn, 342, 280, 442, 280);//横行
112 g.DrawLine(pn, 392, 30, 392, 280);//竖行
113 g.DrawLine(pn, 484, 280, 584, 280);//横行
114 g.DrawLine(pn, 534, 30, 534, 280);//竖行
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 / 2, 255 - (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, 200, 280, 300, 280);//横行
150 g.DrawLine(pn, 250, 30, 250, 280);//竖行
151 g.DrawLine(pn, 342, 280, 442, 280);//横行
152 g.DrawLine(pn, 392, 30, 392, 280);//竖行
153 g.DrawLine(pn, 484, 280, 584, 280);//横行
154 g.DrawLine(pn, 534, 30, 534, 280);//竖行
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文件在下: