华容道游戏实验报告
华容道

“华容道”小课题研究小结高靖淞一、课题名称:华容道二、参加人:高靖淞、夏子晴、况文洋、黄承天、李欣怡、顾维欣、周瑜玲、曾俊威等三、指导老师:秦老师四、基本情况:华容道游戏取自著名的三国故事,曹操在赤壁大战中被刘备和孙权的“苦肉计”、“铁索连舟”、“火烧赤壁”打败。
曹操被迫退逃到华容道,又遇上诸葛亮的伏兵。
关羽为了报答曹操对他的恩情,明逼实让,终于帮助曹操逃出了华容道。
游戏就是依照“曹操兵败走华容,正与关公狭路逢。
只为当初恩义重,放开金锁走蛟龙”这一故事情节设计的。
老师给我们讲:华容道是中国人发明的,最终解法是美国人用计算机求出的。
但华容道的设计原理到现在还没有搞清。
五、研究小结:在秦老师的指导下,我们研究小组经过了一学期的研究,收获很多。
我们通过查资料,了解到最早系统研究游戏华容道的是苏州大学数学教授许莼舫先生。
1952年,他在《数学漫谈》中对这个游戏作了详细的分析,总结出8条规则。
这8条可以归纳为以下4点:1.四个小兵必须两两在一起,不要分开;2.曹操、关羽、大将移动时前面应有两个小兵开路;3.曹操移动时后面还应有两个小兵追赶;4.以上三种状况,其中各块都可局部(不妨碍其他地方)任意移动。
资料显示:历经中外科学家姜长英、藤村幸三郎、清水达雄、马丁加达纳等几十年的努力,游戏解法已由六十多年前的87步减少至81步。
美国一个律师托马斯.莱曼发现一个新的解法,由加德纳公布在1964年3月《科学美国人》上,有81步,称加德纳解法。
华容道的最快走法在中国是100步,在日本是82步。
后来美国人用计算机,使用穷举法找出了最终解法,不可能有再快的解法了,81步。
华容道这个游戏虽然我还不会解,但是在小课题研究过程中,我了解了一些三国时期的历史,收获很多,这也算是“有心栽花花不活,无意插柳柳成荫”吧。
幼儿园三年级益智游戏:华容道教案

Title: 幼儿园三年级益智游戏:华容道教案在幼儿教育中,益智游戏是非常重要的一部分,它不仅可以培养孩子的逻辑思维能力,还能锻炼他们的耐心和专注力。
在三年级的幼儿园教育中,一款非常受欢迎的益智游戏就是华容道。
本文将从简到繁,由浅入深地探讨幼儿园三年级益智游戏:华容道教案,以便读者能更全面、深入地了解这一主题。
一、华容道游戏介绍让我们来了解一下华容道游戏的基本概念。
华容道源于我国古代的一种益智游戏,它的游戏道具是一块有着不同大小方块的木板,孩子们需要将这些方块按照规定的顺序和要求摆放在木板上,最终使得一块特殊的方块能够从木板的一个特定位置移动到另一个特定位置。
这个游戏看似简单,但却需要一定的逻辑推理和空间想象能力。
二、华容道益智游戏的教学目标在教育实践中,通过华容道益智游戏,可以让孩子们在玩耍中培养出解决问题的能力。
通过指导孩子们学习华容道,可以达到以下教学目标:1.提高孩子的逻辑思维能力。
在玩华容道游戏的过程中,孩子们需要分析问题、预测结果,并找到最佳的解决方案。
这样可以锻炼孩子的逻辑推理能力,培养他们的思维灵活性。
2.增强孩子的空间想象能力。
华容道游戏需要孩子们对方块的位置和移动轨迹进行合理安排,这需要他们具备一定的空间想象能力。
通过这样的游戏,可以促进孩子的空间感知和认知发展。
3.培养孩子的耐心和专注力。
华容道游戏需要孩子们长时间地思考和移动方块,这对他们的耐心和专注力提出了很高的要求。
通过长时间的训练,可以培养孩子们的耐心和专注能力。
三、华容道教学活动设计接下来,我们将为大家设计一份针对幼儿园三年级的华容道教学活动。
在这份活动设计中,我们将包括游戏规则的讲解、练习环节和小结回顾环节,以便全面地指导孩子们学习华容道。
活动一:规则讲解老师可以向幼儿们介绍华容道游戏的基本规则和玩法。
可以通过图片、书本或者幻灯片等形式来具体展示游戏的规则和目标,让孩子们对这个游戏有一个直观的认识。
活动二:练习环节在规则讲解之后,老师可以通过实际操作来引导孩子们练习华容道游戏。
华容道-一个传统的智利游戏的设计与实现的设计与实现

