嵌入式系统黑白棋课程设计报告
c课程设计黑白棋摘要

c 课程设计黑白棋摘要一、教学目标本节课的教学目标是让学生掌握黑白棋的基本规则和技巧,能够进行简单的对战游戏。
知识目标包括了解黑白棋的历史背景、规则和策略,技能目标包括能够熟练操作棋子进行游戏,情感态度价值观目标包括培养学生的团队合作意识、耐心和思考能力。
二、教学内容本节课的教学内容主要包括黑白棋的基本规则、棋子的操作方法和游戏策略。
教学大纲如下:1.黑白棋的历史背景和规则介绍2.棋子的操作方法:如何走棋、吃子、保护棋子等3.游戏策略:如何布局、进攻、防守等三、教学方法为了激发学生的学习兴趣和主动性,本节课将采用多种教学方法,包括讲授法、讨论法、案例分析法和实验法等。
1.讲授法:教师通过讲解黑白棋的基本规则和策略,让学生了解游戏的基本知识。
2.讨论法:学生分组讨论棋子的操作方法和游戏策略,促进学生之间的交流和合作。
3.案例分析法:教师展示一些经典的黑白棋对战案例,让学生分析双方的策略和胜负原因。
4.实验法:学生进行实际的棋局对战,通过实践提高自己的游戏技巧。
四、教学资源为了支持教学内容和教学方法的实施,本节课将准备以下教学资源:1.教材:提供黑白棋的规则和策略介绍,供学生参考。
2.参考书:提供一些关于黑白棋的进阶知识,供学生拓展学习。
3.多媒体资料:通过视频或图片展示黑白棋的历史背景和经典对战案例。
4.实验设备:提供足够的棋子和棋盘,让学生进行实际的棋局对战。
五、教学评估本节课的教学评估将采用多种方式,以全面、客观、公正地评价学生的学习成果。
评估方式包括平时表现、作业和考试等。
1.平时表现:通过观察学生在课堂上的参与度、提问回答和小组讨论的表现来评估学生的学习态度和理解程度。
2.作业:布置相关的黑白棋练习题,要求学生在课后完成,通过作业的完成质量来评估学生的掌握程度。
3.考试:安排一次黑白棋的对战考试,通过学生的游戏表现和策略运用来评估其综合运用能力。
六、教学安排本节课的教学安排将根据学生的实际情况和教学任务进行合理规划。
黑白棋c课程设计

黑白棋c 课程设计一、教学目标本课程旨在通过黑白棋(C)的教学,让学生掌握黑白棋的基本规则和策略,提高学生的逻辑思维能力和决策能力。
具体的教学目标如下:知识目标:学生能够理解黑白棋的起源、基本规则和常用策略。
技能目标:学生能够独立完成黑白棋的设置和游戏,掌握基本的对弈技巧和策略。
情感态度价值观目标:学生能够培养团队合作精神,学会尊重对手,增强自信心和抗挫能力。
二、教学内容本课程的教学内容主要包括黑白棋的基本规则、棋子的走法、游戏的设置和策略等。
具体的教学内容如下:1.黑白棋的起源和发展:介绍黑白棋的历史背景和发展过程。
2.黑白棋的基本规则:讲解棋盘的布局、棋子的颜色和初始位置,以及如何进行合法的走法。
3.棋子的走法:教授不同棋子的走法,包括王、后、象、马、车等。
4.游戏的设置:讲解如何设置棋盘和初始布局,以及如何进行合法的走法。
5.常用策略:介绍基本的黑白棋策略,如包围、阻断、防守等。
三、教学方法为了提高学生的学习兴趣和主动性,本课程将采用多种教学方法,包括讲授法、讨论法、案例分析法和实验法等。
1.讲授法:通过讲解黑白棋的基本规则、棋子的走法和常用策略,使学生掌握相关知识。
2.讨论法:学生进行小组讨论,分享彼此的黑白棋经验和策略,提高学生的思考和沟通能力。
3.案例分析法:分析经典的黑白棋对局,让学生学会分析局势和制定策略。
4.实验法:让学生亲自动手进行黑白棋游戏,培养学生的实际操作能力和决策能力。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将选择和准备以下教学资源:1.教材:选用权威、实用的黑白棋教材,为学生提供系统的学习材料。
2.参考书:提供相关的黑白棋参考书籍,供学生课后拓展阅读。
3.多媒体资料:制作精美的PPT和教学视频,帮助学生更好地理解和掌握黑白棋知识。
4.实验设备:提供足够的黑白棋棋盘和棋子,让学生进行实际操作和练习。
五、教学评估本课程的评估方式将包括平时表现、作业和考试等,以全面、客观地评价学生的学习成果。
JAVA课程设计黑白棋

