五子棋-课程设计报告
- 格式:doc
- 大小:149.00 KB
- 文档页数:36
五子棋棋类社团活动计划及教案教案标题:五子棋棋类社团活动计划及教案教案目标:1. 培养学生对五子棋的兴趣和热爱。
2. 提高学生的逻辑思维能力和决策能力。
3. 培养学生的团队合作精神和沟通能力。
教案步骤:第一步:活动介绍和目标设定(15分钟)- 向学生简要介绍五子棋的基本规则和背景知识。
- 解释活动的目标,包括培养学生对五子棋的兴趣和热爱,提高逻辑思维能力和决策能力,培养团队合作精神和沟通能力。
第二步:基础知识讲解(20分钟)- 介绍五子棋的基本规则和棋盘布局。
- 解释不同走法的策略和技巧。
- 引导学生理解五子棋的胜负条件和胜利策略。
第三步:小组分工和合作(15分钟)- 将学生分成小组,每个小组由4-5名成员组成。
- 每个小组选择一位队长,负责组织和协调小组内的活动。
- 鼓励小组成员分享和交流不同的策略和思考方式。
第四步:实践操作(30分钟)- 让学生进行五子棋的实践操作,每个小组内进行对局。
- 鼓励学生尝试不同的策略和思考方式,培养他们的决策能力和逻辑思维能力。
- 教师可以在对局过程中进行巡视和指导,帮助学生解决问题和提供建议。
第五步:总结和分享(15分钟)- 邀请各小组的队长分享他们的对局经验和策略。
- 教师进行总结,强调学生在活动中取得的进步和收获。
- 鼓励学生思考如何将五子棋的思维应用到日常生活和学习中。
教案评估:- 观察学生对五子棋规则和策略的理解程度。
- 评估学生在对局中的决策能力和逻辑思维能力。
- 观察学生的团队合作和沟通能力。
教案延伸:- 鼓励学生参加五子棋比赛,提供更多的实践机会和竞争经验。
- 组织五子棋交流活动,邀请专业棋手进行讲座和示范。
- 引导学生研究五子棋的历史和文化背景,拓宽他们的知识面。
以上是一个简要的五子棋棋类社团活动计划及教案,可以根据具体情况进行调整和完善。
希望对你有所帮助!。
少儿五子棋课程实施方案实施方案:1. 培训目标:通过五子棋课程的学习,培养少儿的思维能力、判断能力、逻辑思维能力以及专注力,提高学生的分析和决策能力。
2. 课程设置:(1) 学习规则:介绍五子棋的基本规则和目标,让学生了解每步棋的限制和胜利条件。
(2) 基础技巧:通过示范和练习,教授基本的下棋技巧,如如何形成进攻、防守和封堵的战略思维。
(3) 战术讲解:介绍常见的战术策略,如三、四、五连的棋型,让学生掌握如何判断和利用对手的弱点进行攻击。
(4) 对局实践:组织学生进行实际对局,通过实战来提高学生在棋局中的应对能力和思维速度。
(5) 棋谱解析:分析经典棋局和大师对局,让学生学习优秀棋局的思路和策略,提升他们的观察能力和理解能力。
3. 教学方法:(1) 游戏式教学:通过游戏化的方式进行教学,增加学生的兴趣和参与度,让学生在愉快中获得知识。
(2) 示范引导:老师通过示范指导学生下棋,让学生更好地理解规则和技巧。
(3) 互动讨论:鼓励学生进行互动讨论,分享自己的思考和经验,激发学生思考和学习的兴趣。
(4) 实战演练:组织学生进行实际对局,让学生在实践中巩固所学知识,培养思考和决策的能力。
4. 评估方式:(1) 知识测试:定期进行知识考核,测试学生对五子棋规则和基本技巧的掌握情况。
(2) 对局表现:观察学生在实际对局中的表现,评估其思考能力、分析能力和决策能力的提升情况。
(3) 课堂参与:评估学生在课堂上的积极参与程度和互动交流能力。
5. 辅助措施:(1) 棋具提供:为每个学生提供五子棋棋盘和棋子,确保学生在课后能够进行练习和巩固。
(2) 学习资源:提供相关的学习资料和棋谱分析,供学生进行深入学习和研究。
(3) 比赛机会:组织学生参加五子棋比赛,提供展示和竞技的平台,激发学生学习的动力和兴趣。
6. 实施步骤:(1) 制定课程计划:根据学习目标和课程设置,制定详细的课程计划,包括每节课的内容和教学安排。
(2) 教材准备:选择适合少儿的五子棋教材,准备相关教具和教辅材料。
MATLAB课程设计课程设计(论文)题目:用MATLAB语言程序开发凑五子棋游戏专业:信息与计算科学指导教师:张大海学生姓名:谢艳涛班级-学号:信计131-30学生姓名:黄元福班级-学号:信计131-26学生姓名:辛安班级-学号:信计131-222016年 11月摘要凑五子棋是一种两人对弈的纯策略型棋类游戏,应用MATLAB语言编写程序可以在计算机上实现二人对弈凑五子棋功能。
二人对弈凑五子棋程序由欢迎界面显示、游戏界面生成、光标移动与落子、判断胜负、悔棋功能、提供音效等子程序构成;程序中应用了结构体、数组、全局变量、按键处理和图形编程等元素和语句。
程序通过棋盘和棋子图像生成、二人移子与落子和判断胜负等功能的实现,在计算机上实现了二人凑五子棋对弈。
目录摘要-------------------------------------------------- II 第1章:需求分析 ---------------------------------------- 11.1凑五子棋背景 ----------------------------------- 11.2 凑五子棋需求分析和流程设计--------------------- 1 第2章:概要设计 ---------------------------------------- 72.1 各类头文件和全局变量--------------------------- 72.2 画面显示模块----------------------------------- 8 第3章:详细设计 --------------------------------------- 103.1 玩家操作模块---------------------------------- 103.2音效提供模块 ---------------------------------- 113.3 胜负判断模块---------------------------------- 11 第4章:调试分析 --------------------------------------- 124.1 图形模块-------------------------------------- 12 4.2 玩家操作模块 ------------------------------------ 134.3 胜负判断模块---------------------------------- 14 第5章:用户手册 --------------------------------------- 14第6章:小组分工 --------------------------------------- 15 第7章:结论与心得 ------------------------------------- 16 第8章:源程序代码 ------------------------------------ 16第1章:需求分析1.1凑五子棋背景传统凑五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为18×18,棋子放置于棋盘线交叉点上。
五子棋社团活动队教案一、活动目标:1. 让学生了解五子棋的起源、规则和基本技巧。
2. 培养学生的逻辑思维能力、判断能力和团队协作能力。
3. 提高学生对五子棋的兴趣,丰富学生的课余生活。
二、活动对象:小学四年级学生三、活动时间:每课时40 分钟四、活动地点:学校教室或多功能厅五、活动内容:第一课时:五子棋简介1. 教师讲解五子棋的起源、规则和基本技巧。
2. 学生进行简单的五子棋对弈,熟悉规则。
第二课时:五子棋基本技巧(一)1. 教师讲解五子棋的基本技巧,如:眼位、连五、堵截等。
2. 学生进行实战练习,运用所学技巧。
第三课时:五子棋基本技巧(二)1. 教师继续讲解五子棋的基本技巧,如:牵制、转换、攻守平衡等。
2. 学生进行实战练习,运用所学技巧。
第四课时:五子棋比赛规则1. 教师讲解五子棋比赛规则,如:比赛时间、犯规、判负等。
2. 学生进行模拟比赛,熟悉比赛规则。
第五课时:团队协作与战术1. 教师讲解五子棋中的团队协作和战术,如:配合、默契、心理战等。
2. 学生进行团队对抗赛,培养团队协作能力。
六、教学方法:1. 讲授法:教师讲解五子棋的相关知识和技巧。
2. 实践法:学生进行五子棋对弈和团队对抗赛,提高实际操作能力。
3. 互动法:教师提问,学生回答,促进课堂氛围。
七、教学评价:1. 学生能熟练掌握五子棋的规则和基本技巧。
2. 学生能在实战中对弈中运用所学知识。
3. 学生能参与团队协作,具备一定的团队竞技能力。
八、教学资源:1. 五子棋教材或相关资料。
2. 五子棋棋盘、棋子。
3. 计时器、判负标志等。
九、教学注意事项:1. 确保学生了解五子棋的起源和规则,避免对弈中出现纠纷。
2. 关注学生的个体差异,因材施教,使每个学生都能在活动中得到提高。
十、课后作业:1. 学生自主练习五子棋,提高个人技能。
3. 教师收集学生心得体会,进行批改和反馈。
六、活动准备:1. 教室内摆放好五子棋棋盘和棋子。
2. 准备计时器、判负标志等比赛用品。
五子棋教案初学教案教案标题:初学五子棋教案教学目标:1. 了解五子棋的基本规则;2. 掌握五子棋的走棋方法;3. 培养学生的逻辑思维和决策能力;4. 提升学生的团队合作和竞争意识。
教学准备:1. 五子棋棋盘及棋子;2. 投影仪及投影屏幕;3. 教学课件;4. 认真备课的教师。
教学步骤:Step 1:引入(5分钟)通过投影仪展示五子棋棋盘及棋子,让学生感受五子棋的形式,并向学生介绍五子棋的基本规则。
Step 2:学习规则(10分钟)用教学课件简明扼要地介绍五子棋的基本规则,包括棋盘、棋子的布局,先手和后手的确定,以及赢棋的条件等。
Step 3:示范走棋(15分钟)教师通过投影仪将自己的走棋过程展示给学生,并解说每一步的思路和策略,让学生了解走棋的技巧。
Step 4:分组实践(20分钟)将学生分成小组,每个小组有两名学生进行对弈,其他学生观摩学习。
教师在课堂上巡视指导,引导学生进行合理的对局策略。
Step 5:总结讨论(10分钟)课堂结束前,教师组织学生进行总结讨论,让学生分享他们的走棋心得和感受,激发学生对五子棋的兴趣和探索欲。
Step 6:作业布置(5分钟)布置五子棋的练习题,要求学生自己找一个对手进行对弈,并记录棋局和思考过程。
教学反思:通过本次初学五子棋的教学,学生能够初步了解五子棋的基本规则,掌握简单的走棋技巧。
同时,在小组实践中,学生能够培养团队合作和竞争意识,提升逻辑思维和决策能力。
但需要注意的是,教师要合理控制课堂时间,适当安排学生的对弈时间,以保证每个学生都有足够的机会进行实践。
五子棋幼儿园大班教案
一、教学目标
1.通过五子棋游戏的学习,使幼儿感受到团队合作的重要性;
2.培养幼儿的思维能力和创新能力;
3.提高幼儿的逻辑思维能力、注意力和观察力。
二、教学准备
1.五子棋棋盘和棋子;
2.讲师准备好相应的教学素材和教材;
3.课堂环境布置。
三、教学内容与步骤
1. 热身活动
给幼儿们讲解什么是五子棋,让他们了解棋盘和棋子的规格和使用方法。
2. 讲解游戏规则
让幼儿明白五子棋游戏的基本规则,教授走棋的基本方法,提醒幼儿在棋盘上
思考并尝试预测对手的下一步棋。
3. 游戏实践
将幼儿分成两组,并在一侧的棋盘上玩五子棋游戏,让他们逐渐熟悉并掌握游
戏规则,同时也让他们感受到团队合作的重要性。
4. 游戏总结
让幼儿们总结这次五子棋游戏的经验和收获,鼓励他们团队协作、勇敢尝试、
学会分析、找到最佳解决方案等优秀品质,同时也可以为优秀的棋手颁发奖品。
四、教学评估
通过对幼儿本次五子棋游戏的表现进行观察和互动沟通,以及对幼儿听课反馈、口头提问等形式,检验和记录他们在棋类游戏中锻炼的思维能力,如观察力、沟通和协作意识等。
五、教学延伸
在本次教学后,让幼儿们加深对五子棋游戏的理解,可以安排更多习惯性的游戏,如围棋、象棋等棋类游戏或其他益智游戏,鼓励幼儿在游戏中不断挑战自己,自我完善和提高。
六、教学总结
教师可以对本次教学进行总结,并回顾幼儿在五子棋游戏中所学到的知识和技能,激励他们继续学习、努力进步,并带领他们共同进步,成为更好的棋手和更优秀的集体。
五子棋社团活动教案活动内容:研究五子棋棋具和规则活动目标:让学生了解五子棋的历史和棋具,学会正确执子下子,激发学生研究五子棋的兴趣。
活动准备:五子棋棋具、图片活动流程:一、认识五子棋的棋具1.展示棋具,包括棋盘和棋子,让学生认识五子棋的棋具。
2.了解棋具的历史,介绍五子棋的起源和发展,并讲述棋子的制作材料和种类。
3.认识棋盘和棋子,让学生了解棋盘横竖线和交叉点,以及棋子的形状和数量。
二、学会正确执子下子1.教师演示如何执子下子,让学生学会正确的下棋姿势和方法。
2.总结下棋规则,包括摆成连线的五个子后算赢,手中的子全摆完后移动棋盘上的子,棋盘上的子不列五个就算输。
三、练下五子棋1.让学生自行找棋友,拼成三人一组或两人一组,三人一组的其中一人可当裁判。
2.小组内举行比赛,采用三局两胜制决出优胜者。
3.请小棋手介绍取胜经验,结合活动情况评出本次小棋手。
通过本次活动,学生能够了解五子棋的历史和棋具,掌握正确的执子下子方法和下棋规则,提高思维能力和智力水平,同时培养沉着冷静的棋风,激发学生研究五子棋的兴趣。
五子棋手。
2.了解段级位制的基本原理:根据棋手的胜负情况和对手的段位,来确定棋手的段级位。
3.了解段级位制的等级划分:从初段到九段,每个段位都有相应的要求和晋升规则。
4.帮助学生了解自己的段位水平,并设立目标,努力提高自己的棋艺。
活动流程一、回忆五子棋的基本知识。
二、介绍五子棋的段级位制。
三、让学生了解自己的段位水平,并设立目标。
四、学生分组下五子棋,评出本次小棋手。
参加XXX认可的五子棋比赛的爱好者可以获得段位,段位共分为九个等级,最高为九段,其次为八段、七段、六段、五段、四段、三段、二段、初段。
段位以下共分为十个等级,最高为一级,其次为二级、三级、四级、五级、六级、七级、八级、九级、十级。
在五子棋段级位制度实施初期,XXX根据中国五子棋爱好者在国内、国际交流中所体现出来的实际水平,暂定最高段位为六段,随着中国棋手参与国内外交流机会的增加和技术水平的提高,逐步增加所授予段位的上限,直至九段。
第1篇一、活动背景五子棋是一种古老的棋类游戏,具有悠久的历史和丰富的文化内涵。
近年来,随着我国青少年体育事业的蓬勃发展,五子棋也逐渐成为了青少年喜爱的娱乐项目之一。
为了丰富少年宫学生的课余生活,提高他们的思维能力和团队协作精神,特制定本教学工作计划。
二、活动目标1. 培养学生对五子棋的兴趣,提高他们的棋艺水平。
2. 培养学生的团队协作精神,增强他们的沟通能力。
3. 锻炼学生的思维能力,提高他们的逻辑分析能力。
4. 传承五子棋文化,弘扬中华民族优秀传统文化。
三、活动内容1. 五子棋基础知识讲解:介绍五子棋的起源、规则、基本术语等。
2. 五子棋实战技巧讲解:讲解开局、中局、残局等实战技巧。
3. 五子棋比赛:组织定期的五子棋比赛,让学生在实践中提高棋艺。
4. 五子棋讲座:邀请资深五子棋选手或教练为学生进行讲座,分享他们的经验和心得。
5. 团队协作训练:组织学生进行团队协作训练,提高他们的团队协作能力。
四、活动安排1. 活动时间:每周一、三、五下午3:00-5:00。
2. 活动地点:少年宫五子棋教室。
3. 活动对象:热爱五子棋的青少年学生。
4. 活动流程:(1)15分钟:签到、准备。
(2)30分钟:五子棋基础知识讲解。
(3)30分钟:五子棋实战技巧讲解。
(4)60分钟:五子棋比赛。
(5)30分钟:团队协作训练。
(6)15分钟:总结、反馈。
五、教学资源1. 五子棋教材:收集整理五子棋相关教材,为学生提供学习资料。
2. 五子棋棋具:购置五子棋棋盘、棋子等教学用品。
3. 五子棋教练:邀请资深五子棋选手或教练担任教学任务。
4. 五子棋比赛场地:布置比赛场地,确保比赛顺利进行。
六、活动评估1. 学生棋艺水平提高情况:通过定期的五子棋比赛和课后作业,评估学生的棋艺水平。
2. 学生团队协作能力提升情况:通过团队协作训练,观察学生在团队中的表现。
3. 学生对五子棋的兴趣度:通过问卷调查、访谈等方式,了解学生对五子棋的兴趣度。
JAVA课程设计设计题目:五子棋游戏一.简要的介绍五子棋1.五子棋的起源五子棋,又被称为“连五子、五子连、串珠、五目、五目碰、五格、五石、五法、五联、京棋”。
五子棋相传起源于四千多年前的尧帝时期,比围棋的历史还要悠久,可能早在“尧造围棋”之前,民间就已有五子棋游戏。
有关早期五子棋的文史资料与围棋有相似之处,因为古代五子棋的棋具与围棋是完全相同的。
2.现在五子棋标准棋盘(如图所示)3.五子棋的棋子五子棋采用两种颜色棋子,黑色棋子和白色棋子,和围棋相同,4.五子棋规则五子棋就是五个棋子连在一起就算赢,黑棋先行,下棋下在棋盘交叉线上,由于黑棋先行,优势太大,所以对黑棋设了禁手,又规定了“三手交换”,就是黑棋下第 2 手棋,盘面第 3 着棋之后,白方在应白 2 之前,如感觉黑方棋形不利于己方,可出交换,即执白棋一方变为执黑棋一方。
和“五手两打法”,就是黑棋在下盘面上关键的第 5 手时,必须下两步棋,让白方在这两步棋中任选一步,然后再续下。
不过一般爱好者不需要遵循这么多规则。
二.程序流程三.代码设计与分析main方法创建了ChessFrame类的一个实例对象(cf),并启动屏幕显示显示该实例对象。
public class FiveChessAppletDemo {public static void main(String args[]){ChessFrame cf = new ChessFrame();cf.show();}}用类ChessFrame创建五子棋游戏主窗体和菜单import java.awt.*;import java.awt.event.*;import java.applet.*;import javax.swing.*;import java.io.PrintStream;import javax.swing.JComponent;import javax.swing.JPanel;class ChessFrame extends JFrame implements ActionListener { private String[] strsize={"标准棋盘","改进棋盘","扩大棋盘"}; private String[] strmode={"人机对战","人人对战"};public static boolean iscomputer=true,checkcomputer=true; private int width,height;private ChessModel cm;private MainPanel mp;构造五子棋游戏的主窗体public ChessFrame() {this.setTitle("五子棋游戏");cm=new ChessModel(1);mp=new MainPanel(cm);Container con=this.getContentPane();con.add(mp,"Center");this.setResizable(false);this.addWindowListener(new ChessWindowEvent());MapSize(14,14);JMenuBar mbar = new JMenuBar();this.setJMenuBar(mbar);JMenu gameMenu = new JMenu("游戏");mbar.add(makeMenu(gameMenu, new Object[] {"开局", null,"棋盘",null,"模式", null, "退出"}, this));JMenu lookMenu =new JMenu("外观");mbar.add(makeMenu(lookMenu,new Object[] {"类型一","类型二","类型三"},this));JMenu helpMenu = new JMenu("版本");mbar.add(makeMenu(helpMenu, new Object[] {"关于"}, this));}构造五子棋游戏的主菜单public JMenu makeMenu(Object parent, Object items[], Object target){ JMenu m = null;if(parent instanceof JMenu)m = (JMenu)parent;else if(parent instanceof String)m = new JMenu((String)parent);elsereturn null;for(int i = 0; i < items.length; i++)if(items[i] == null)m.addSeparator();else if(items[i] == "棋盘"){JMenu jm = new JMenu("棋盘");ButtonGroup group=new ButtonGroup();JRadioButtonMenuItem rmenu;for (int j=0;j<strsize.length;j++){rmenu=makeRadioButtonMenuItem(strsize[j],target);if (j==0)rmenu.setSelected(true);jm.add(rmenu);group.add(rmenu);}m.add(jm);}else if(items[i] == "模式"){JMenu jm = new JMenu("模式");ButtonGroup group=new ButtonGroup();JRadioButtonMenuItem rmenu;for (int h=0;h<strmode.length;h++){rmenu=makeRadioButtonMenuItem(strmode[h],target);if(h==0)rmenu.setSelected(true);jm.add(rmenu);group.add(rmenu);}m.add(jm);}elsem.add(makeMenuItem(items[i], target));return m;}构造五子棋游戏的菜单项public JMenuItem makeMenuItem(Object item, Object target){ JMenuItem r = null;if(item instanceof String)r = new JMenuItem((String)item);else if(item instanceof JMenuItem)r = (JMenuItem)item;elsereturn null;if(target instanceof ActionListener)r.addActionListener((ActionListener)target);return r;}构造五子棋游戏的单选按钮式菜单项public JRadioButtonMenuItem makeRadioButtonMenuItem(Object item, Object target){JRadioButtonMenuItem r = null;if(item instanceof String)r = new JRadioButtonMenuItem((String)item);else if(item instanceof JRadioButtonMenuItem)r = (JRadioButtonMenuItem)item;elsereturn null;if(target instanceof ActionListener)r.addActionListener((ActionListener)target);return r;}public void MapSize(int w,int h){setSize(w * 24, h * 27);if(this.checkcomputer)this.iscomputer=true;elsethis.iscomputer=false;mp.setModel(cm);mp.repaint();}public boolean getiscomputer(){return this.iscomputer;}public void restart(){int modeChess = cm.getModeChess();if(modeChess <= 3 && modeChess >= 0){cm = new ChessModel(modeChess);MapSize(cm.getWidth(),cm.getHeight());}}public void actionPerformed(ActionEvent e){String arg=e.getActionCommand();try{if (arg.equals("类型三"))UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");else if(arg.equals("类型二"))UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");elseUIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel" );SwingUtilities.updateComponentTreeUI(this);}catch(Exception ee){}if(arg.equals("标准棋盘")){this.width=14;this.height=14;cm=new ChessModel(1);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("改进棋盘")){this.width=18;this.height=18;cm=new ChessModel(2);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("扩大棋盘")){this.width=22;this.height=22;cm=new ChessModel(3);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("人机对战")){this.checkcomputer=true;this.iscomputer=true;cm=new ChessModel(cm.getModeChess());MapSize(cm.getWidth(),cm.getHeight());SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("人人对战")){this.checkcomputer=false;this.iscomputer=false;cm=new ChessModel(cm.getModeChess());MapSize(cm.getWidth(),cm.getHeight());SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("开局")){restart();}if(arg.equals("关于"))JOptionPane.showMessageDialog(null, "第一版", "版本",JOptionPane.PLAIN_MESSAGE );if(arg.equals("退出"))System.exit(0);}}用类ChessModel实现了整个五子棋程序算法的核心import java.awt.*;import java.awt.event.*;import java.applet.*;import javax.swing.*;import java.io.PrintStream;import javax.swing.JComponent;import javax.swing.JPanel;class ChessModel {规定棋盘的宽度、高度、棋盘的模式private int width,height,modeChess;规定棋盘方格的横向、纵向坐标private int x=0,y=0;棋盘方格的横向、纵向坐标所对应的棋子颜色,数组arrMapShow只有3个值:1,2,3,-1,其中1代表该棋盘方格上下的棋子为黑子,2代表该棋盘方格上下的棋子为白子,3代表为该棋盘方格上没有棋子,-1代表该棋盘方格不能够下棋子private int[][] arrMapShow;交换棋手的标识,棋盘方格上是否有棋子的标识符private boolean isOdd,isExist;public ChessModel() {}该构造方法根据不同的棋盘模式(modeChess)来构建对应大小的棋盘public ChessModel(int modeChess){this.isOdd=true;if(modeChess == 1){PanelInit(14, 14, modeChess);}if(modeChess == 2){PanelInit(18, 18, modeChess);}if(modeChess == 3){PanelInit(22, 22, modeChess);}}按照棋盘模式构建棋盘大小private void PanelInit(int width, int height, int modeChess){ this.width = width;this.height = height;this.modeChess = modeChess;arrMapShow = new int[width+1][height+1];for(int i = 0; i <= width; i++){for(int j = 0; j <= height; j++){arrMapShow[i][j] = -1;}}}获取是否交换棋手的标识符public boolean getisOdd(){return this.isOdd;}设置交换棋手的标识符public void setisOdd(boolean isodd){ if(isodd)this.isOdd=true;elsethis.isOdd=false;}获取某棋盘方格是否有棋子的标识值public boolean getisExist(){return this.isExist;}获取棋盘宽度public int getWidth(){return this.width;}获取棋盘高度public int getHeight(){return this.height;}获取棋盘模式public int getModeChess(){return this.modeChess;}获取棋盘方格上棋子的信息public int[][] getarrMapShow(){return arrMapShow;}判断下子的横向、纵向坐标是否越界private boolean badxy(int x, int y){if(x >= width+20 || x < 0)return true;return y >= height+20 || y < 0;}计算棋盘上某一方格上八个方向棋子的最大值,这八个方向分别是:左、右、上、下、左上、左下、右上、右下public boolean chessExist(int i,int j){if(this.arrMapShow[i][j]==1 || this.arrMapShow[i][j]==2)return true;return false;}判断该坐标位置是否可下棋子public void readyplay(int x,int y){if(badxy(x,y))return;if (chessExist(x,y))return;this.arrMapShow[x][y]=3;}在该坐标位置下棋子public void play(int x,int y){if(badxy(x,y))return;if(chessExist(x,y)){this.isExist=true;return;}elsethis.isExist=false;if(getisOdd()){setisOdd(false);this.arrMapShow[x][y]=1;}else{setisOdd(true);this.arrMapShow[x][y]=2;}}计算机走棋说明:用穷举法判断每一个坐标点的四个方向的的最大棋子数,最后得出棋子数最大值的坐标,下子public void computerDo(int width,int height){int max_black,max_white,max_temp,max=0;setisOdd(true);System.out.println("计算机走棋 ...");for(int i = 0; i <= width; i++){for(int j = 0; j <= height; j++){算法判断是否下子if(!chessExist(i,j)){判断白子的最大值max_white=checkMax(i,j,2);判断黑子的最大值max_black=checkMax(i,j,1);max_temp=Math.max(max_white,max_black);if(max_temp>max){max=max_temp;this.x=i;this.y=j;}}}}setX(this.x);setY(this.y);this.arrMapShow[this.x][this.y]=2;}记录电脑下子后的横向坐标public void setX(int x){this.x=x;}记录电脑下子后的纵向坐标public void setY(int y){this.y=y;}获取电脑下子的横向坐标public int getX(){return this.x;}获取电脑下子的纵向坐标public int getY(){return this.y;}计算棋盘上某一方格上八个方向棋子的最大值,这八个方向分别是:左、右、上、下、左上、左下、右上、右下public int checkMax(int x, int y,int black_or_white){ int num=0,max_num,max_temp=0;int x_temp=x,y_temp=y;int x_temp1=x_temp,y_temp1=y_temp;判断右边for(int i=1;i<5;i++){x_temp1+=1;if(x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white)num++;elsebreak;}判断左边x_temp1=x_temp;for(int i=1;i<5;i++){x_temp1-=1;if(x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num<5)max_temp=num;判断上面x_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){y_temp1-=1;if(y_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}判断下面y_temp1=y_temp;for(int i=1;i<5;i++){y_temp1+=1;if(y_temp1>this.height)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;判断左上方x_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){x_temp1-=1;y_temp1-=1;if(y_temp1<0 || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}判断右下方x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<5;i++){x_temp1+=1;y_temp1+=1;if(y_temp1>this.height || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;判断右上方x_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){x_temp1+=1;y_temp1-=1;if(y_temp1<0 || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}判断左下方x_temp1=x_temp;for(int i=1;i<5;i++){x_temp1-=1;y_temp1+=1;if(y_temp1>this.height || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;max_num=max_temp;return max_num;}判断胜负public boolean judgeSuccess(int x,int y,boolean isodd){ int num=1;int arrvalue;int x_temp=x,y_temp=y;if(isodd)arrvalue=2;elsearrvalue=1;int x_temp1=x_temp,y_temp1=y_temp;判断右边胜负for(int i=1;i<6;i++){x_temp1+=1;if(x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}判断左边胜负x_temp1=x_temp;for(int i=1;i<6;i++){x_temp1-=1;break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;判断上方胜负x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){y_temp1-=1;if(y_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}判断下方胜负y_temp1=y_temp;for(int i=1;i<6;i++){y_temp1+=1;if(y_temp1>this.height)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;判断左上胜负x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){y_temp1-=1;if(y_temp1<0 || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}判断右下胜负x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<6;i++){x_temp1+=1;y_temp1+=1;if(y_temp1>this.height || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;判断右上胜负x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){x_temp1+=1;y_temp1-=1;if(y_temp1<0 || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}判断左下胜负x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<6;i++){x_temp1-=1;y_temp1+=1;if(y_temp1>this.height || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}if(num==5)return true;return false;}赢棋后的提示public void showSuccess(JPanel jp){JOptionPane.showMessageDialog(jp,"你赢了","结果",RMATION_MESSAGE);}输棋后的提示public void showDefeat(JPanel jp){JOptionPane.showMessageDialog(jp,"你输了","结果",RMATION_MESSAGE);}}用类MainPanel主要完成如下功能:1、构建一个面板,在该面板上画上棋盘;2、处理在该棋盘上的鼠标事件(如鼠标左键点击、鼠标右键点击、鼠标拖动等)import java.awt.*;import java.awt.event.*;import java.applet.*;import javax.swing.*;import java.io.PrintStream;import javax.swing.JComponent;import javax.swing.JPanel;class MainPanel extends JPanelimplements MouseListener,MouseMotionListener{设定棋盘的宽度和高度private int width,height;private ChessModel cm;根据棋盘模式设定面板的大小MainPanel(ChessModel mm){cm=mm;width=cm.getWidth();height=cm.getHeight();addMouseListener(this);}根据棋盘模式设定棋盘的宽度和高度public void setModel(ChessModel mm){cm = mm;width = cm.getWidth();height = cm.getHeight();}根据坐标计算出棋盘方格棋子的信息(如白子还是黑子),然后调用draw方法在棋盘上画出相应的棋子public void paintComponent(Graphics g){super.paintComponent(g);for(int j = 0; j <= height; j++){for(int i = 0; i <= width; i++){int v = cm.getarrMapShow()[i][j];draw(g, i, j, v);}}}根据提供的棋子信息(颜色、坐标)画棋子public void draw(Graphics g, int i, int j, int v){ int x = 20 * i+20;int y = 20 * j+20;画棋盘if(i!=width && j!=height){g.setColor(Color.darkGray);g.drawRect(x,y,20,20);}画黑色棋子if(v == 1 ){g.setColor(Color.gray);g.drawOval(x-8,y-8,16,16);g.setColor(Color.black);g.fillOval(x-8,y-8,16,16);}画白色棋子if(v == 2 ){g.setColor(Color.gray);g.drawOval(x-8,y-8,16,16);g.setColor(Color.white);g.fillOval(x-8,y-8,16,16);}if(v ==3){g.setColor(Color.cyan);g.drawOval(x-8,y-8,16,16);}}响应鼠标的点击事件,根据鼠标的点击来下棋,根据下棋判断胜负等public void mousePressed(MouseEvent evt){int x = (evt.getX()-10) / 20;int y = (evt.getY()-10) / 20;System.out.println(x+" "+y);if (evt.getModifiers()==MouseEvent.BUTTON1_MASK){cm.play(x,y);System.out.println(cm.getisOdd()+" "+cm.getarrMapShow()[x][y]); repaint();if(cm.judgeSuccess(x,y,cm.getisOdd())){cm.showSuccess(this);evt.consume();ChessFrame.iscomputer=false;}判断是否为人机对弈if(ChessFrame.iscomputer&&!cm.getisExist()){puterDo(cm.getWidth(),cm.getHeight());repaint();if(cm.judgeSuccess(cm.getX(),cm.getY(),cm.getisOdd())){ cm.showDefeat(this);evt.consume();}}}}public void mouseClicked(MouseEvent evt){}public void mouseReleased(MouseEvent evt){}public void mouseEntered(MouseEvent mouseevt){}public void mouseExited(MouseEvent mouseevent){}public void mouseDragged(MouseEvent evt){}响应鼠标的拖动事件public void mouseMoved(MouseEvent moveevt){int x = (moveevt.getX()-10) / 20;int y = (moveevt.getY()-10) / 20;cm.readyplay(x,y);repaint();}}import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;响应退出窗口class ChessWindowEvent extends WindowAdapter{public void windowClosing(WindowEvent e){System.exit(0);}ChessWindowEvent(){}}四.程序调试与运行运行:标准棋盘改进棋盘:扩大棋盘:外观类型二:外观类型三:人机对战:结果:五.结论通过对五子棋游戏的编写,使自己对java语言有了更深的了解。
单 位 分院(系) 专 业 学 号 学生姓名 指导教师
完成日期 2011 年 05 月 日
石家庄铁道大学课程设计 五子棋 课程设计题目 摘 要
五子棋的历史:五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代
的传统黑白棋种之一。发展于日本,流行于欧美。容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
五子棋相传起源于四千多年前的尧帝时期,比围棋的历史还要悠久,可能早在“尧造围棋”之前,民间就已有五子棋游戏。有关早期五子棋的文史资料与围棋有相似之处,因为古代五子棋的棋具与围棋是完全相同的。在上古的神话传说中有“女娲造人,伏羲做棋”一说,《增山海经》中记载:“休舆之山有石焉,名曰帝台之棋,五色而文状鹑卵。”李善注引三国魏邯郸淳《艺经》中曰:“棋局,纵横各十七道,合二百八十九道,白黑棋子,各一百五十枚”。这段虽没明讲是何种棋类,但至少知道远古就以漂亮的石头为棋子。因而规则简单的五子棋也可能出自当时,并是用石子作棋子。亦有传说,五子棋最初流行于少数民族地区,以后渐渐演变成围棋并在炎黄子孙后代中遍及开来。 程序说明:本程序是一款棋类益智游戏程序,是用WIN-TC编写在WINDOWS
系统下运行的娱乐游戏。本程序可以实现人人对战,操作采用键盘上的上下左右键控制棋子的上下左右移动,由空格键控制下棋,双方都可通过ESC键终止游戏。游戏开始后,红、白双方轮流下棋,程序会根据双方下棋的先后顺序自动显示不同颜色的棋子,提示当前下棋的棋手,任何一方由五子连成一线时,游戏结束,结束时会显示对战双方胜负情况。
关键词:五子棋游戏应用程序,C语言,图形函数 目录 第1章 选题的意义……………………………………………………………… 4 1.1 ………………………………………………………………………… 4 1.2 ………………………………………………………………………… 4 第2章 系统功能需求分析 ……………………………………………………… 4 2.1系统的基本要求 ……………………………………………………… 4 2.2 ………………………………………………………………………… 4 第3章 系统设计 ………………………………………………………………… 6 第4章 系统实现 ………………………………………………………………… 8 第5章 总结 ……………………………………………………………………… 36 第1章 选题的意义 1.1意义 通过游戏过程增加编程的兴趣,提高编程水平。编制该程序我对以下的知识点进行的巩固和掌握:1.数组元素为结构体的数组应用。2.全局变量应用。3.按键的处理。4.数组元素与蛇、食物的对应关系。5.图形方式等等。加深对所学知识的理解与掌握,增强自己对所学知识解决实际问题的能力,为以后的程序开发打下基础。
1.2 设计思路 棋盘设计为18×18格,初始状态光标在棋盘的中央,玩家1先走,轮流落子,当一方连成五子或下满棋盘时,游戏结束(连成五子的一方获胜,下满棋盘为和棋)。当游戏一方胜利后显示胜利信息。从程序表面看,这是一个二维平面图,所以数据用二维数组来表示,数组两个下标可以表示棋盘上的位置,数组元素的值代表棋格上的状态,共有三种情况,分别是0代表空格,1代表白棋,2代表黑棋。这样程序的主要工作是接收棋手按键操作,棋手用Up、Down、Left、Right控制光标移动,空格键表示落子。一旦接收到空格键,说明棋手落子,先判断是否是有效位置,也就是说已经有棋子的位置不能重叠落子。落子成功后,马上判断以该位置为中心的八个方向:上、下、左、右、左上、左下、右上、右下是否有相同颜色的棋子连成五子,如果连成五子,则游戏结束,输出相应的信息。如果想退出游戏,可以按Esc键。
第2章 系统功能需求分析
2.1系统的基本要求 操作系统为WindowsXP,设计语言为Visual C++或Turbo C++3.0。 2.2需求分析 1.游戏需求 (1)在游戏开始时出现一个欢迎的界面同时介绍了游戏的规则; (2)画出棋盘的大小; (3)画棋子并确定棋子的大小; (4)判断键盘输入哪个键执行操作; (5)玩家 P1 先落棋; (6)玩家轮流下棋; (7)判断赢家。 2.功能模块 初 始 化 模 块 下棋 操 作 模块 判 断 胜 负 模块 帮 助 模 块
3.流程图五子棋游戏
初始化模块
下棋操作模块 判断胜负模块 帮助模块 第3章 系统设计 1.定义全局变量
帮助信息 显示棋盘18x18
显示棋子位子,玩家1为白色O子,玩家2为红色O子
换玩家 下棋 五子连成一线
玩家1? 玩家1赢 玩家2赢
开始 No Yes
No Yes
玩家1先下棋
结束 1. int status[N][N]; /*定义的数组,表示棋盘某点的状态(棋手1或棋手2)*/ 2. int step_x,step_y; /*行走的坐标,即每一步光标移动的距离*/ 3. int key ; /*获取按下的键盘的键*/ 4. int flag; /*玩家标志,当flag=0时,表示该点无棋子,flag=1表示玩家1的棋子,flag=2表示玩家2的棋子*/
2.Main()主函数 按照语法规则,首先定义使用到的常数、全局变量、函数原型说明。棋盘状态用数组int status[19][19],初值为0,表示空格。函数的实体比较简单,调用图形驱动、画棋盘、人人对弈等自定义函数,一旦游戏结束后,关闭图形驱动,程序结束。
3.DrawBoard()画棋盘函数 背景颜色设为绿色,从坐标(100,100)开始每隔20个单位用黄色画一条水平直线,一条垂直线,构成棋盘,用循环语句实现。画线函数line()的参数为线的起点和终点坐标,注意要计算正确。函数setfillstyle()可以设置填充模式和填充颜色,circle(x,y,8)以x和y为圆心画圆(这里半径为8),用它表示棋子。
4.ResultCheck(int x,int y)判断是否胜出函数 本函数根据每次落子的位置,分别向上、下、左、右、左上、左下、右上、右下八个方向判断是否有相同颜色的棋子连成五子,如果成立,游戏就结束,并显示提示信息(如:红方获胜),否则继续落子。
5.Done()执行下棋函数 这是游戏进行的函数,主要是接收棋手的按键消息,其处理过程如下: (1) 按Esc键程序可以随时结束。 (2) 按上下左右光标键,则改变棋子移动的坐标值。 (3) 按空格键后判断: 1) 如落子的位置已经有棋则无效,继续按键。 2) 如落子位置是空格,可以将棋子落入格内,调用ResultCheck(int x,int y)函数。 3) 如果棋子变化后,棋盘已下满了棋子,则游戏结束。显示平局信息。
(4) 重复上述步骤,直到游戏结束。 6.图形功能函数 以下函数原形都在graphics.h中。 (1)registerbgidriver(): (2)initgraph(int *driver, int *mode, char *path):用于初始化图形系统,并装入相应的图形驱动器。该函数把由driver所指向的图形驱动器代码装入内存。如果图形驱动器未装入内存,图形函数将不能操作。图形函数所用的屏显模式由mode所指向的整数值确定。最后,图形驱动器的路径是由path所指向的字符串给出。如果没有指定路径,就在当前工作路径上寻找。
(3)rectangle(int left,int top,int right,int bottom):函数rectangle()用当前画出由坐标left,top及right,bottom所定义的矩形。
(4)setcolor(int color):把当前画线颜色设置为color所指定的颜色。 (5)closegraph():该函数使图形状态失效,并且释放用于保存图形驱动器和字体的系统内存。当你的程序既用到图形输出又用到非图形输出时,应该用此函数。该函数还把系统屏显模式返回到调用initgragh()前的状态。
第4章 系统实现 1.程序代码 /*win-tc下的五子棋源代码*/ /*加载头文件*/ #include /*输入输出函数*/ #include /*包含系统函数,定义杂项函数及内存分配函数*/ #include /*图像函数*/ #include /*存放有接口函数*/ #include /*定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作*/
/*编译预处理,定义按键码*/ #define LEFT 0x4b00 /*向左*/ #define RIGHT 0x4d00 /*向右*/ #define DOWN 0x5000 /*向下*/ #define UP 0x4800 /*向上*/ /*若想在游戏中途退出, 可按 Esc 键*/ #define ESC 0x011b /*退出键*/ /*SPACE键表示落子*/ #define SPACE 0x3920 /*落子键*/
/*设置偏移量,即定义每一步光标移动的距离*/ #define OFFSET 20 #define OFFSET_x 4 #define OFFSET_y 3 /*定义棋盘数组大小,即棋盘的大小,这里为18x18格*/ #define N 19
/*定义全局变量*/