课程设计任务书
学生姓名:专业班级:
指导教师:刘春燕工作单位:信息工程系
设计题目:华容道-一个传统的智利游戏的设计与实现
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)设计一个游戏界面,完成以下简单的功能
(1)通过焦点事件控制人物颜色;
(2)通过键盘,鼠标事件实现人的移动;
(3)设计事件监听器。
设计报告撰写格式要求:
1、明确课程设计的目的和重要性,认真领会课程设计的题目,读懂课程设计指导书的要求,学会设计的基本方法与步骤,学会如何运用前修知识与收集、归纳相关资料解决具体问题的方法。
严格要求自己,要独立思考,按时、独立完成课程设计任务。
2、设计报告:要求层次清楚、整洁规范、不得相互抄袭,凡正文内容有整段完全相同者一律以抄袭论处。
设计报告正文字数不少于0.2万字(不包括附录)
时间安排:
消化资料、系统调查 1天
项目原型开发1天
系统功能实现 1天
系统验收 1天
系主任签字:2014 年9 月 5 日。
华容道Java提高型实验报告

X X学校提高型实验报告实验课题JA V A综合程序设计(提高型)(实验类型:□综合性■设计性□应用性)实验课程面向对象程序设计实验时间学生姓名:专业班级:学号:成绩:教师签名:日期:一.实验目的和要求1、深入了解图形用户界面基本组件窗口、按钮、文本框、选择框、滚动条等的使用方法,了解如何使用布局管理器对组件进行管理,以及如何使用 Java 的事件处理机制。
2、将所学知识进行综合运用,模仿设计具有实际意义的应用程序。
3、锻炼使用新类(没有介绍的)类的能力。
二.实验条件硬件:计算机一台软件:EditPlus、JDK1.6三.实验原理分析编写一个华容道传统的智利游戏,练习使用布局管理器设计一个华容道游戏界面,并练习使用事件监听器(鼠标事件、键盘事件和焦点事件)实现按钮的移动。
首先是界面设计,该界面主要包括十个人物按钮(马、曹操、关羽等)以及旁边的四个边框按钮和重新开始按钮。
对于人物按钮,我们可以创建Button按钮的子类,在该类中定义按钮的一些新的属性和焦点事件监听器,如按钮的标签名、按钮的颜色、按钮获得或失去焦点事件。
同时在设计该界面时要考虑到各个按钮的位置、大小等情况。
其次,是对界面上的各人物按钮添加相应的相应事件(鼠标事件、键盘事件),通过这两种事件去完成界面上各人物按钮的移动。
对重新开始按钮定义动作事件(ActionEvent)完成界面初始化功能(也就是各人物按钮重新归位)。
四.实验方案或步骤程序代码:import java.awt.*;import java.applet.*;import java.awt.event.*;import javax.swing.*;public class HuaRongRoad {public static void main(String args[]) {new Hua_Rong_Road();}}class Person extends JButton implements FocusListener {int number;Color c;Person(int number,String s) {super(s);this.number=number;c=getBackground();setFont(new Font("宋体",Font.CENTER_BASELINE,14));addFocusListener(this); // 当前按钮注册为本身的监视器}public void focusGained(FocusEvent e) {setBackground(Color.cyan);}public void focusLost(FocusEvent e) {setBackground(c);}}class Hua_Rong_Road extends JFrame implements KeyListener,MouseListener,ActionListener {Person person[]=new Person[10];JButton left,right,above,below;JButton restart=new JButton("重新开始");Container con;public Hua_Rong_Road() {init();setBounds(100,100,320,360);setVisible(true);validate();setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public void init() {con=getContentPane();con.setLayout(null);con.add(restart);restart.setBounds(100,5,120,25);restart.addActionListener(this);String name[]={"曹操","关羽","张","刘","马","许","兵","兵","兵","兵"};for(int i=0;i<name.length;i++) {person[i]=new Person(i,name[i]);person[i].addKeyListener(this); // 将当前窗口注册为person[i]的KeyEvent事件监视器person[i].addMouseListener(this); // 将当前窗口注册为person[i]的MouseEvent事件监视器con.add(person[i]);}person[0].setBounds(104,54,100,100);person[1].setBounds(104,154,100,50);person[2].setBounds(54, 154,50,100);person[3].setBounds(204,154,50,100);person[4].setBounds(54, 54, 50,100);person[5].setBounds(204, 54, 50,100);person[6].setBounds(54,254,50,50);person[7].setBounds(204,254,50,50);person[8].setBounds(104,204,50,50);person[9].setBounds(154,204,50,50);person[9].requestFocus(); // person[9]获取焦点left=new JButton();right=new JButton();above=new JButton();below=new JButton();con.add(left);con.add(right);con.add(above);con.add(below);left.setBounds(49,49,5,260);right.setBounds(254,49,5,260);above.setBounds(49,49,210,5);below.setBounds(49,304,210,5);con.validate();}public void keyPressed(KeyEvent e) {Person man=(Person)e.getSource(); // 返回事件源if(e.getKeyCode()==KeyEvent.VK_DOWN) { // 判断是否按了“↓”键goDown(man);}if(e.getKeyCode()==KeyEvent.VK_UP){ // 判断是否按了“↑”键goUp(man);}if(e.getKeyCode()==KeyEvent.VK_LEFT) { // 判断是否按了“←”键goLeft(man);}if(e.getKeyCode()==KeyEvent.VK_RIGHT) { // 判断是否按了“→”键goRight(man);}}public void keyTyped(KeyEvent e){}public void keyReleased(KeyEvent e){}public void mousePressed(MouseEvent e) {Person man=(Person)e.getSource(); // 返回事件源int x=1,y=1;x=e.getX();y=e.getY();int w=man.getBounds().width;int h=man.getBounds().height;if(y>h/2)goDown(man);if(y<h/2)goUp(man);if(x<w/2)goLeft(man);if(x>w/2)goRight(man);}public void mouseReleased(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mouseClicked(MouseEvent e) {} public void goDown(Person man) {boolean move=true;Rectangle manRect=man.getBounds();int x=man.getBounds().x;int y=man.getBounds().y;y=y+50;manRect.setLocation(x,y);Rectangle belowRect=below.getBounds();for(int i=0;i<10;i++) {Rectangle personRect=person[i].getBounds();if((manRect.intersects(personRect))&&(man.number!=i)) move=false;}if(manRect.intersects(belowRect))move=false;if(move==true)man.setLocation(x,y);}public void goUp(Person man) {boolean move=true;Rectangle manRect=man.getBounds();int x=man.getBounds().x;int y=man.getBounds().y;y=50;manRect.setLocation(x,y);Rectangle aboveRect=above.getBounds();for(int i=0;i<10;i++) {Rectangle personRect=person[i].getBounds();if((manRect.intersects(personRect))&&(man.number!=i)) move=false;}if(manRect.intersects(aboveRect))move=false;if(move==true)man.setLocation(x,y);}public void goLeft(Person man) {boolean move=true;Rectangle manRect=man.getBounds();int x=man.getBounds().x;int y=man.getBounds().y;x=x-50;manRect.setLocation(x,y);Rectangle leftRect=left.getBounds();for(int i=0;i<10;i++) {Rectangle personRect=person[i].getBounds();if((manRect.intersects(personRect))&&(man.number!=i)) move=false;}if(manRect.intersects(leftRect))move=false;if(move==true)man.setLocation(x,y);}public void goRight(Person man) {boolean move=true;Rectangle manRect=man.getBounds();int x=man.getBounds().x;int y=man.getBounds().y;x=x+50;manRect.setLocation(x,y);Rectangle rightRect=right.getBounds();for(int i=0;i<10;i++) {Rectangle personRect=person[i].getBounds();if((manRect.intersects(personRect))&&(man.number!=i)) move=false;}if(manRect.intersects(rightRect))move=false;if(move==true)man.setLocation(x,y);}public void actionPerformed(ActionEvent e) {con.removeAll();init();validate();repaint();}}五.实验结果与分析组件可以触发焦点事件。
幼儿园数学游戏华容道教案的趣味学习方式探索

幼儿园数学游戏华容道教案的趣味学习方式探索标题:幼儿园数学游戏华容道教案的趣味学习方式探索一、引言在幼儿园的数学教育中,数学游戏是一种非常有效的教学方式。
华容道作为一种数学游戏,可以通过趣味的方式来帮助幼儿学习数学知识。
本文将探讨如何通过华容道教案来进行趣味数学学习的方式。
二、华容道的基本介绍1. 华容道的起源及历史华容道是一种古老的中国智力游戏,起源于中国古代。
它的历史可以追溯到数百年前,至今仍然广受欢迎。
2. 华容道的玩法华容道是一种拼图游戏,游戏板由不同形状大小的木块组成。
玩家需要将所有木块移动,直到其中一个特定的块从游戏板的底部移到顶部,这就完成了华容道游戏。
3. 华容道对幼儿的益处通过玩华容道游戏,幼儿可以培养他们的逻辑思维能力、空间想象能力和手眼协调能力。
华容道游戏也可以激发幼儿对数学的兴趣,促进他们的数学学习。
三、华容道在幼儿园数学教育中的应用探索1. 制定华容道教案的目的和意义制定华容道教案的目的是为了通过这种趣味的数学游戏促进幼儿对数学的学习和理解。
在幼儿园的数学教育中,通过华容道教案的设计可以让幼儿在游戏中学习,提高他们的学习兴趣和参与度。
2. 制定华容道教案的具体步骤a. 确定教学目标:在制定华容道教案之前,需要确定教学目标,明确幼儿在华容道游戏中需要学习和掌握的数学知识和能力。
b. 设计游戏环节:根据幼儿的芳龄和兴趣特点,设计适合他们的华容道游戏环节,包括游戏规则、布置游戏场景等。
c. 进行游戏操作:教师引导幼儿进行华容道游戏,观察他们的游戏过程并及时给予指导和帮助。
d. 总结和反思:在游戏结束后,教师和幼儿一起总结游戏过程,反思游戏中遇到的问题和解决方法,从中学习数学知识。
3. 华容道教案的实施效果评估为了评估华容道教案的实施效果,可以通过观察幼儿在游戏中的表现、听取家长和幼儿的反馈等方式来了解教案的效果,并根据评估结果不断改进教案。
四、个人观点和理解华容道作为一种数学游戏,在幼儿园数学教育中具有重要的意义。
幼儿园华容道活动教案及反思

幼儿园华容道活动教案及反思教案标题:幼儿园华容道活动教案及反思教案目标:1. 培养幼儿的观察力、思维能力和解决问题的能力。
2. 提高幼儿的合作意识和团队合作能力。
3. 培养幼儿的耐心和毅力。
教学内容:1. 游戏介绍:向幼儿简单介绍华容道游戏的规则和目标。
2. 游戏准备:准备一套华容道拼图,确保每个幼儿都有机会参与。
3. 游戏过程:a. 分组:将幼儿分成小组,每组2-3人。
b. 拼图任务:给每个小组分发一套华容道拼图,要求小组合作完成拼图。
c. 时间限制:设定一定的时间限制,鼓励小组尽快完成任务。
d. 比赛评选:根据完成拼图的时间和准确性评选出胜利小组。
教学步骤:1. 游戏介绍:向幼儿简单介绍华容道游戏的规则和目标,让他们了解游戏的挑战性和乐趣。
2. 分组组织:将幼儿分成小组,确保每个小组都有一定的合作性质,避免有些小组中只有一个幼儿。
3. 游戏准备:将华容道拼图分发给每个小组,确保每个幼儿都能参与其中。
4. 游戏指导:向幼儿解释华容道拼图的规则,鼓励他们思考如何移动拼图块以完成整个图案。
5. 游戏实施:让小组开始合作进行拼图任务,并设定一定的时间限制。
6. 游戏结束:时间到后,停止游戏,评选出胜利小组,并对他们进行表扬和鼓励。
教学反思:1. 教学目标达成情况:检查幼儿是否能够理解和遵守游戏规则,是否能够合作完成拼图任务。
2. 教学方法评估:评估所采用的游戏方式是否能够激发幼儿的兴趣和参与度,是否能够培养他们的合作意识和团队合作能力。
3. 教学时间安排:评估所设定的时间限制是否合理,是否给予幼儿足够的时间来完成任务。
4. 教学资源准备:检查所准备的华容道拼图是否足够,是否能够满足每个小组的需求。
5. 教学效果评估:观察幼儿在游戏过程中的表现,是否能够培养他们的观察力、思维能力和解决问题的能力。
通过这个教案,希望能够帮助幼儿园教师在幼儿园华容道活动中提供专业的教案建议和指导,以促进幼儿的全面发展。
幼儿园游戏活动教案智力游戏华容道

幼儿园游戏活动教案智力游戏华容道一、设计意图华容道是一个经典的智力游戏,能够锻炼幼儿的观察能力、分析能力和逻辑思维能力。
通过让幼儿动手操作华容道游戏,帮助他们在游戏中学习,提高解决问题的能力。
二、活动目标1. 让幼儿了解华容道游戏的规则和玩法。
2. 培养幼儿的观察能力、分析能力和逻辑思维能力。
3. 提高幼儿的动手操作能力和空间想象力。
4. 培养幼儿的合作意识和竞争意识。
三、活动准备1. 经验准备:幼儿已具备一定的观察能力和空间想象力。
2. 物质准备:华容道游戏棋盘、棋子。
四、活动过程1. 导入环节:教师通过故事、图片等方式引出华容道游戏,激发幼儿的兴趣。
教师:小朋友们,今天我们要来玩一个非常有趣的智力游戏,叫做华容道。
这个游戏起源于中国古代,是一个非常受欢迎的智力游戏。
现在,让我们一起来了解一下这个游戏的规则和玩法吧!2. 教师讲解游戏规则和玩法。
教师:在这个游戏中,我们有一个棋盘,上面有一些棋子。
我们的目标是通过移动这些棋子,让红色的棋子从出口处离开棋盘。
但是,棋子只能沿着棋盘上的空格移动,不能跨越其他棋子。
而且,在移动棋子的过程中,不能将其他棋子移出棋盘。
3. 幼儿分组进行游戏,教师巡回指导。
教师:现在,请小朋友们分成小组,一起来玩这个游戏吧!看看哪个小组能够最快地让红色的棋子离开棋盘。
4. 分享与交流:游戏结束后,各小组展示成果,教师引导幼儿分享游戏心得,总结游戏经验。
教师:小朋友们,你们在游戏中遇到了哪些困难?是如何解决的?有没有什么好的方法可以更快地完成游戏?五、活动延伸1. 在益智区提供华容道游戏材料,让幼儿在自由活动时间继续挑战。
2. 鼓励幼儿尝试不同难度的华容道游戏,如增加棋子数量、改变棋盘形状等。
六、活动反思本次活动通过让幼儿动手操作华容道游戏,锻炼了他们的观察能力、分析能力和逻辑思维能力。
在游戏过程中,幼儿需要认真观察棋盘上的棋子布局,分析如何移动棋子才能让红色棋子顺利离开棋盘。
数字华容道问题的设计与实现

数字华容道问题的设计与实现数字华容道问题的设计与实现《数字华容道问题的设计与实现》实验报告班级:计本四班学号: 020386 姓名:刘宝同一、问题描述重排九宫是一个古老的单人智力游戏。
据说重排九宫起源于中国古时由三国演义故事“关羽义释曹操”而设计的智力玩具“华容道”,后来流传到欧洲,将人物变成数字。
原始的重排九宫问题是这样的:将数字1~8 按照任意次序排在3×3 的方格阵列中,留下一个空格。
与空格相邻的数字,允许从上,下,左,右方向移动到空格中。
游戏的最终目标是经过合法移动,将数字1~8 按行排好序。
在一般情况下,n2-1 谜问题是将数字1~n2-1 按照任意次序排在n×n 的方格阵列中,留下一个空格。
允许与空格相邻的数字从上,下,左,右4个方向移动到空格中。
游戏的最终目标是经过合法移动,将初始状态变换到目标状态。
n2-1谜问题的目标状态是将数字1~n2-1 按从小到大的次序排列,最后一个位置为空格。
二、问题求解分析编程任务:对于给定的n×n 方格阵列中数字 1~n2-1 初始排列,编程计算将初始排列经过合法移动变换为目标状态最少移动次数。
数据输入:由文件 input.txt 给出输入数据。
文件的第 1 行有 1 个正整数 n。
以下的 n 行是n×n 方格阵列的中数字 1~n2-1 的初始排列,每行有 n 个数字表示该行方格中的数字, 0 表示空格。
结果输出:将计算出的最少移动次数和相应的移动序列输出到文件output.txt。
第1 行是最少移动次数。
从第2 行开始,依次输出移动序列。
三、源程序关键代码#include#include#include#define Overflow 1#define N 3int goal[N][N]={1,2,3,8,0,4,7,6,5}; int zero[2],NodeQTY=0;int *z=zero;//记录0的位置,zero[0]:r行;zero[1]:c列typedef int Piece;struct Chessboard{//棋盘信息Piece pos[N][N];//记录每个数码a的位置r行c列int d,f,move;//d:深度;f:启发函数值;move:父节点移动到该节点的方式};struct LNode{Chessboard board;LNode *parent,*next;bool flag;};typedef LNode* List;int* Findzero(LNode* &Node){int i,j,zr[2];int *z=zr;for(i=0;i<n;i++){< p="">for(j=0;j<n;j++){< p="">if(Node->board.pos[i][j]==0){zr[0]=i+1;zr[1]=j+1;break;}}}return z;}int Wrong(LNode *Node){int w=0,i,j;for(i=0;i<n;i++){< p="">for(j=0;j<n;j++){< p="">if(Node->board.pos[i][j]!=goal[i][j]&&Nod e->board.pos[i][j]!=0) w++;}}return w;}int pick(LNode *Node){int w=0,i,j,ii,jj;for(i=0;i<n;i++){< p="">for(j=0;j<n;j++){< p="">if(Node->board.pos[i][j]!=goal[i][j]&&Nod e->board.pos[i][j]!=0){ for(ii=0;ii<n;ii++)< p="">for(jj=0;jj<n;jj++)< p="">if(Node->board.pos[i][j]==goal[ii][jj]){w=w+abs(ii-i)+abs(jj-j);break;}}}}return w;}LNode* extend(LNode *Node,int depth,int zero[2],int moveflag,int Choose){LNode* NewNode=new LNode;for(int i=0;i<n;i++){< p="">for(int j=0;j<n;j++){< p="">NewNode->board.pos[i][j]=Node->board.pos[i][j];}}switch(moveflag){case 1: //向左移,不能出界:zero[1]>=2NewNode->board.pos[zero[0]-1][zero[1]-1]=NewNode->board.pos[zero[0]-1][zero[1]-2];NewNode->board.pos[zero[0]-1][zero[1]-2]=0;break;case 2: //向右移,不能出界:zero[1]<=2NewNode->board.pos[zero[0]-1][zero[1]-1]=NewNode->board.pos[zero[0]-1][zero[1]];NewNode->board.pos[zero[0]-1][zero[1]]=0;break;case 3: //向上移,不能出界:zero[0]>=2NewNode->board.pos[zero[0]-1][zero[1]-1]=NewNode- >board.pos[zero[0]-2][zero[1]-1]; NewNode->board.pos[zero[0]-2][zero[1]-1]=0; break;case 4: //向下移,不能出界:zero[0]<=2 NewNode->board.pos[zero[0]-1][zero[1]-1]=NewNode- >board.pos[zero[0]][zero[1]-1];NewNode->board.pos[zero[0]][zero[1]-1]=0;break;}NewNode->board.d=depth+1;switch(Choose){case 1:NewNode->board.f=NewNode->board.d+Wrong(NewNode);bre ak;case 2:NewNode->board.f=NewNode->board.d+pick(NewNode);break;}NewNode->board.move=moveflag;NewNode->parent=Node;NodeQTY++;return NewNode;}void InitList(LNode* &Open,LNode* &Close) {Open=(List)malloc(sizeof(L Node));Close=(List)malloc(sizeof(L Node));if(!Open&&!Close)exit(Overflow);Open->next=NULL;Close->next=NULL;}int ListInsert(List &L,LNode* NewNode){List p=L;while(p->next){p=p->next;}NewNode->next=p->next;p->next=NewNode;return true;}LNode* Getminf(List &L){List p=L,q=L->next,r=L,min;min=q;//p,q寻找f最小值的指针,r指向表L中min前一个元素if(!q)return NULL;while(q){if(min->board.f>q->board.f){r=p;min=q;}p=q;q=q->next;}r->next=min->next;min->next=NULL;return min;}int main(){int i,j,choose;List Open,Close;LNode *Best,*current;LNode *Start=new LNode;printf("\t\t\t八数码问题求解\n");printf("\n请输入初始状态:");for(i=0;i<n;i++){< p="">for(j=0;j<n;j++){< p="">scanf("%d",&(Start->board.pos[i][j]));}}printf("(注:The flag of movement--1:左移;2:右移;3:上移;4:下移)\n");printf("初始棋盘状态:\n");for(i=0;i<n;i++){< p="">for(j=0;j<n;j++){< p="">printf("|%d",Start->board.pos[i][j]);}printf("|\n");}InitList(Open,Close);printf("请选择(1:A算法;2:A*算法):");scanf("%d",&choose);Start->board.d=0;switch(choose){case 1:Start->board.f=Start->board.d+Wrong(Start);break;case 2:Start->board.f=Start->board.d+pick(Start);break;} // Start->board.f=0+Wrong(Start);Start->board.move=0;Start->parent=NULL;Start->next=NULL;Start->flag=1;ListInsert(Open,Start);//将S加入到Open表中while(Open->next){Best=Getminf(Open);ListInsert(Close,Best);if(!(Best->board.f-Best->board.d)){printf("$$$******有解!******$$$\n");break;}z=Findzero(Best);zero[0]=*(z+0);zero[1]=*(z +1);if(zero[1]>=N-1&&Best->board.move!=2)ListInsert(Open,extend(Bes t,Best->board.d,zero,1,choose)); if(zero[1]<=N-1&&Best->board.move!=1)ListInsert(Open,extend(Bes t,Best->board.d,zero,2,choose)); if(zero[0]>=N-1&&Best->board.move!=4)ListInsert(Open,extend(Bes t,Best->board.d,zero,3,choose));if(zero[0]<=N-1&&Best->board.move!=3)ListInsert(Open,extend(Bes t,Best->board.d,zero,4,choose));}printf("本算法搜索图中总共扩展的节点数为:%d\n",NodeQTY);printf("\t最佳路径如下所示:\n");if(Open->next){while(Best->parent){Best->flag=1;Best=Best->parent;}List p=Close->next,q=Close->next;if(p==Start) q=p->next;else exit(1);int Step=0;while(p&&q)//在Close表中依标记找到路径{if(q->flag==1&&q->parent==p){printf("Step %d:0 move as the %d-flag of movement.\n",++Step,q->board.move);for(i=0;i<n;i++){< p="">for(j=0;j<n;j++){< p="">printf("|%d",q->board.pos[i][j]);}printf("|\n");}p=q;//记住父节点}q=q->next;}printf("到达目标状态!\n");}else printf("该问题无法求解!\n");}四、总结经过对这个游戏的编程和设计,进一步巩固了所学的专业课知识,在查阅了有关数字华容道问题编程的相关知识的同时,也进一步了解编程的方法,并学到了很多编程的技巧和经验。