大连科技学院Java课程设计报告题目黑白棋小游戏学生姓名专业班级指导教师职称讲师所在单位教研室主任目录1.总体设计 (1)1.1功能要求 (1)1.2 系统性能要求 (1)2.总体设计 (1)2.1系统功能模块划分 (1)3.详细设计与实现 (4)3.1 测试分析 (4)附录1 软件源程序 (5)课程设计实践总结: (17)1.总体设计1.1功能要求本系统按课程设计指导书提供的课题,要求学生在自行完成各个操作环节,并能实现且达到举一反三的目的,完成一个项目解决一类问题。
要求学生能够全面、深入理解和熟练掌握所学内容,并能够用其分析、设计和解答类似问题;对此能够较好地理解和掌握,能够进行简单分析和判断;能编写出具有良好风格的程序;掌握JA V A程序设计的基本技能和面向对象的概念和方法;了解多线程、安全和网络等编程技术。
同时培养学生进行分析问题、解决问题的能力;培养学生进行设计分析、设计方法、设计操作与测试、设计过程的观察、理解和归纳能力的提高。
1.2 系统性能要求能够完整完成黑白棋游戏的对弈2.总体设计2.1系统功能模块划分为了实现黑白棋游戏的开发,通过流程图的分析,计划采用以下几大模块。
1、绘图模块:本模块用来负责主界面的绘制,包括棋盘、棋子、棋子个数的显示、以及其它需要显示的部分。
2、人机模块:人机模块是本程序得以运行的基础,并通过规则模块决定能否下子。
3、规则模块:本模块主要负责判断下棋是否符合规则。
4、按键模块:本模块通过判断用户按键的位置,判断出该坐标所处棋盘中响应位置。
2.2 游戏流程图图2.2-1落棋位置判图2.2-2输出成绩图2.2-3胜利结果3.详细设计与实现3.1 测试分析程序运行结果图3.1-1 开始界面图3.1-2 结束界面T参考文献[1] 王克宏编著JA V A语言入门清华大学出版社1996[2] 旭日工作室编著Java 1.1使用大全电子工业出版社1998[3][美]Cay S.Horstmann 程峰等译JA V A2核心技术机械工业出版社2003.6[4] Horstmann C S,Cornell G著Java2核心技术机械工业出版社2008.10[5] 马凡李璠编著JavaScript实例应用中国铁道出版社2001.01[6]朱喜福JA V A程序设计(第二版)上海:人民邮电出版社2007.3[7] 林胜利王坤茹JA V A优化编程(第二版)北京:电子工业出版社2008.10[8] 马军JA V A完全自学手册北京:机械工业出版社2006.5[9] 袁海燕王文涛编著JAVA实用程序设计上海:人民邮电出版社2009.11[10] 刘宝林程序设计与案例上海:高等教育出版社2004.6[11] 马凡李璠编著JA V A核心技术北京:机械工业出版社2000.8[12] 王克宏编著JA V A语言Applet编程技术北京:清华大学出版社2005.3[13] 施霞萍Java程序设计教程第2版机械工业出版社2006-6[14] 宛延闿实用Java程序设计教程机械工业出版社2006-1[15] 陈国君Java2程序设计基础清华大学出版社2006-8附录1 软件源程序import java.awt.*;import java.awt.event.*;import java.io.*;import .*;import javax.swing.*;import java.util.*;import java.awt.Font;public class Main{public static void main(String args[]){BlackAndWhiteDesign b = new BlackAndWhiteDesign();}}class BlackAndWhiteDesign extends Frame implements Runnable{ Go Background = new Go();boolean stepColor = true;int PORT;Socket sendSocket;//主动连接SocketPrintWriter writer;//用来发送messageboolean stopFlag;boolean isInitiative;Point messagePoint;Panel panel1 = new Panel();Panel panel2 = new Panel();Panel panel3 = new Panel();CheckboxGroup checkboxGroup1 = new CheckboxGroup();Checkbox checkbox1 = new Checkbox();Checkbox checkbox2 = new Checkbox();Label label1 = new Label();TextField textField1 = new TextField(10);Panel PtextField1 = new Panel();Button button1 = new Button();Label label2 = new Label();Choice choice1 = new Choice();Button button2 = new Button();Button button3 = new Button();BorderLayout borderLayout3 = new BorderLayout();Panel panel4 = new Panel();Panel panel4_1 = new Panel();Panel panel4_2 = new Panel();Panel panel4_3 = new Panel();Label label3 = new Label("黑棋");Label label4 = new Label("白棋");JTextArea BlackNumber = new JTextArea("02"); //定义并初始化黑棋计数板JTextArea WhiteNumber = new JTextArea("02"); //定义并初始化白棋计数板BlackAndWhiteDesign(){try{bwInit();}catch(Exception e){e.printStackTrace();}}private void bwInit() throws Exception{this.setTitle("网络黑白棋作者:刘茂龙");new Thread(this).start();//启动监听线程this.PORT = 1976;this.isInitiative = false;//是否主动连接this.stopFlag = false;//是否继续监听的标志this.messagePoint = new Point();choice1.setBackground(new Color(236, 190, 98)); this.choice1.addItem("黑");this.choice1.addItem("白");this.setBackground(new Color(236, 190, 98)); this.setSize(580,565);this.setResizable(false);this.setVisible(true);checkbox1.addMouseListener(new MouseAdapter() {public void mouseClicked(MouseEvent e){checkbox1_mouseClicked(e);}});panel1.setLayout(new BorderLayout()); checkbox1.setCheckboxGroup(checkboxGroup1); checkbox1.setLabel("单机");checkbox2.addMouseListener(new MouseAdapter() {public void mouseClicked(MouseEvent e){checkbox2_mouseClicked(e);}});checkbox2.setCheckboxGroup(checkboxGroup1); checkbox2.setLabel("联机");label1.setText("对方地址");button1.setBackground(new Color(236, 190, 98)); button1.setLabel("连接");button1.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e){button1_actionPerformed(e);}});label2.setText(" ");button2.setBackground(new Color(236, 190, 98)); button2.setLabel("开始");button2.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e){button2_actionPerformed(e);}});button3.setBackground(new Color(236, 190, 98)); button3.setLabel("重新开始");this.button3.setEnabled(false);button3.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e){button3_actionPerformed(e);}});Background.addMouseListener(new MouseAdapter() {public void mouseClicked(MouseEvent e){Background_mouseClicked(e);}});this.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){this_windowClosing(e);}});panel3.setLayout(new GridLayout(9, 1));panel3.setBackground(new Color(236, 190, 98)); panel3.add(checkbox1);panel3.add(checkbox2);panel3.add(label1);PtextField1.add(textField1);panel3.add(PtextField1);panel3.add(choice1);panel3.add(button1);panel3.add(button2);panel3.add(button3);panel3.add(label2);panel4.setLayout(new GridLayout(1, 3));label3.setFont(new Font("h",15,30));panel4_1.add(label3);BlackNumber.setFont(new Font("h",15,30));BlackNumber.setEditable(false);panel4_1.add(BlackNumber);label4.setFont(new Font("h",15,30));panel4_2.add(label4);WhiteNumber.setFont(new Font("h",15,30));WhiteNumber.setEditable(false);panel4_2.add(WhiteNumber);panel4.add(panel4_1);panel4.add(panel4_2);panel4.add(panel4_3);this.panel1.add(this.Background,BorderLayout.CENTER);this.panel1.add(panel3, BorderLayout.EAST);this.panel1.add(panel4, BorderLayout.SOUTH);this.add(panel1, BorderLayout.CENTER);this.disableLink();//废掉控件this.checkboxGroup1.setSelectedCheckbox(this.checkbox1);this.centerWindow();this.Background.setEnabled(false);this.setVisible(true);}void checkbox1_mouseClicked(MouseEvent e){this.button2.setEnabled(true);this.disableLink();//disable联机时用的控件void disableLink(){this.textField1.setBackground(new Color(236, 190, 98));this.textField1.setEnabled(false);this.choice1.setEnabled(false);this.button1.setEnabled(false);}void checkbox2_mouseClicked(MouseEvent e){this.enableLink();}void enableLink(){this.textField1.setBackground(Color.white);this.textField1.setEnabled(true);this.choice1.setEnabled(true);this.button1.setEnabled(true);this.button2.setEnabled(false);}void button1_actionPerformed(ActionEvent e){this.stopFlag = false;this.goToLink(this.textField1.getText().trim(),this.PORT);this.button2.setEnabled(true);//开始void button2_actionPerformed(ActionEvent e){if(e.getActionCommand().equals("开始")){this.stopFlag = false;this.disableLink();this.button3.setEnabled(true);this.checkbox1.setEnabled(false);this.checkbox2.setEnabled(false);this.button2.setLabel("退出");if(this.isSingle())this.Background.setEnabled(true);//判断类型boolean isSingle(){return this.checkbox1.getState();}void button3_actionPerformed(ActionEvent e){if (isSingle()){int Choose;Choose=JOptionPane.showConfirmDialog(null, "您确定要重新开始吗?", "提示", JOptionPane.YES_NO_OPTION);if (Choose == JOptionPane.YES_OPTION){this.Background.Restart();String s1, s2;if (this.Background.BlackNumberc<=9) s1="0"+Integer.toString(this.Background.BlackNumberc);else s1 = Integer.toString(this.Background.BlackNumberc);if (this.Background.WhiteNumberc<=9) s2="0"+Integer.toString(this.Background.WhiteNumberc);else s2 = Integer.toString(this.Background.WhiteNumberc);this.BlackNumber.setText(s1);this.WhiteNumber.setText(s2);this.button1.setEnabled(false);this.button2.setLabel("开始");this.button3.setEnabled(false);this.checkbox1.setEnabled(true);this.checkbox2.setEnabled(true);this.clearMyColor();this.Background.setEnabled(false);this.stepColor = true;}}else this.writer.println("clear");}//显示错误信息void showError(String errorMessage){Graphics g=this.getGraphics();g.setColor(new Color(236,190,98));g.fillRect(10,10,300,15);g.setColor(Color.red);g.drawString(errorMessage,22,20);g.fillOval(10,10,10,10);}private void bwInit() throws Exception{this.setBackground(new Color(236, 190, 98));}}class Listen extends Thread{Socket socket;BlackAndWhiteDesign BlackAndWhiteDesign;public Listen(Socket socket,BlackAndWhiteDesign BlackAndWhiteDesign){this.socket=socket;this.BlackAndWhiteDesign=BlackAndWhiteDesign;}public void run(){try{this.activeListen(this.socket);}catch(IOException ioe){this.BlackAndWhiteDesign.Background.showError("意外中断");} }void activeListen(Socket socket) throws IOException{BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));String message;while(true){message=reader.readLine();this.BlackAndWhiteDesign.doMessage(message);}}}课程设计实践总结:课程设计总结:通过这次毕业设计,对很多东西有了新的认识和新的见解,认识问题的和思考解决办法有了本质上的进步,特别是对一个游戏开发的模式有了更深的认识,对专业技能的运用更熟练。
c语言课程设计黑白棋

c语言课程设计黑白棋一、教学目标本课程的目标是让学生掌握C语言编程的基本技能,通过实现一个黑白棋游戏项目,培养学生的编程思维和实际操作能力。
具体目标如下:1.知识目标:学生能熟练使用C语言进行编程,理解基本的编程概念,如变量、数据类型、运算符、控制结构等。
2.技能目标:学生能运用C语言实现简单的逻辑控制和函数调用,具备一定的算法分析能力,能独立完成黑白棋游戏的设计与实现。
3.情感态度价值观目标:培养学生对编程的兴趣和热情,提高学生的问题解决能力,培养学生的团队合作意识和创新精神。
二、教学内容教学内容以C语言的基本概念和编程技巧为主线,结合黑白棋游戏的设计与实现,具体安排如下:1.C语言基本概念:介绍C语言的语法规则、数据类型、运算符、控制结构等基本知识。
2.函数和数组:讲解函数的定义和调用、数组的使用和操作,以及函数指针的概念。
3.黑白棋游戏设计:引导学生分析游戏需求,设计游戏界面和逻辑,实现游戏的基本功能。
4.算法分析和优化:引导学生运用算法分析游戏中的问题,如棋子的移动规则、胜负判断等,并进行优化。
5.团队合作与创新:培养学生进行团队合作,共同完成游戏项目,鼓励学生发挥创新精神,为游戏添加更多功能和玩法。
三、教学方法本课程采用讲授法、讨论法、案例分析法和实验法等多种教学方法,具体安排如下:1.讲授法:讲解C语言的基本概念和编程技巧,为学生提供系统的知识体系。
2.讨论法:学生进行团队讨论,分析游戏需求,设计游戏方案,培养学生的团队合作能力。
3.案例分析法:通过分析典型的黑白棋游戏案例,引导学生掌握游戏设计的要点和技巧。
4.实验法:学生动手编写代码,实现游戏功能,培养学生的实际操作能力和编程思维。
四、教学资源教学资源包括教材、参考书、多媒体资料和实验设备等,具体安排如下:1.教材:选用《C程序设计原理与应用》作为主讲教材,为学生提供系统的知识学习。
2.参考书:推荐《C语言程序设计》等辅助教材,供学生拓展阅读和自学。
黑白棋游戏课程设计

目录一、设计目的 (2)二、设计要求 (2)三、所需仪器设备 (2)四、课题分析 (2)五、具体设计过程 (3)5.1、设计思路 (3)5.2、程序设计流程图 (3)5.3、函数实现说明 (6)5.4、图形库函数介绍 (7)5.5、程序源代码及注释 (9)5.6、调试结果 (19)六、设计心得体会 (20)七、参考文献 (21)《黑白棋游戏》C语言课程设计一、设计目的本课程设计是计算机软件技术基础重要的实践性环节之一,是在学生学习完《程序设计语言(C)》课程后进行的一次全面的综合练习。
本课程设计的目的和任务:(1)巩固和加深学生对C语言课程的基本知识的理解和掌握;(2)掌握C语言编程和程序调试的基本技能;(3)利用C语言进行基本的软件设计,掌握软件设计一般方法,了解软件设计的思路;(4)掌握书写程序设计报告的能力;(5)提高运用C语言解决实际问题的能力;这个程序也是对编程基本功的一个训练,对于初学C语言的人,讲分支、循环、数组函数综合应用,而不仅限于编制独立的小程序,能够大大提高变成水平。
二、设计要求(1)收集资料,全面分析课题,分解问题,形成中体编程思路;(2)深入分析各个小问题,编写个部分程序模块;(3)对于设计中用到的关键函数,要联系实际问题进行具体介绍;(4)上机调试,确保程序能正确运行;(5)设计完成后提交课程设计报告;三、所需仪器设备(1)硬件要求能运行Windows 2000/XP操作系统的微机系统。
(2)C语言程序设计及相应的开发环境。
(本设计用的是Turbo C for Windows 集成实验与学习环境 V6.0)四、课题分析编写一个《黑白棋游戏》的C程序,包括以下功能:初始状态:在一个8*8的棋盘中央交叉排放黑白棋子各两枚,白棋先走。
(1)每个棋手下棋时,摆子的位置必须是以自己的棋子能包围住对方一个或多个棋子,被包围住的对方棋子将成为自己的棋子。
包围的方向可以是上下左右以及斜线8个方向,只要能连成一线即可。
C++课程设计:黑白棋游戏

课程设计报告课程名称:面向对象程序设计C++设计题目:黑白棋游戏专业:计算机科学与技术姓名:学号:指导教师:李晓虹2015 年 1 月 10 日一、需求分析关于黑白棋的功能描述如下:运行游戏并进行初始化工作,将整个游戏区域分成纵向和横向扩展的若干个小方块,并且这些小方块是由黑棋和白棋分布于游戏区域的不同位置。
玩家可以通过选取方格来对它们进行下棋的操作,直到游戏结束。
游戏的整体运行效果如图1.1。
图1.1二、总体设计2.1、类设计这个游戏的主要类是游戏模式类,类名为COthelloDlg。
代码如下:class COthelloDlg : public CDialog{// Constructionpublic:void GameStart();void PlayBackMusic(BOOL bCheck);void InitMenu();COthelloDlg(CWnd* pParent = NULL); // standard constructorint m_nBlackCount; //黑¨²子Á¨®个?数ºyint m_nWhiteCount; //白ã¡Á子Á¨®个?数ºyCChessBoard m_chess;//棋?盘¨¬对?象¨®// Dialog Data//{{AFX_DATA(COthelloDlg)enum { IDD = IDD_OTHELLO_DIALOG };// NOTE: the ClassWizard will add data members here//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(COthelloDlg)protected:virtualvoid DoDataExchange(CDataExchange* pDX); // DDX/DDV support//}}AFX_VIRTUAL// Implementationprotected:HICON m_hIcon;// Generated message map functions//{{AFX_MSG(COthelloDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnAbout();afx_msg void OnExitGame();afx_msg void OnGameStart();afx_msg void OnHelp();afx_msg void OnLevelHigh();afx_msg void OnLevelLow();afx_msg void OnLevelNor();afx_msg void OnPlayMusic();afx_msg void OnBackBtn();//}}AFX_MSGafx_msg void OnRecalc(WPARAM wParam, LPARAM lParam);DECLARE_MESSAGE_MAP()};//{{AFX_INSERT_LOCATION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif// !defined(AFX_OTHELLODLG_H__DAC0C8C2_DDB6_4DA7_A56E_440CDF9A626B__INCLUDED_) ;2.2、程序源代码及注释#include "graphics.h" /*图形系统头文件*/ #define LEFT 0x4b00 /*光标左键值*/ #define RIGHT 0x4d00 /*光标右键值*/ #define DOWN 0x5000 /*光标下键值*/ #define UP 0x4800 /*光标上键值*/ #define ESC 0x011b /* ESC键值*/ #define ENTER 0x1c0d /* 回车键值*/int a[8][8]={0},key,score1,score2;/*具体分数以及按键与存放棋子的变量*/ char playone[3],playtwo[3];/*两个人的得分转换成字符串输出*/ void playtoplay(void);/*人人对战函数*/ void DrawQp(void);/*画棋盘函数*/void SetPlayColor(int x);/*设置棋子第一次的颜色*/ void MoveColor(int x,int y);/*恢复原来棋盘状态*/ int QpChange(int x,int y,int z);/*判断棋盘的变化*/ void DoScore(void);/*处理分数*/ void PrintScore(int n);/*输出成绩*/ void playWin(void);/*输出胜利者信息*/ /******主函数*********/ void main(void){int gd=DETECT,gr;initgraph(&gd,&gr,"c:\\tc"); /*初始化图形系统*/ DrawQp();/*画棋盘*/ playtoplay();/*人人对战*/ getch();closegraph();/*关闭图形系统*/ }void DrawQp()/*画棋盘*/ { int i,j;score1=score2=0;/*棋手一开始得分都为0*/ setbkcolor(BLUE); for(i=100;i<=420;i+=40) {line(100,i,420,i);/*画水平线*/ line(i,100,i,420); /*画垂直线*/ } setcolor(0);/*取消圆周围的一圈东西*/setfillstyle(SOLID_FILL,15);/*白色实体填充模式*/ fillellipse(500,200,15,15); /*在显示得分的位置画棋*/ setfillstyle(SOLID_FILL,8); /*黑色实体填充模式*/ fillellipse(500,300,15,15); a[3][3]=a[4][4]=1;/*初始两个黑棋*/ a[3][4]=a[4][3]=2;/*初始两个白棋*/ setfillstyle(SOLID_FILL,WHITE); fillellipse(120+3*40,120+3*40,15 ,15); fillellipse(120+4*40,120+4*40,15,15); setfillstyle(SOLID_FILL ,8);fillellipse(120+3*40,120+4*40,15,15); fillellipse(120+4*40,120+3*40, 15,15); score1=score2=2; /*有棋后改变分数*/ DoScore();/*输出开始分数*/ }void playtoplay()/*人人对战*/ { int x,y,t=1,i,j,cc=0; while(1)/*换棋手走棋*/ {x=120,y=80;/*每次棋子一开始出来的坐标,x为行坐标,y为列坐标*/ while(1) /*具体一个棋手走棋的过程*/ {PrintScore(1);/*输出棋手1的成绩*/ PrintScore(2);/*输出棋手2的成绩*/SetPlayColor(t);/*t变量是用来判断棋手所执棋子的颜色*/ fillellipse(x,y,15,15); key=bioskey(0);/*接收按键*/ if(key==ESC)/*跳出游戏*/ break; elseif(key==ENTER)/*如果按键确定就可以跳出循环*/ {if(y!=80&&a[(x-120)/40][(y-120)/40]!=1&&a[(x-120)/40][(y-120)/40]!=2)/*如果落子位置没有棋子*/ {if(t%2==1)/*如果是棋手1移动*/ a[(x-120)/40][(y-120)/40]=1; else/*否则棋手2移动*/ a[(x-120)/40][(y-120)/40]=2;if(!QpChange(x,y,t))/*落子后判断棋盘的变化*/ {a[(x-120)/40][(y-120)/40]=0;/*恢复空格状态*/ cc++;/*开始统计尝试次数*/if(cc>=64-score1-score2) /*如果尝试超过空格数则停步*/ {MoveColor(x,y);fillellipse(x,y,15,15); break; } elsecontinue;/*如果按键无效*/ }三.流程图四、设计心得体会以前也做过一次c语言课程设计,但那时候对c语言基本的知识点都不是很懂,更别说要我们编出那种图形界面的程序来。
黑白棋实验报告

一、实验背景黑白棋,又称五子棋、连珠棋等,是一种两人对弈的策略型棋类游戏。
本实验旨在通过编程实现黑白棋游戏,并运用人工智能算法优化游戏策略,提高游戏水平。
二、实验目的1. 理解黑白棋游戏规则及基本策略。
2. 掌握人工智能在黑白棋游戏中的应用。
3. 通过优化算法,提高黑白棋游戏水平。
三、实验内容1. 黑白棋游戏规则黑白棋游戏规则如下:(1)棋盘为15×15的网格,每个网格可以放置一枚棋子。
(2)黑方先手,双方轮流在空白网格放置棋子,黑色棋子为“黑”,白色棋子为“白”。
(3)当任意一方在水平、竖直或两个对角线上形成连续的五个棋子时,该方获胜。
2. 人工智能算法本实验采用Minimax(最小-最大)算法进行人工智能策略优化。
Minimax算法是一种决策树搜索算法,用于解决二人零和博弈问题。
在黑白棋游戏中,Minimax算法通过模拟对手的走法,寻找最优的落子策略。
3. 优化算法为了提高游戏水平,我们对Minimax算法进行了以下优化:(1)棋子权重:将棋盘上的棋子按照位置赋予不同的权重,以反映棋子的重要程度。
例如,棋盘中心的棋子权重高于边缘棋子。
(2)22点权重:在棋盘的四个角落,我们赋予额外的权重,以鼓励在角落放置棋子。
(3)边线权重:棋盘边缘的棋子权重高于中间棋子,以反映棋子贴边的重要性。
(4)顶角权重:棋盘四个顶角的棋子权重最高,以鼓励在顶角放置棋子。
四、实验结果与分析1. 游戏效果通过优化后的Minimax算法,我们的黑白棋游戏水平得到了显著提高。
在与对手的对弈中,我们能够更好地判断棋局走势,制定合理的落子策略。
2. 优化效果分析(1)棋子权重:通过对棋子权重的优化,我们能够更好地把握棋局走势,避免在棋局后期陷入被动。
(2)22点权重:在棋局初期,我们倾向于在22点位置放置棋子,以占据有利地形。
(3)边线权重:在棋局中后期,我们注重在棋盘边缘放置棋子,以扩大棋局范围。
(4)顶角权重:在棋局的关键时刻,我们会在顶角位置放置棋子,以形成优势。
C语言课程设计黑白棋课程设计

问题:程序兼容性差,无法在不同平台上运行 解决方案: 优化代码,提高程序兼容性,确保在不同平台上正常运行 解决方案:优化代码,提高程序兼容性,确保在不同平台上正常运 行
课程设计总结与展望
课程设计收获与体会
学习了C语言的基本语法 和编程技巧
掌握了黑白棋游戏的基本 规则和算法
提高了解决问题的能力和 逻辑思维能力
增强了团队协作和沟通能 力
对未来课程设计有了更深 入的理解和认识
C语言在实际项目中的应用
操作系统:C语言 是许多操作系统的 核心语言,如 Linux、Unix等
嵌入式系统:C语 言在嵌入式系统中 广泛应用,如智能 家电、汽车电子等
常见问题与解决方案
问题:算法效率低下,运行速度慢 解决方案:优化算法, 减少循环次数,提高代码执行效率 解决方案:优化算法,减少循环次数,提高代码执行效率
问题:内存占用过大,导致程序崩溃 解决方案:优化数据 结构,减少内存占用,提高程序稳定性 解决方案:优化数据结构,减少内存占用,提高程序稳定性
游戏规则介绍
黑白棋棋盘为 8*8的方格,双
方轮流落子
落子规则:棋 子落在棋盘的 空格上,不能 落在已有棋子
的格子上
吃子规则:当 一方棋子被另 一方棋子包围 时,被包围的 棋子将被吃掉
胜利条件:当 一方棋子被全 部吃掉或无路 可走时,另一
方获胜
游戏结束:当 双方都无法再 落子或吃掉对 方棋子时,游
学习其他编程语言, 拓宽自己的知识面 和就业选择
感谢您的耐心观看
汇报人:
棋子移动:棋子只能移动到相邻的空格,不 能越过其他棋子
【精编范文】黑白棋实验报告-word范文 (7页)

本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!== 本文为word格式,下载后可方便编辑和修改! ==黑白棋实验报告篇一:黑白棋程序设计实验报告C++版海南大学课程论文课程名称:数据结构课程设计题目名称:黑白棋姓名:学号:评阅教师:201X年 12月 17 日目录一、黑白棋简介 (2)二、程序设计思路及实现界面图 (3)三、程序设计算法性能分析 (6)四、实验总结 (6)五、实验代码 (7)一、黑白棋简介黑白棋,又叫反棋(Reversi)、奥赛罗棋(Othello),苹果棋,翻转棋。
黑白棋的棋子和围棋类似。
但它的下法与围棋的很不相同。
黑白棋是由黑方和白方两人进行的益智游戏。
棋盘为N×N方格,黑白棋总共使用N个棋子,每个棋子分正反两面,分别是黑色和白色。
轮到一方下棋时,必须把棋下在与对方棋子相邻的空位上,要求所下的棋子和原有的已方棋子夹住对方的至少一个棋子(横竖斜夹均可),然后把被夹住的子变成己方的颜色(也叫吃子)。
下棋过程中,任何棋子既不会从棋盘上拿走,也不会从一个格子移到另一个格子,吃子时,不会发生连锁反应,吃进的棋子不能再夹吃其他的子。
当双方都无棋可下,或者方格全部占满后,棋局结束,子多的一方为胜方。
2二、程序设计思路及游戏实现界面1、设计初始化棋盘函数2、复制棋盘函数3、显示棋盘函数4、选择下棋类型4、计算可落子的位置个数,及该位置落子后翻过的棋子的个数5、设置棋子的稳定性(计算得分的依据),空白处除外6、评价棋手得分游戏开始选择类型和棋子:打印棋盘棋手开始下棋输入下棋的位置:游戏结束,统计棋数并分出胜负:篇二:C语言-黑白棋实验报告福建工程学院计算机与信息科学系实验报告12345篇三:黑白棋课程设计报告惠州经济职业技术学院计算机专业课程设计报告课题名称:关于黑白棋游戏的设计专业:班级:组长: XXX小组成员:二O一O年十二月摘要中国最早出现黑白棋是在80年代的任天堂游戏机和苹果II个人电脑游戏里,但从那时一直玩到现在的人已经寥寥可数了,我们只能说,从那时起,中国第一次出现了黑白棋;然后就是1990年的Windows 3.0的推出,当时Windows自带的游戏就是黑白棋,由于当时电脑还比较少,没等到黑白棋传开,Windows 3.1推出,把自带游戏换成现在大家见到的踩地雷和接龙;让大量人认识黑白棋的是文曲星,文曲星的黑白棋棋力很低,一个人下了几盘以后就可以轻易把它打败,棋力之低简直可以说是误人子弟的地步,让人一叶障目,不见森林,以为黑白棋不过尔尔;在90年代中期流行的任天堂Gameboy当中也有一款黑白棋游戏,棋力甚为不错,比起以上提及的游戏强很多。
黑白棋课程设计

中南林业科技大学本科课程设计说明书学生姓名:杨明学号:********学院:理学院专业年级: 2013级信息与计算科学课程: visual c++面向对象与可视化程序设计设计(论文)题目:黑白棋指导教师:**2015年11月中文摘要黑白棋,也称反棋(Reversi)、奥赛罗棋(Othello),苹果棋,翻转棋是一个经典的策略性游戏。
黑白棋是19世纪末英国人发明的。
直到上个世纪70年代一个日本人将其发展,借用莎士比亚名剧奥赛罗(Othello)为这个游戏重新命名,也就是现在大家玩的黑白棋。
为何借用莎士比亚名剧呢?是因为奥赛罗是莎士比亚一个名剧的男主角。
他是一个黑人,妻子是白人,因受小人挑拨,怀疑妻子不忠一直情海翻波,最终亲手把妻子杀死。
后来真相大白,奥赛罗懊悔不已,自杀而死。
黑白棋就是借用这个黑人白人斗争的故事而命名。
关键词程序设计,MFC,VC++与面向对象,引言游戏通过相互翻转对方的棋子,最后以棋盘上谁的棋子多来判断胜负。
它的游戏规则简单,因此上手很容易,但是它的变化又非常复杂。
起初,黑白棋在西方和日本很流行,近年来,黑白棋正逐步为中国玩家所接受,并深受喜爱。
1、课程设计计划黑白棋游戏设计所完成的就是一个游戏软件系统。
我以前下过黑白棋,对其有一定的了解,但只是一个初级玩家。
要完成游戏的设计,首先要对黑白棋进行全面的了解,然后进行需求分析,对软件有一个总体的设计,之后进行详细设计,并对各种细节及可能的问题进行分析,最后进行编码调试。
具体步骤如下:第一步:查询黑白棋的下棋规则及其历史。
第二步:对于如何赢棋及下棋策略进行一定的了解。
第三步:对于黑白棋游戏软件的功能需求进行全面的分析,其包括:基本功能的需求及拓展空能的需求。
第四步:进行总体的框架设计。
第五步:对于总体设计中的各个子模块,进行详细设计,并对可能出现的问题及难以解决的地方进行标记,同时可查阅相关的资料进行初步解决。
第六步:上机编码调试,对出现的问题有针对性的加以解决。
课程设计黑白棋摘要

课程设计黑白棋摘要一、课程目标知识目标:1. 学生能够理解黑白棋的基本规则和策略。
2. 学生能够掌握黑白棋的棋谱记录方法。
3. 学生能够了解黑白棋的历史背景和竞技发展。
技能目标:1. 学生能够运用所学策略进行黑白棋对局,提高解题能力。
2. 学生能够通过棋谱分析,提升自己的下棋技巧。
3. 学生能够运用逻辑思维和判断能力,制定有效的攻防策略。
情感态度价值观目标:1. 学生培养良好的竞技道德,尊重对手,公平竞争。
2. 学生在黑白棋游戏中,培养团队合作精神和沟通能力。
3. 学生通过黑白棋的学习,锻炼意志力和抗压能力,形成积极向上的心态。
课程性质:本课程以黑白棋为载体,结合学生的年级特点,注重培养学生的逻辑思维、策略运用和团队协作能力。
学生特点:六年级学生具备一定的逻辑思维和判断能力,对竞技类游戏有较高的兴趣,喜欢挑战和交流。
教学要求:教师应关注学生的个体差异,因材施教,激发学生的学习兴趣,提高学生的综合素养。
在教学过程中,注重理论与实践相结合,使学生在实践中掌握知识,提高技能。
同时,关注学生的情感态度价值观的培养,引导学生在游戏中树立正确的价值观。
通过分解课程目标为具体学习成果,为后续的教学设计和评估提供依据。
二、教学内容1. 黑白棋基本规则:介绍黑白棋的棋盘、棋子、下棋方法和胜负判定标准。
- 教材章节:第二章《黑白棋的基本规则》- 内容列举:棋盘布局、棋子颜色、下棋顺序、有效落子、翻转规则、胜负判定。
2. 黑白棋策略与技巧:讲解黑白棋的基本策略、攻防技巧和棋型分析。
- 教材章节:第三章《黑白棋的策略与技巧》- 内容列举:开局策略、中局攻防、残局技巧、棋型判断、策略运用。
3. 棋谱记录与分析:学习棋谱记录方法,通过棋谱分析提升下棋水平。
- 教材章节:第四章《棋谱记录与分析》- 内容列举:棋谱符号、记录方法、棋谱分析、经典棋谱解析。
4. 黑白棋历史与竞技发展:介绍黑白棋的历史起源、竞技赛事和著名棋手。
- 教材章节:第五章《黑白棋的历史与竞技发展》- 内容列举:历史起源、国际赛事、国内发展、著名棋手介绍。
嵌入式WinCE课程设计报告-黑白棋

目录第一章:概述 (3)1.1研究动机 (3)1.2研究进度 (3)1.3专题成果概述 (3)第二章:实验平台的构建 (4)2.1Wince的烧写 (4)2.2Microsoft ActiveSync的同步 (11)第三章:系统设计 (14)3.1界面要求 (14)3.2功能要求 (14)第四章:实作完成 (14)4.1界面设计 (14)4.2代码实现 (15)4.3程序调试 (23)第五章:所遇问题与解决办法 (24)第六章:心得与未来展望 (24)6.1心得 (24)6.2未来展望 (25)第一章:概述1.1研究动机随着网络技术的日新月异和计算机的普及,当今的计算机技术也走上了平民化和娱乐化的时代,计算机技术再也不是只能由少数人掌握的深不可测的学问;同时个人计算机也由原来单纯的数值计算和工业应用逐渐转变成像电视机一样的家庭娱乐中心,伴随着这种巨大的转变计算机软件的发展也走向了娱乐化。
尤其是游戏产业的发展已经成为信息产业中发展势头最猛烈最具前景的一个分支,而游戏厅也渐渐被网吧挤出了正常的营业市场,游戏除了单纯的个人娱乐功能之外,也逐渐向互动的方向发展。
游戏的功能不断按照玩家的需求和爱好扩展延伸进化,如今运行在各种平台上不同名称,不同内容,不同形式的游戏不仅仅为广大游戏爱好者提供了丰富的选择,而且为游戏开发商带来了丰厚的回报,游戏产业吸引着许多程序员去开发更多更新的游戏。
基于游戏发展的历史和前景,我们决定用C#语言开发一款小游戏,游戏内容来自网络上日渐流行的一种智力游戏‘黑白棋’。
黑白棋作为一款经典的棋类博弈游戏,经久不衰,具有很强的趣味性,深受广大游戏爱好者的喜爱。
那么开放一款基于WinCE的黑白棋游戏,具有很高的实用价值。
1.2研究目的随着消费类电子产业的蓬勃发展,越来越多的嵌入式电子产品走进了千家万户。
各式各样的嵌入式系统出现在了众多的行业和应用中,其中WinCE产品在市场上最受青睐。
本课题的黑白棋游戏设计就是基于WinCE平台的。
C语言课程设计报告--黑白棋

C语言程序设计课程设计题目:黑白棋课程设计(报告)任务及评语目录第1章课程设计的目的与要求 (1)1.1 课程设计目的 (1)1.2 课程设计的实验环境 (1)1.3 课程设计的预备知识 (1)1.4 课程设计要求 (1)第2章课程设计内容 (2)2.1程序功能介绍 (2)2.2程序整体设计说明 (2)2.2.1设计思路 (2)2.2.2数据结构设计及用法说明 (3)2.2.3程序结构(流程图) (4)2.2.4各模块的功能及程序说明 (6)2.2.5程序结果 (6)2.3程序源代码及注释 (6)第3章课程设计总结 (16)参考资料 (17)第1章课程设计的目的与要求1.1 课程设计目的本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完《程序设计语言(C)》课程后进行的一次全面的综合练习。
本课程设计的目的和任务:1. 巩固和加深学生对C语言课程的基本知识的理解和掌握2. 掌握C语言编程和程序调试的基本技能3. 利用C语言进行基本的软件设计4. 掌握书写程序设计说明文档的能力5. 提高运用C语言解决实际问题的能力1.2 课程设计的实验环境硬件要求能运行Windows 2000/XP操作系统的微机系统。
C语言程序设计及相应的开发环境。
1.3 课程设计的预备知识熟悉C语言及C语言开发工具。
1.4 课程设计要求1. 分析课程设计题目的要求2. 写出详细设计说明3. 编写程序代码,调试程序使其能正确运行4. 设计完成的软件要便于操作和使用5. 设计完成后提交课程设计报告第2章课程设计内容2.1程序功能介绍本游戏只有在可以吃到对方棋子的方格里落子吃子规则:采用夹吃的原则,左图用红色标记的是黑方可落子的位置。
当黑方落子之后,则夹在两黑子中间的白子都将变为黑子。
右图是落子后的棋盘布局,蓝色标记的是白方可落子的位置。
夹子的方向包含:水平、竖直、斜对角。
1.点击“新游戏”,将从新初始化棋局。
2.打开游戏存档,默认是.bwc文件3.保存当前游戏,默认扩展名为.bwc4.后退一步,即悔棋5.前进一步,只有在前面的操作存在后退的基础上,该按钮才有效。
计算机技术基础课程设计---黑白棋

计算机技术基础课程设计C语言设计报告题目:黑白棋学院:化学工程学院专业:班级:题目:黑白棋一、选题背景:我们日常生活中的小游戏机、手机上,经常会有黑白棋、拼图游戏、俄罗斯方块、推箱子、乒乓弹球等小游戏,这些小游戏可以让我们在日常紧张繁忙的生活中调节情绪,以达到放松身心的作用。
因此,我做了一个黑白棋的小游戏,希望在学习的空闲时间能够过得开心快乐!二、设计思想:该游戏是一款轻巧易玩的游戏。
利用C语言提供的丰富的图形函数构筑友好的图形界面。
利用了FOR,WHILE循环以及if判断实现游戏的各种分支顺利进行。
游戏初始在棋盘中央每方有二子,双方交替下子。
后下一方的两个棋子夹着的对方棋子变为己方棋子。
如无处可下子则继续由另一方下子。
棋盘为8×8的格。
未下满时一方无子则自动判负。
当棋盘下满后棋子多的一方为胜。
当双方子数量相同时判为和棋。
三、程序流程图四、程序清单#include "graphics.h" /*图形系统头文件*/#define LEFT 0x4b00 /*光标左键值*/#define RIGHT 0x4d00 /*光标右键值*/#define DOWN 0x5000 /*光标下键值*/#define UP 0x4800 /*光标上键值*/#define ESC 0x011b /* ESC键值*/#define ENTER 0x1c0d /* 回车键值*/int a[8][8]={0},key,score1,score2;/*分数以及按键与存放棋子的变量*/ char playone[3],playtwo[3];/*两个人的得分转换成字符串输出*/void playtoplay(void);/*人人对战函数*/void DrawQp(void);/*画棋盘函数*/void SetPlayColor(int x);/*设置棋子第一次的颜色*/void MoveColor(int x,int y);/*恢复原来棋盘状态*/int QpChange(int x,int y,int z);/*判断棋盘的变化*/void DoScore(void);/*处理分数*/void PrintScore(int n);/*输出成绩*/void playWin(void);/*输出胜利者信息*/void main(void){int gd=DETECT,gr;initgraph(&gd,&gr,"c:\\tc"); /*初始化图形系统*/DrawQp();/*画棋盘*/playtoplay();/*人人对战*/getch();closegraph();/*关闭图形系统*/}void DrawQp()/*画棋盘*/{int i,j;score1=score2=0;/*棋手一开始得分都为0*/setbkcolor(GREEN);/*设置背景颜色*/for(i=100;i<=420;i+=40){line(100,i,420,i);/*画水平线*/line(i,100,i,420); /*画垂直线*/}setcolor(0);/*取消圆周围的一圈东西*/setfillstyle(SOLID_FILL,15);/*白色实体填充模式*/fillellipse(500,200,15,15); /*在显示得分的位置画棋*/setfillstyle(SOLID_FILL,8); /*黑色实体填充模式*/fillellipse(500,300,15,15);a[3][3]=a[4][4]=1;/*初始两个黑棋*/a[3][4]=a[4][3]=2;/*初始两个白棋*/setfillstyle(SOLID_FILL,WHITE);fillellipse(120+3*40,120+3*40,15,15);fillellipse(120+4*40,120+4*40,15,15);setfillstyle(SOLID_FILL,8);fillellipse(120+3*40,120+4*40,15,15);fillellipse(120+4*40,120+3*40,15,15);score1=score2=2; /*有棋后改变分数*/DoScore();/*输出开始分数*/}void playtoplay()/*人人对战*/{int x,y,t=1,i,j,cc=0;while(1)/*换棋手走棋*/{x=120,y=80;/*每次棋子一开始出来的坐标,x为行坐标,y为列坐标*/ while(1) /*具体一个棋手走棋的过程*/{PrintScore(1);/*输出棋手1的成绩*/PrintScore(2);/*输出棋手2的成绩*/SetPlayColor(t);/*t变量是用来判断棋手所执棋子的颜色*/fillellipse(x,y,15,15);key=bioskey(0);/*接收按键*/if(key==ESC)/*跳出游戏*/break;elseif(key==ENTER)/*如果按键确定就可以跳出循环*/{if(y!=80&&a[(x-120)/40][(y-120)/40]!=1&&a[(x-120)/40][(y-120)/40]!=2)/*如果落子位置没有棋子*/ {if(t%2==1)/*如果是棋手1移动*/a[(x-120)/40][(y-120)/40]=1;else/*否则棋手2移动*/a[(x-120)/40][(y-120)/40]=2;if(!QpChange(x,y,t))/*落子后判断棋盘的变化*/{a[(x-120)/40][(y-120)/40]=0;/*恢复空格状态*/cc++;/*开始统计尝试次数*/if(cc>=64-score1-score2) /*如果尝试超过空格数则停步*/ {MoveColor(x,y);fillellipse(x,y,15,15);break;}elsecontinue;/*如果按键无效*/}DoScore();/*分数的改变*/break;/*棋盘变化了,则轮对方走棋*/}else/*已经有棋子就继续按键*/continue;}else /*四个方向按键的判断*/if(key==LEFT&&x>120)/*左方向键*/{MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);x-=40;fillellipse(x,y,15,15);}elseif(key==RIGHT&&x<400&&y>80)/*右方向键*/{MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);x+=40;fillellipse(x,y,15,15);}elseif(key==UP&&y>120)/*上方向键*/{MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);y-=40;fillellipse(x,y,15,15);}elseif(key==DOWN&&y<400)/*下方向键*/{MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);y+=40;fillellipse(x,y,15,15);}}if(key==ESC)/*结束游戏*/break;if((score1+score2)==64||score1==0||score2==0)/*格子已经占满或一方棋子为0判断胜负*/{playWin();/*输出最后结果*/break;}t=t%2+1; /*一方走后,改变棋子颜色即轮对方走*/cc=0; /*计数值恢复为0*/} /*endwhile*/}void SetPlayColor(int t)/*设置棋子颜色*/{if(t%2==1)setfillstyle(SOLID_FILL,15);/*白色*/elsesetfillstyle(SOLID_FILL,8);/*灰色*/}void MoveColor(int x,int y)/*走了一步后恢复原来格子的状态*/{if(y<100)/*如果是从起点出发就恢复绿色*/setfillstyle(SOLID_FILL,GREEN);else/*其他情况,1就恢复白色棋子,2恢复黑色棋子,或恢复绿色棋盘*/ switch(a[(x-120)/40][(y-120)/40]){case 1:setfillstyle(SOLID_FILL,15);break; /*白色*/case 2:setfillstyle(SOLID_FILL,8);break; /*黑色*/default:setfillstyle(SOLID_FILL,GREEN); /*绿色*/}}int QpChange(int x,int y,int t)/*判断棋盘的变化*/{int i,j,k,kk,ii,jj,yes;yes=0;i=(x-120)/40; /*计算数组元素的行下标*/j=(y-120)/40; /*计算数组元素的列下标*/SetPlayColor(t);/*设置棋子变化的颜色*//*开始往8个方向判断变化*/if(j<6)/*往右边*/{for(k=j+1;k<8;k++)if(a[i][k]==a[i][j]||a[i][k]==0)/*遇到自己的棋子或空格结束*/ break;if(a[i][k]!=0&&k<8){for(kk=j+1;kk<k&&k<8;kk++)/*判断右边*/{a[i][kk]=a[i][j]; /*改变棋子颜色*/fillellipse(120+i*40,120+kk*40,15,15);}if(kk!=j+1) /*条件成立则有棋子改变过颜色*/yes=1;}}if(j>1)/*判断左边*/{for(k=j-1;k>=0;k--)if(a[i][k]==a[i][j]||!a[i][k])break;if(a[i][k]!=0&&k>=0){for(kk=j-1;kk>k&&k>=0;kk--){a[i][kk]=a[i][j];fillellipse(120+i*40,120+kk*40,15,15);}if(kk!=j-1)yes=1;}}if(i<6)/*判断下边*/{for(k=i+1;k<8;k++)if(a[k][j]==a[i][j]||!a[k][j])break;if(a[k][j]!=0&&k<8){for(kk=i+1;kk<k&&k<8;kk++){a[kk][j]=a[i][j];fillellipse(120+kk*40,120+j*40,15,15);}if(kk!=i+1)yes=1;}}if(i>1)/*判断上边*/{for(k=i-1;k>=0;k--)if(a[k][j]==a[i][j]||!a[k][j])break;if(a[k][j]!=0&&k>=0){for(kk=i-1;kk>k&&k>=0;kk--){a[kk][j]=a[i][j];fillellipse(120+kk*40,120+j*40,15,15);}if(kk!=i-1)yes=1;}}if(i>1&&j<6)/*右上*/{for(k=i-1,kk=j+1;k>=0&&kk<8;k--,kk++) if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]&&k>=0&&kk<8){for(ii=i-1,jj=j+1;ii>k&&k>=0;ii--,jj++){a[ii][jj]=a[i][j];fillellipse(120+ii*40,120+jj*40,15,15);}if(ii!=i-1)yes=1;}}if(i<6&&j>1)/*左下*/{for(k=i+1,kk=j-1;k<8&&kk>=0;k++,kk--) if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]!=0&&k<8&&kk>=0){for(ii=i+1,jj=j-1;ii<k&&k<8;ii++,jj--){a[ii][jj]=a[i][j];fillellipse(120+ii*40,120+jj*40,15,15);}if(ii!=i+1)yes=1;}}if(i>1&&j>1)/*左上*/{for(k=i-1,kk=j-1;k>=0&&kk>=0;k--,kk--) if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]!=0&&k>=0&&kk>=0){for(ii=i-1,jj=j-1;ii>k&&k>=0;ii--,jj--){a[ii][jj]=a[i][j];fillellipse(120+ii*40,120+jj*40,15,15);}if(ii!=i-1)yes=1;}}if(i<6&&j<6)/* 右下*/{for(k=i+1,kk=j+1;kk<8&&kk<8;k++,kk++)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]!=0&&kk<8&&k<8){for(ii=i+1,jj=j+1;ii<k&&k<8;ii++,jj++){a[ii][jj]=a[i][j];fillellipse(120+ii*40,120+jj*40,15,15);}if(ii!=i+1)yes=1;}}return yes;/*返回是否改变过棋子颜色的标记*/}void DoScore()/*处理分数*/{int i,j;score1=score2=0;/*重新开始计分数*/for(i=0;i<8;i++)for(j=0;j<8;j++)if(a[i][j]==1)/*分别统计两个人的分数*/score1++;elseif(a[i][j]==2)score2++;}void PrintScore(int playnum)/*输出成绩*/{if(playnum==1)/*清除以前的成绩*/{setfillstyle(SOLID_FILL,GREEN);/*设置分数区颜色*/ bar(550,100,640,400);}setcolor(YELLOW);/*设置分数颜色*/settextstyle(0,0,4);/*设置文本输出样式*/if(playnum==1)/*判断输出哪个棋手的分,在不同的位置输出*/{sprintf(playone,"%d",score1);outtextxy(550,200,playone);}else{sprintf(playtwo,"%d",score2);outtextxy(550,300,playtwo);}setcolor(0);}void playWin()/*输出最后的胜利者结果*/{settextstyle(0,0,4);setcolor(12);if(score2>score1)/*开始判断最后的结果*/outtextxy(100,50,"black win! (^o^)");elseif(score2<score1)outtextxy(100,50,"white win! (^o^)");elseouttextxy(60,50,"you all win!");}五、主要解决问题的方法及技术关键1,调用了graphics.h函数,使界面更生动。
计算机技术基础(c语言)课程设计 黑白棋游戏

计算机技术基础课程设计C语言设计报告黑白棋游戏程序一、选题背景:随着电脑的普及以及人们对C语言的崇拜,用C语言编写一些简单的应用小程序解决实际问题变的越来越容易和方便。
平常学习有点累,就容易迷上网络游戏,所以就编写了一个小黑白棋游戏,闲暇的时候玩玩,既益智又娱乐,又不至于上瘾。
二、设计思想:运用了C语言的各种语句(如FOR循环语句,IF ELSE条件语句等)。
程序设计分三大部分:第一部分为选择界面,可选择为人机下棋和双人下棋;第二部分为程序运行部分,解决整个程序中的关键问题和算法;第三部分为结束部分,主要是输出文档和设计者的信息。
三.程序流程图四.程序清单:#include"graphics.h"#include"stdio.h"#define LEN sizeof(struct dian)#define NULL 0int dian[8][8],result[10][2]; /*dian[][]中存格子的状态,无子,黑子或白子*/ int N,M,s=0,K=0;int dx,dy,key;char COMPUTER=0;int computer=2;struct dian /*记录所有已经下的子的位置*/{int x;int y;struct dian *next;};struct dian a,*p1,*p,*head;void init(void) /*初始化*/{int gd=DETECT,gm;initgraph(&gd,&gm,"c:\\tc");cleardevice();}void jiemian1(void) /*第一个界面*/{setlinestyle(0,0,3);setcolor(RED);rectangle(1,1,640,480);setcolor(BLUE);rectangle(3,3,638,478);setcolor(YELLOW);rectangle(5,5,636,476);settextstyle(0,0,6);setcolor(WHITE);outtextxy(160,160,"HEI BAI");settextstyle(0,0,1);setcolor(BLUE);outtextxy(210,280,"press 1 to play with computer");outtextxy(210,320,"press 2 to play with another");do{ /*选择是和人玩还是和电脑下去*/ COMPUTER=bioskey(0);}while(COMPUTER!='1'&&COMPUTER!='2');cleardevice();}void qipan(void) /*画棋盘*/{int i;setlinestyle(0,0,3);setcolor(9);for(i=0;i<=160;i+=20){line(240,i+160,400,i+160);line(i+240,160,i+240,320);}}void insert(int x,int y) /*将下子的位置插入链表*/{struct dian *p2;p2=(struct dian*)malloc(LEN);p2->x=x; p2->y=y;p1->next=p2;p2->next=NULL;p1=p2;}void paint(int x,int y,int t) /*画棋子*/{setcolor(t);setlinestyle(0,0,1);circle(20*x+250,20*y+170,8);setfillstyle(SOLID_FILL,t);floodfill(20*x+250,20*y+170,t);}void jiemian2(void) /*下棋的界面*/{int i,j;for(i=0;i<8;i++)for(j=0;j<8;j++)dian[i][j]=1;setcolor(8);rectangle(236,156,404,324);setfillstyle(SOLID_FILL,6);bar(238,158,402,322);setcolor(3);rectangle(8,8,160,378);bar(10,10,158,376);settextstyle(0,0,1);outtextxy(20,20,"LEFT : change");outtextxy(20,50,"RIGHT : change");outtextxy(20,80,"ENTER: play");outtextxy(20,110,"ESC : leave");setcolor(RED);outtextxy(20,200,"anything wrong?");outtextxy(40,220,"E-mail me:");outtextxy(12,245,"renren3052@");qipan();a.x=3;a.y=3;a.next=NULL;dian[3][3]=0; /*刚开局时候棋盘上的四个棋子*/ p=head=&a;p1=&a;paint(3,3,0);insert(3,4);paint(3,4,7); dian[3][4]=7;insert(4,3);paint(4,3,7); dian[4][3]=7;insert(4,4);paint(4,4,0); dian[4][4]=0;}void shine(int x,int y,int t) /*棋子闪烁*/{static int i=0,j=0;if(i==x&&j==y) return 0;do{paint(x,y,t);delay(50000);paint(x,y,6);delay(50000);}while(!kbhit());key=bioskey(0);i=x;j=y;}void scan(int x,int y,int t) /*查找可以下子的位置或是要变颜色的棋子*/{int b,c,d,e,i,j,m,n,r;K=0;if(dian[x][y]==1) r=1;else r=t;b=x-1; c=x+1; d=y-1; e=y+1;if(b<0) b=0; /*查一个子如黑子四周格子的情况,有可能出边界,把边界限制一下*/ if(c>7) c=7;if(d<0) d=0;if(e>7) e=7;for(i=b;i<=c;i++)for(j=d;j<=e;j++){if(dian[i][j]==t||dian[i][j]==1) continue;dx=i-x;dy=j-y;m=i;n=j;while(dian[m][n]==s){m+=dx;n+=dy;}if(dian[m][n]==r) continue;if(m<0||m>7||n<0||n>7) continue;result[K][0]=m;result[K][1]=n;K++;}}void vary(int x,int y,int t) /*下子,插入链表,查找并改变需要改变颜色的棋子*/{int i,m,n;if(t==0) N+=1;else M+=1;paint(x,y,t);insert(x,y);scan(x,y,t);dian[x][y]=t;for(i=0;i<K;i++){dx=result[i][0]-x;dy=result[i][1]-y;if(dx==0) dx=0;else dx=dx/abs(dx);if(dy==0) dy=0;else dy=dy/abs(dy);m=x; n=y; m+=dx; n+=dy;do{if(t==0) { N++; M--;}else { M++; N--;}paint(m,n,t);dian[m][n]=t;m+=dx; n+=dy;}while(dian[m][n]!=t);}}void presskey(int t) /*按键*/{int i;for(i=0;i<K;i++){if(computer) /*如果和电脑下并且这一步不是电脑下*/do{shine(result[i][0],result[i][1],t); /*闪烁棋子*/}while(key!=0x4b00&&key!=0x4d00&&key!=0x1c0d&&key!=0x011b);/*如果没有按键继续闪烁*/if(computer==0){srand(time(NULL)); /*电脑下棋随机选择下哪个位置*/i=rand()%K;}if(computer==0||key==0x1c0d){vary(result[i][0],result[i][1],t);break;}if(key==0x011b) exit(0); /*如果按ESC离开游戏*/}}void run(int t) /*游戏运行*/{int i;if(t==0) s=7;if(t==7) s=0;a: p=head;do{if(dian[p->x][p->y]==s) continue;scan(p->x,p->y,t); /*查找可以下子的地方并存在result数组中*/ if(K==0) continue;presskey(t);if(computer==0||key==0x1c0d) break;}while((p=p->next)!=NULL);if(key==0x4b00||key==0x4d00) goto a;}void score(void) /*显示分数*/{char str1[4],str2[4];setlinestyle(SOLID_LINE,0,THICK_WIDTH);setcolor(3);rectangle(4,4,636,476);setcolor(4);rectangle(6,6,634,474);setfillstyle(SOLID_FILL,YELLOW);rectangle(8,380,632,472);setcolor(9);rectangle(10,382,630,470);bar(12,384,628,468);settextstyle(0,0,2);setcolor(6);outtextxy(280,400,"score");sprintf(str1,"%d",N);sprintf(str2,"%d",M);outtextxy(120,430,"PLAYER1");outtextxy(260,430,str1);outtextxy(300,430,":");outtextxy(330,430,str2);if(COMPUTER=='1') outtextxy(390,430,"COMPUTER"); else outtextxy(390,430,"PLAYER2");}void winer(void) /*胜利显示*/{settextstyle(0,0,4);setcolor(9);if(N>M) outtextxy(200,50,"player1 win!");else if(N<M) outtextxy(200,50,"player2 win!");else outtextxy(200,50,"no winer!");}void soundG(void) /*结束声音*特色哦!* */{int i;for(i=20;i<=1000;i++){sound(i);delay(1500);nosound();}}void closeG() /*游戏结束*/{int i;cleardevice();settextstyle(1,0,6);setcolor(YELLOW);outtextxy(25,180,"Thanks to my teacher!");for(i=0;i<=1000;i++){delay(1500);}cleardevice();settextstyle(1,0,5);setcolor(WHITE);outtextxy(120,50,"Programme Desiged:"); outtextxy(230,120,"Xiao Wen");outtextxy(35,250,"E-mail:renren3052@"); outtextxy(190,330,"QQ:574973988");outtextxy(228,410,"2007.01.01");getch();closegraph();}main(){int i;init();jiemian1();cleardevice();N=2; M=2;jiemian2();do{if(COMPUTER=='1'){if(s==0) computer=1;else computer=0;}score();run(s);}while(N+M!=64||N==0||M==0);score();winer();settextstyle(0,0,1);outtextxy(310,95,"Do you like it?");outtextxy(260,125,"I am xiaowen.From 050606"); soundG();closeG();}五.主要解决问题的方法及技术关键:1.主要解决问题:用各种语句实现棋盘函数,下子位置链表插入函数,画棋子函数,下棋界面函数,棋子闪烁函数,下子位置函数,按键函数,运行函数,显示分数函数,胜负函数,声音函数等。
黑白棋程序设计实验报告C 版

void setStable( Chessboard *board); int evaluate(Chessboard *board,enum Color player); };
void Chessboard::initChessboard(Chessboard *board) //初始化棋盘 { //声明一个 Chessboard 结构体 board int i,j; board->whiteNum=2; board->blackNum=2; for(i=0;i<8;i++) { for(j=0;j<8;j++) { board->cell[i][j].color=BLANK; board->cell[i][j].stable=0; } } board->cell[3][3].color=board->cell[4][4].color=BLACK; board->cell[3][4].color=board->cell[4][3].color=WHITE; } // 复制棋盘. void Chessboard::clone( Chessboard *boardDest,const Chessboard *boardSource) { int i,j; boardDest->whiteNum=boardSource->whiteNum; boardDest->blackNum=boardSource->blackNum; for(i=0;i<8;i++) { for(j=0;j<8;j++) { boardDest->cell[i][j].color=boardSource->cell[i][j].color; boardDest->cell[i][j].stable=boardSource->cell[i][j].stable; } } } //显示棋盘. void Chessboard::view( Chessboard *board) { int i,j; cout<<"\n---"; for(i=0;i<8;i++)
基于单片机的黑白棋课程设计

目录1. 设计的系统的目的、用途、功能 (3)1.1.硬件设计思想和电路原理图 (3)1.2.红外线发射接收模块 (4)1.3.棋盘显示模块 (4)1.4.单片机接口 (5)1.5.硬件单元的使用 (5)2. 软件设计思想及软件流程 (6)2.1.主函数 (6)2.2.按键输入模块 (7)2.3.游戏算法模块 (8)2.4.显示模块 (9)3. 详细说明软件功能 (9)3.1.显示模块 (9)3.2.按键模块 (9)3.3.黑白棋规则模块(check_chess函数) (9)3.4.胜利模式(victory函数) (9)3.5.主函数 (10)3.6.源程序 (10)4. 系统测试过程及测试数据 (22)4.1.硬件测试: (22)4.2.软件测试单独: (22)4.3.系统与软件综合测试: (22)5. 测试数据: (22)6. 分析相应的指标参数 (22)7. 所需的全部资源 (23)8. 成员分工和工作情况................................................................................错误!未定义书签。
1.设计的系统的目的、用途、功能实现对黑白棋游戏的无子化操作,增加游戏的趣味性和方便性。
学习实践单片机显示、按键等技术。
每一枚“棋子”就是一枚双色发光二极管,64枚双色发光二极管排成8×8的阵列。
每一枚二极管有三支引脚,引脚电平的高低决定了二极管显示的颜色,而有单片机控制双色发光二极管引脚的电平高低,实现棋盘上二极管显示不同颜色,以代表棋子。
发光二极管亮度高,功耗低,寿命长,且选用双色发光二极管减少了焊接工作量,发光二极管的两种颜色红色和绿色的对比度也较大,使棋子醒目清楚。
1.1.硬件设计思想和电路原理图当阻断红外线发射二极管和接收二极管之间的光路时,接收管的电平会变化。
用16对红外线发射接收二极管,8对感受行信号,8对感受列信号,行列发射接收二极管的光路的交点即一枚棋子的位置。
黑白棋课程设计

黑白棋课程设计攀枝花学院课程设计题目:黑白棋游戏院(系):数学与计算机学院年级专业: 2014级软件工程姓名:田坤林学号: 201410804095 指导教师:陈斌二〇一五年一月十日攀枝花学院教务处制攀枝花学院本科学生课程设计任务书课程设计(论文)指导教师成绩评定表摘要黑白棋,又叫反棋(Reversi)、奥赛罗棋(Othello)、苹果棋或翻转棋。
黑白棋在西方和日本很流行。
游戏通过相互翻转对方的棋子,最后以棋盘上谁的棋子多来判断胜负。
棋子:黑白棋棋子每颗由黑白两色组成,一面白,一面黑,共64个(包括棋盘中央的4个)。
棋子呈圆饼形。
棋盘:黑白棋棋盘由64格的正方格组成,游戏进行时棋子要下在格内。
棋盘可分为“角”、“边”以及黑白棋“中腹”。
现今的棋盘多以8x8较为普遍。
棋钟:正式的比赛中可以使用棋钟对选手的时间进行限制。
非正式的对局中一般不使用棋钟。
黑白棋的棋盘是一个有8*8方格的棋盘。
下棋时将棋下在空格中间,而不是像围棋一样下在交叉点上。
开始时在棋盘正中有两白两黑四个棋子交叉放置,黑棋总是先下子。
下子的方法把自己颜色的棋子放在棋盘的空格上,而当自己放下的棋子在横、竖、斜八个方向内有一个自己的棋子,则被夹在中间的全部翻转会成为自己的棋子。
并且,只有在可以翻转棋子的地方才可以下子。
如果玩家在棋盘上没有地方可以下子,则该玩家对手可以连下。
双方都没有棋子可以下时棋局结束,以棋子数目来计算胜负,棋子多的一方获胜。
在棋盘还没有下满时,如果一方的棋子已经被对方吃光,则棋局也结束。
将对手棋子吃光的一方获胜。
每个“翻转棋”游戏开始时,棋盘上已经交叉放好了四颗棋子。
其中两颗是黑棋,另两颗是白棋。
黑棋总是先走。
当您的棋子在某一直线方向包围了对手的棋子时,就可以翻转这些棋子的颜色,使它们成为您方的颜色。
例如,如果您执黑棋,并且看到在一排白棋的某一端是一颗黑棋,那么当您将一颗黑棋放在这一排的另一端时,所有的白棋都将翻转并变为黑棋!所有的直线方向均有效:水平、垂直和斜线方向。
嵌入式系统黑白棋课程设计报告

嵌入式系统课程设计报告——黑白棋程序设计学院计算机专业计算机教师学生学号2013年x月xx 日1 设计目的利用VS2005编程实现基于WINCE的8*8大小的黑白棋程序设计。
在WINCE端运行2、开发环境软件:Visual Studio 2005Vc++6.03、设计任务及要求黑白棋棋盘大小为8*8,实现人人对战即可。
设计要求:利用二维数组标记棋盘,下子后判断横向、纵向或对角有无相同颜色棋子,若有则该线段中所有棋子置为该颜色。
棋盘所有棋子填满后游戏结束。
棋子数多者胜4、实现过程1、设计初始化棋盘函数2、复制棋盘函数3、显示棋盘函数4、选择下棋类型4、计算可落子的位置个数,及该位置落子后翻过的棋子的个数5、设置棋子的稳定性(计算得分的依据),空白处除外6、评价棋手得分4.1 硬件WINDOWS操作平台利用VC++实现黑白棋游戏设计Microsoft Visual Studio 20054.2驱动程序设计WinCE界面4.3用户应用程序设计#include <iostream>using namespace std;int const MAX=10000;enum Color{WHITE=-1,BLANK,BLACK //是否能落子 //黑子};主函数int main(void) /////////////主函数{Chessboard board;Chessboard *pBoard=&board;enum Color player=BLANK,nowPlayer=BLACK;//声明两个enum枚举变量player,nowplayerChoice choice;Choice *pChoice=&choice;int dif=-1,step=4,success=0;char restart=' ';start: ///////////////////////////////////////////// player=BLANK; ///////////////////////////////////////////// nowPlayer=BLACK;dif=-1;step=4;restart=' ';int b;cout<<"输入1为人人对战,否则为人机对战:";cin>>b;if(b==1){ /////////人人对战////////////while(player!=WHITE && player!=BLACK){cout<<"\n请选择执黑棋(○)(1),或执白棋(●)(-1)\t执黑棋先下:\n";scanf("%d",&player);/////////////////////////////////////////////////////// //////if(player!=WHITE && player!=BLACK){cout<<"黑白设置错误.\n";}}board.initChessboard(pBoard); /////////初始化棋盘///////////while(step<64) /* 棋盘上未下满64子 */{char *nowPlayerName="";if(nowPlayer==BLACK){nowPlayerName="黑棋(○)";}else if(nowPlayer==WHITE){nowPlayerName="白棋(●)";}if(board.judge(pBoard,nowPlayer)==0){if(board.judge(pBoard,(enum Color)-nowPlayer)==0){break; /* 双方都不能落子,游戏结束 */}cout<<nowPlayerName<<"\n无子可下.\n";}else{int i,j;board.view(pBoard);if(nowPlayer==player) /* 轮到人下 */{while(1){cout<<nowPlayerName<<"请输入棋子坐标(i,j):\n";cout<<"i=";cin>>i;i--;cout<<"j=";cin>>j;j--;pChoice->posX=i;pChoice->posY=j;if(i<0 || i>7 || j<0 || j>7 || pBoard->cell[i][j].color!=BLANK || pBoard->cell[i][j].stable==0){cout<<nowPlayerName<<"不能在"<<i+1<<","<<j+1<<"落子.";board.view(pBoard);}else{break;}}}else //另外一个人下{while(1){cout<<nowPlayerName<<"请输入棋子坐标(i,j):\n";cout<<"i=";cin>>i;i--;cout<<"j=";cin>>j;j--;pChoice->posX=i;pChoice->posY=j;if(i<0 || i>7 || j<0 || j>7 || pBoard->cell[i][j].color!=BLANK || pBoard->cell[i][j].stable==0){cout<<nowPlayerName<<"不能在"<<i+1<<","<<j+1<<"落子.";board.view(pBoard);}else{break;}}}board.putChess(pBoard,pChoice,nowPlayer);step++;cout<<nowPlayerName<<"落子于坐标"<<i+1<<","<<j+1;}nowPlayer=(enum Color)-nowPlayer; /* 换对方下 */}board.view(pBoard);success=pBoard->whiteNum - pBoard->blackNum;if(success>0){cout<<"\n白棋(●)获胜.\n";}else if(success<0){cout<<"\n黑棋(○)获胜.\n";}else{cout<<"\n平局.\n";}cout<<"\n游戏结束!\n";while(restart!='y' && restart!='n'){cout<<"再下一盘?(y,n)\n";cin>>restart;///////////////////////////////////////////////if(restart=='y'){goto start;}}}else{ ////////////人机对战/////////////while(dif<1 || dif>60) //设置难度{cout<<"请选择难度(1~60):\n";cin>>dif;if(dif<1 || dif>60){cout<<"难度设置错误.\n";}}while(player!=WHITE && player!=BLACK){cout<<"请选择执黑棋(○)(1),或执白棋(●)(-1)"<<endl;cout<<"执黑先行:";scanf("%d",&player);if(player!=WHITE && player!=BLACK){cout<<"黑白设置错误.\n";}}board.initChessboard(pBoard); /////////////////初始化棋盘while(step<64) // 棋盘上未下满64子{char *nowPlayerName="";if(nowPlayer==BLACK){nowPlayerName="黑棋(○)";}else if(nowPlayer==WHITE){nowPlayerName="白棋(●)";}if(board.judge(pBoard,nowPlayer)==0){if(board.judge(pBoard,(enum Color)-nowPlayer)==0){break; //双方都不能落子,游戏结束}cout<<nowPlayerName<<"无子可下.\n";}else{int i,j;board.view(pBoard);if(nowPlayer==player) // 轮到人下{while(1){cout<<nowPlayerName<<",请输入棋子坐标i,j:\n";cout<<"i=";cin>>i;i--;cout<<"j=";cin>>j;j--;pChoice->posX=i;pChoice->posY=j;if(i<0 || i>7 || j<0 || j>7 ||pBoard->cell[i][j].color!=BLANK || pBoard->cell[i][j].stable==0){cout<<nowPlayerName<<"不能在"<<i+1<<","<<j+1<<"落子.\n";board.view(pBoard);}else{break;}}}else //* 轮到电脑下 */{cout<<nowPlayerName<<"思考中......";pChoice=maximin(pBoard,nowPlayer,dif,-MAX,MAX,pChoice);i=pChoice->posX;j=pChoice->posY;cout<<"score="<<pChoice->score<<endl;}board.putChess(pBoard,pChoice,nowPlayer);step++;cout<<nowPlayerName<<"落子于坐标"<<i+1<<","<<j+1;}nowPlayer=(enum Color)-nowPlayer; /* 换对方下 */}board.view(pBoard);success=pBoard->whiteNum - pBoard->blackNum;if(success>0){cout<<"\n白棋(●)获胜.\n";}else if(success<0){cout<<"\n黑棋(○)获胜.\n";}else{cout<<"\n平局.\n";}cout<<"\n游戏结束!\n";while(restart!='y' && restart!='n'){cout<<"再下一盘?(y,n)\n";cin>>restart;if(restart=='y'){goto start;}}}return 0;}4.4 编译与运行结果1、选择“人人对战”或者“人机对战”2、棋局开始3、黑白棋一次落子4、局中5、白棋落子,但黑子无子可下,白棋再落子6、双方均无处落子,棋局结束7、输出对局结果5、总结这个程序主要用来实现黑白棋的人人对战,程序中的人机对战的算法主要参考别的程序,而人人对战则相对简单所以以自己的能力就只实现了其中的人人对战部分,由于没有自学认识问题的和思考解决办法有了本质上的进步,特别是对一个游戏开发的模式有了更深的认识,对专业技能的运用更熟练。
中国象棋嵌入式系统设计实验报告

中国象棋嵌入式系统设计实验报告
机器人技术是当前非常活跃的前沿技术,在强化产业竞争力方面,它与信息技术一样,是极为重要的战略技术领域。
目前,世界各国尤其是美、欧、日等发达国家对机器人技术高度重视。
随着嵌入式系统的越来越广泛的应用,智能机器人视觉系统有了新的发展方向。
本文将嵌入式系统与机器视觉结合起来,探讨了基于嵌入式系统的机器视觉系统,系统地研究应用图像处理各种方法,对从图像采集模块到模式识别模块进行软件方面的设计。
本文重点讨论了智能象棋机器人的视觉图像采集系统及对象棋棋子汉字的识别方法。
本文主要工作包括:首先确立开发平台。
由于DSP在结构和实时运行处理速度方面的独特技术优势,本文采用北京合众达电子技术有限责任公司提供的SEED—VPM642实验箱,在此开发平台上搭建图像采集系统,从而获得棋盘原始图像。
在得到棋盘图像的基础上,对采集到的图像进行了灰度化、平滑、滤波、锐化、二值化等图像预处理,并进行边缘化检测,提取边缘信息。
为进一步检测和识别预处理后的图像,本文分析了汉字识别方法,针对象棋汉字“将、象、士、车、马、炮、卒、帅、相、兵”的特点,对BP神经网络进行深入分析,提出采用BP 神经网络分类器识别象棋汉字的方法,提高了象棋棋子识别的正确率,取得了较好的效果。
本文建立的基于SEED—VPM642开发平台的图像采集系统,进行的图像采集以及图像预处理、棋盘检测方法,棋子
汉字识别方法的研究,对智能象棋机器人的视觉系统具有重要意义,为进一步开发研制智能象棋机器人,奠定了良好的基础。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
嵌入式系统课程设计报告——黑白棋程序设计学院计算机专业计算机教师学生学号2013年x月xx 日1 设计目的利用VS2005编程实现基于WINCE的8*8大小的黑白棋程序设计。
在WINCE端运行2、开发环境软件:Visual Studio 2005Vc++6.03、设计任务及要求黑白棋棋盘大小为8*8,实现人人对战即可。
设计要求:利用二维数组标记棋盘,下子后判断横向、纵向或对角有无相同颜色棋子,若有则该线段中所有棋子置为该颜色。
棋盘所有棋子填满后游戏结束。
棋子数多者胜4、实现过程1、设计初始化棋盘函数2、复制棋盘函数3、显示棋盘函数4、选择下棋类型4、计算可落子的位置个数,及该位置落子后翻过的棋子的个数5、设置棋子的稳定性(计算得分的依据),空白处除外6、评价棋手得分4.1 硬件WINDOWS操作平台利用VC++实现黑白棋游戏设计Microsoft Visual Studio 20054.2驱动程序设计WinCE界面4.3用户应用程序设计#include <iostream>using namespace std;int const MAX=10000;enum Color{WHITE=-1,BLANK,BLACK //是否能落子 //黑子};主函数int main(void) /////////////主函数{Chessboard board;Chessboard *pBoard=&board;enum Color player=BLANK,nowPlayer=BLACK;//声明两个enum枚举变量player,nowplayerChoice choice;Choice *pChoice=&choice;int dif=-1,step=4,success=0;char restart=' ';start: ///////////////////////////////////////////// player=BLANK; ///////////////////////////////////////////// nowPlayer=BLACK;dif=-1;step=4;restart=' ';int b;cout<<"输入1为人人对战,否则为人机对战:";cin>>b;if(b==1){ /////////人人对战////////////while(player!=WHITE && player!=BLACK){cout<<"\n请选择执黑棋(○)(1),或执白棋(●)(-1)\t执黑棋先下:\n";scanf("%d",&player);/////////////////////////////////////////////////////// //////if(player!=WHITE && player!=BLACK){cout<<"黑白设置错误.\n";}}board.initChessboard(pBoard); /////////初始化棋盘///////////while(step<64) /* 棋盘上未下满64子 */{char *nowPlayerName="";if(nowPlayer==BLACK){nowPlayerName="黑棋(○)";}else if(nowPlayer==WHITE){nowPlayerName="白棋(●)";}if(board.judge(pBoard,nowPlayer)==0){if(board.judge(pBoard,(enum Color)-nowPlayer)==0){break; /* 双方都不能落子,游戏结束 */}cout<<nowPlayerName<<"\n无子可下.\n";}else{int i,j;board.view(pBoard);if(nowPlayer==player) /* 轮到人下 */{while(1){cout<<nowPlayerName<<"请输入棋子坐标(i,j):\n";cout<<"i=";cin>>i;i--;cout<<"j=";cin>>j;j--;pChoice->posX=i;pChoice->posY=j;if(i<0 || i>7 || j<0 || j>7 || pBoard->cell[i][j].color!=BLANK || pBoard->cell[i][j].stable==0){cout<<nowPlayerName<<"不能在"<<i+1<<","<<j+1<<"落子.";board.view(pBoard);}else{break;}}}else //另外一个人下{while(1){cout<<nowPlayerName<<"请输入棋子坐标(i,j):\n";cout<<"i=";cin>>i;i--;cout<<"j=";cin>>j;j--;pChoice->posX=i;pChoice->posY=j;if(i<0 || i>7 || j<0 || j>7 || pBoard->cell[i][j].color!=BLANK || pBoard->cell[i][j].stable==0){cout<<nowPlayerName<<"不能在"<<i+1<<","<<j+1<<"落子.";board.view(pBoard);}else{break;}}}board.putChess(pBoard,pChoice,nowPlayer);step++;cout<<nowPlayerName<<"落子于坐标"<<i+1<<","<<j+1;}nowPlayer=(enum Color)-nowPlayer; /* 换对方下 */}board.view(pBoard);success=pBoard->whiteNum - pBoard->blackNum;if(success>0){cout<<"\n白棋(●)获胜.\n";}else if(success<0){cout<<"\n黑棋(○)获胜.\n";}else{cout<<"\n平局.\n";}cout<<"\n游戏结束!\n";while(restart!='y' && restart!='n'){cout<<"再下一盘?(y,n)\n";cin>>restart;///////////////////////////////////////////////if(restart=='y'){goto start;}}}else{ ////////////人机对战/////////////while(dif<1 || dif>60) //设置难度{cout<<"请选择难度(1~60):\n";cin>>dif;if(dif<1 || dif>60){cout<<"难度设置错误.\n";}}while(player!=WHITE && player!=BLACK){cout<<"请选择执黑棋(○)(1),或执白棋(●)(-1)"<<endl;cout<<"执黑先行:";scanf("%d",&player);if(player!=WHITE && player!=BLACK){cout<<"黑白设置错误.\n";}}board.initChessboard(pBoard); /////////////////初始化棋盘while(step<64) // 棋盘上未下满64子{char *nowPlayerName="";if(nowPlayer==BLACK){nowPlayerName="黑棋(○)";}else if(nowPlayer==WHITE){nowPlayerName="白棋(●)";}if(board.judge(pBoard,nowPlayer)==0){if(board.judge(pBoard,(enum Color)-nowPlayer)==0){break; //双方都不能落子,游戏结束}cout<<nowPlayerName<<"无子可下.\n";}else{int i,j;board.view(pBoard);if(nowPlayer==player) // 轮到人下{while(1){cout<<nowPlayerName<<",请输入棋子坐标i,j:\n";cout<<"i=";cin>>i;i--;cout<<"j=";cin>>j;j--;pChoice->posX=i;pChoice->posY=j;if(i<0 || i>7 || j<0 || j>7 ||pBoard->cell[i][j].color!=BLANK || pBoard->cell[i][j].stable==0){cout<<nowPlayerName<<"不能在"<<i+1<<","<<j+1<<"落子.\n";board.view(pBoard);}else{break;}}}else //* 轮到电脑下 */{cout<<nowPlayerName<<"思考中......";pChoice=maximin(pBoard,nowPlayer,dif,-MAX,MAX,pChoice);i=pChoice->posX;j=pChoice->posY;cout<<"score="<<pChoice->score<<endl;}board.putChess(pBoard,pChoice,nowPlayer);step++;cout<<nowPlayerName<<"落子于坐标"<<i+1<<","<<j+1;}nowPlayer=(enum Color)-nowPlayer; /* 换对方下 */}board.view(pBoard);success=pBoard->whiteNum - pBoard->blackNum;if(success>0){cout<<"\n白棋(●)获胜.\n";}else if(success<0){cout<<"\n黑棋(○)获胜.\n";}else{cout<<"\n平局.\n";}cout<<"\n游戏结束!\n";while(restart!='y' && restart!='n'){cout<<"再下一盘?(y,n)\n";cin>>restart;if(restart=='y'){goto start;}}}return 0;}4.4 编译与运行结果1、选择“人人对战”或者“人机对战”2、棋局开始3、黑白棋一次落子4、局中5、白棋落子,但黑子无子可下,白棋再落子6、双方均无处落子,棋局结束7、输出对局结果5、总结这个程序主要用来实现黑白棋的人人对战,程序中的人机对战的算法主要参考别的程序,而人人对战则相对简单所以以自己的能力就只实现了其中的人人对战部分,由于没有自学认识问题的和思考解决办法有了本质上的进步,特别是对一个游戏开发的模式有了更深的认识,对专业技能的运用更熟练。