C++课程设计——五子棋

合集下载

c五子棋课程设计报告

c五子棋课程设计报告

c五子棋课程设计报告一、课程目标知识目标:1. 学生理解五子棋的基本规则,掌握棋盘布局、棋子走法等相关知识。

2. 学生了解五子棋的历史背景,了解我国棋文化的发展。

3. 学生掌握基本的五子棋策略,如防守、进攻、布局等。

技能目标:1. 学生能够熟练进行五子棋对弈,具备一定的竞技水平。

2. 学生能够运用所学策略进行棋局分析,提高解决问题的能力。

3. 学生能够通过五子棋锻炼思维,提高逻辑思维和判断能力。

情感态度价值观目标:1. 学生培养对五子棋的兴趣,激发学习棋类游戏的热情。

2. 学生在五子棋学习过程中,培养团队协作精神,增进同学间的友谊。

3. 学生通过五子棋学习,体会竞技精神,树立正确的竞争观念。

课程性质分析:本课程为兴趣选修课程,结合五子棋的竞技性和趣味性,旨在提高学生的逻辑思维和竞技水平。

学生特点分析:五年级学生具备一定的认知能力和自学能力,对新鲜事物充满好奇,喜欢竞技类游戏。

教学要求:1. 教师应关注学生的个体差异,因材施教,提高学生的学习兴趣。

2. 教师应注重理论与实践相结合,让学生在实践中掌握五子棋技能。

3. 教师应关注学生在学习过程中的情感体验,培养学生的竞技精神和团队协作能力。

二、教学内容1. 五子棋基本知识:- 棋盘与棋子:介绍五子棋的棋盘布局、棋子走法及胜负判定规则。

- 历史背景:讲解五子棋的起源、发展及在我国棋文化中的地位。

2. 五子棋基本策略:- 防守策略:教授学生如何防守对手的进攻,保持棋局平衡。

- 进攻策略:指导学生运用有效进攻手段,制造对手的困境。

- 布局策略:讲解如何合理布局棋子,为后续棋局发展奠定基础。

3. 五子棋实战技巧:- 棋型分析:教授学生识别不同棋型,提高棋局分析能力。

- 残局破解:训练学生解决棋局中出现的复杂局面,提高实战水平。

4. 教学进度安排:- 第一周:五子棋基本知识学习,了解棋盘、棋子及历史背景。

- 第二周:基本策略学习,掌握防守、进攻和布局策略。

- 第三周:实战技巧训练,提高棋局分析和实战能力。

c语言五子棋课程设计报告

c语言五子棋课程设计报告

c语言五子棋课程设计报告一、前言五子棋作为一种智力游戏,在我国有着悠久的历史和广泛的群众基础。

本次设计的目的是使用C语言实现五子棋游戏,通过此次课程设计,学生将掌握C语言的编程思想和开发方法,同时了解五子棋游戏的规则和策略。

二、五子棋游戏规则五子棋游戏是在15*15的棋盘上进行,由黑白双方轮流落子,先将五个同色棋子连成一条线的一方获胜。

落子的位置必须为空,不能与已有的棋子重叠。

黑方先手,白方后手。

下图为五子棋棋盘示意图。

三、五子棋游戏实现本次课程设计采用C语言实现五子棋游戏,主要包括棋盘的绘制、落子的判断和胜负的判断等功能。

1.棋盘的绘制棋盘的绘制采用双重循环实现,将15*15的棋盘分成225个小格,其中包括14个横线和14个竖线,以及4个角上的点。

通过循环输出字符实现棋盘的绘制。

2.落子的判断落子的判断主要包括鼠标的点击和棋子的绘制两个部分。

当鼠标点击棋盘上的一个位置时,程序会根据当前轮到哪方落子来绘制相应颜色的棋子,并将该位置的状态改为已有棋子。

同时,程序会检查当前落子是否符合规则,即该位置是否为空,如果不为空则重新等待鼠标点击。

3.胜负的判断胜负的判断主要包括横向、纵向、斜向和反斜向四个方向。

通过判断当前落子位置在这四个方向上的连续棋子数是否达到五个来确定胜负。

如果达到五个,则程序会弹出相应的提示框,显示胜利方。

四、总结通过本次课程设计,学生掌握了C语言的编程思想和开发方法,同时了解了五子棋游戏的规则和策略。

本次设计主要包括棋盘的绘制、落子的判断和胜负的判断等功能。

希望本次课程设计能够增强学生的编程能力和对五子棋游戏的理解。

c语言五子棋课程设计

c语言五子棋课程设计

c语言五子棋课程设计一、课程目标知识目标:1. 学生能理解并掌握C语言的基本语法和编程技巧;2. 学生能运用C语言编写五子棋游戏的基本功能,包括棋盘的初始化、玩家输入、落子、判断胜负等;3. 学生能通过五子棋案例,理解并掌握数组和循环等C语言核心知识点的应用。

技能目标:1. 学生能够运用结构化的编程思想进行问题分析,将复杂问题分解为可解决的小问题;2. 学生能够独立完成五子棋游戏的编写,培养编程实践能力和解决问题的能力;3. 学生通过团队协作完成课程项目,提高沟通和协作能力。

情感态度价值观目标:1. 学生在编程实践中培养逻辑思维能力和创新意识,增强对编程的兴趣和热情;2. 学生通过五子棋游戏的设计与实现,体验编程带来的成就感,提高自信心;3. 学生在团队协作中学会相互尊重、理解和帮助,培养良好的合作精神。

二、教学内容1. C语言基础语法回顾:变量定义与使用、数据类型、运算符、表达式、控制语句(if、for、while等);2. 数组的应用:一维数组、二维数组,重点讲解二维数组在五子棋棋盘中的应用;3. 函数的定义与调用:编写功能模块,如初始化棋盘、打印棋盘、落子、判断胜负等函数;4. 指针的应用:指针与数组的关系,通过指针操作五子棋棋盘;5. 五子棋游戏设计与实现:分析游戏需求,设计游戏流程,编写代码实现游戏功能;6. 结构体的使用:定义玩家信息结构体,存储和管理玩家信息;7. 文件操作:读取和保存棋局,实现游戏进度保存与加载;8. 算法与逻辑:介绍五子棋胜负判断的算法,以及优化策略;9. 项目实践:学生分组进行五子棋游戏的开发,按照教学进度完成相应功能;10. 课堂讨论与展示:分析项目中的问题与解决方法,分享编程技巧,展示团队成果。

教学内容按照课本章节进行组织,确保学生能够将所学知识应用于实际项目中,逐步掌握C语言编程的核心技能。

三、教学方法本课程采用以下多样化的教学方法,旨在激发学生的学习兴趣,提高学生的主动性和实践能力:1. 讲授法:教师以清晰、生动的语言讲解C语言的基本概念、语法规则和五子棋游戏设计原理。

c课程设计五子棋游戏

c课程设计五子棋游戏

c课程设计五子棋游戏一、教学目标本课程的目标是让学生掌握五子棋游戏的基本规则和技巧,能够独立进行游戏,并理解游戏的算法和逻辑。

知识目标包括了解五子棋的历史和背景,掌握游戏的规则和技巧,理解游戏的算法和逻辑。

技能目标包括能够独立进行游戏,能够分析游戏局势,能够制定游戏策略。

情感态度价值观目标包括培养学生的团队合作精神,培养学生的竞技精神,让学生理解胜负的重要性。

二、教学内容本课程的教学内容主要包括五子棋的基本规则和技巧,游戏的算法和逻辑,以及游戏中的团队合作和竞技精神。

具体包括五子棋的历史和背景,游戏的规则和技巧,如何分析游戏局势和制定游戏策略,以及如何在游戏中展现团队合作和竞技精神。

三、教学方法本课程将采用讲授法、讨论法、案例分析法和实验法等多种教学方法。

通过讲授法,让学生掌握五子棋的基本规则和技巧;通过讨论法,让学生深入理解游戏的算法和逻辑;通过案例分析法,让学生学会分析游戏局势和制定游戏策略;通过实验法,让学生在实际游戏中体验团队合作和竞技精神。

四、教学资源本课程的教学资源包括教材、参考书、多媒体资料和实验设备。

教材和参考书将提供五子棋的基本规则和技巧,游戏的算法和逻辑,以及游戏中的团队合作和竞技精神的相关知识。

多媒体资料将提供五子棋游戏的示例和案例,帮助学生更好地理解游戏的相关知识。

实验设备将用于让学生在实际游戏中体验团队合作和竞技精神。

五、教学评估本课程的评估方式包括平时表现、作业和考试。

平时表现主要评估学生的出勤、课堂参与度和团队合作表现。

作业包括练习题和游戏设计项目,评估学生对五子棋规则和技巧的掌握程度,以及游戏的算法和逻辑的应用能力。

考试包括期中和期末考试,评估学生对课程知识的全面理解和应用能力。

评估方式应客观、公正,能够全面反映学生的学习成果。

六、教学安排本课程的教学安排将在每周的一节课进行,共计10节课。

教学进度将按照教学大纲进行,确保在有限的时间内完成教学任务。

教学时间将安排在下午或晚上,考虑学生的作息时间。

c语言课程设计五子棋

c语言课程设计五子棋

c语言课程设计五子棋一、教学目标本课程的教学目标是使学生掌握C语言编程基础,能够运用C语言设计并实现一个简单的五子棋游戏。

通过本课程的学习,学生将能够理解C语言的基本语法、数据类型、运算符、控制结构等基础知识,并能够运用这些知识解决实际问题。

同时,通过设计五子棋游戏的过程,培养学生的编程思维、逻辑思维和团队合作能力。

具体的学习目标包括:1.知识目标:–掌握C语言的基本语法和编程规范。

–理解数据类型、变量、运算符和控制结构的概念及使用方法。

–学会使用函数进行模块化编程。

–了解五子棋游戏的规则和算法。

2.技能目标:–能够使用C语言编写简单的程序,解决实际问题。

–能够运用循环、条件语句等控制结构编写复杂的程序。

–能够使用函数进行模块化编程,提高代码的可读性和可维护性。

–能够设计并实现一个简单的五子棋游戏,掌握游戏算法和逻辑。

3.情感态度价值观目标:–培养学生的编程兴趣,激发学习编程的积极性。

–培养学生的团队合作意识,学会与他人共同解决问题。

–培养学生的创新思维,勇于尝试和解决问题。

二、教学内容本课程的教学内容主要包括C语言的基本语法、数据类型、运算符、控制结构等基础知识,以及五子棋游戏的规则和算法。

具体的教学大纲如下:1.C语言基本语法和编程规范。

2.数据类型、变量和运算符的概念及使用方法。

3.控制结构(循环、条件语句)的使用和编程实践。

4.函数的定义和调用,模块化编程的优点和实践。

5.五子棋游戏的规则和算法分析。

6.五子棋游戏的界面设计和实现。

7.五子棋游戏的逻辑设计和实现。

三、教学方法本课程的教学方法包括讲授法、案例分析法、实验法和讨论法。

1.讲授法:通过讲解C语言的基本语法、数据类型、运算符、控制结构等基础知识,使学生掌握基本的编程概念和技巧。

2.案例分析法:通过分析典型的五子棋游戏案例,使学生理解五子棋游戏的规则和算法。

3.实验法:让学生通过编写代码和调试程序,实践C语言的基本语法和编程技巧,培养学生的动手能力。

c课程设计五子棋游戏

c课程设计五子棋游戏

c课程设计五子棋游戏一、课程目标知识目标:1. 让学生掌握五子棋的基本规则和棋谱,理解其蕴含的数学原理;2. 培养学生对博弈论的基本认识,了解五子棋游戏中的策略与决策;3. 引导学生运用计算机编程实现五子棋游戏,掌握相关算法和编程技巧。

技能目标:1. 培养学生运用逻辑思维和分析问题的能力,提高解决问题的策略选择和决策能力;2. 培养学生的团队协作能力,学会与他人共同分析问题、探讨解决方案;3. 提高学生的计算机编程能力,能够独立完成五子棋游戏的简单设计与实现。

情感态度价值观目标:1. 培养学生对五子棋游戏的兴趣,激发他们学习数学和计算机编程的热情;2. 培养学生勇于面对挑战、克服困难的精神,增强自信心;3. 培养学生遵守游戏规则,树立公平竞争的意识,培养良好的竞技道德。

课程性质:本课程以五子棋游戏为载体,结合数学和计算机编程知识,培养学生的逻辑思维、分析问题和团队协作能力。

学生特点:考虑到学生所在年级,他们对基本数学原理和计算机编程有一定了解,具备一定的独立思考和解决问题的能力。

教学要求:在教学过程中,注重理论与实践相结合,充分调动学生的积极性,引导他们通过自主探究和合作学习,达到课程目标。

同时,注重对学生的个性化指导,提高他们的学习效果。

通过本课程的学习,使学生能够将所学知识应用于实际生活,培养他们的创新意识和实践能力。

二、教学内容1. 五子棋基本规则与棋谱:包括棋盘布局、棋子走法、胜利条件等,结合数学原理分析棋局变化。

- 教材章节:第二章 简单博弈论2. 博弈论基本概念:介绍博弈论的基本要素,如参与者、策略、支付函数等,探讨五子棋游戏中的策略选择。

- 教材章节:第三章 博弈论基础3. 计算机编程实现五子棋游戏:学习运用编程语言(如Python)实现五子棋游戏,包括界面设计、算法实现等。

- 教材章节:第四章 计算机编程与算法4. 五子棋算法分析:讲解常用的五子棋算法,如极大极小值搜索、α-β剪枝等,提高游戏AI的智能程度。

c语言课程设计案例-五子棋.

c语言课程设计案例-五子棋.

菜单窗口和菜单项的生成
生成背景图象,在指定位置显示菜单项文字
光条的生成
光条的产生及光条在光标键的控制下而移动(保存与再现)
键识别
当按下菜单上的选项(如:功能键或光标移动键)时,根据键值 转入相应的功能处理
菜单的连接 功能执行
小程序可以嵌入在菜单中,大程序做成功能模块,根据键码直接 调用
文本模式:显示缓冲区中存放显示字符的代码 (ASCII码或汉字机内码),及字符的属性,显示屏 幕按字符分成若干行、列,如80列25行 图形模式:显示缓冲区中存放显示屏幕上每点(象 素)的颜色或灰度值,显示屏幕按象素分成若干行、 列,如640480
一般开机后的模式都是80 ×25的文本模式
§2 Turbo C绘图
#include <graphics.h> main() 将指定模式的驱动程序 (*.GBI) { int driver=VGA; 从当前路径下调入内存 int mode=VGAHI; initgraph(&driver,&mode, “”); ………. 关闭图形系统回到文本模式 closegraph(); } initgraph(&driver,&mode, “d:\\tc\\bgi”); #include <graphics.h> main() { int driver=DETECT,mode; initgraph(&driver,&mode, “”); ………. closegraph(); }
使用图形方式时先进行图形系统初始化, 检测或设置指定的图形模式
图形系统的初始化

图形系统初始化函数
void initgraph(int *driver,int *mode,char *pathtodriver) 其中; driver——显示适配器驱动程序的枚举变量 mode——图形模式(模式号或模式标识符) pathtodriver——适配器驱动程序的寻找路径,“” 表示在当前目录下(*.BGI) enum graphics_driver{DETECT,CGA,MCGA,EGA,EGA64,…… …,VGA,PC3270}; DETECT——自动检测所用显示适配器的类型,将相应 的驱动程序装入,并将其最高显示模式作为当前显示模 式

C语言五子棋游戏程序课程设计

C语言五子棋游戏程序课程设计

C语言五子棋游戏程序课程设计C++五子棋游戏程序设计一、课设内容1. 掌握C++基本编程风格。

2. 编写程序代码,实现各个模块的功能。

3. 完成小型游戏应用系统的设计开发.4. 关键语句写注释。

5. 测试程序,写出测试报告。

6. 在实验报告写出综合设计心得。

二、实验内容在此次大作业中,我学习设计一个五子棋游戏的程序,源代码及分析如下:#include#includevoid shuchu(char a[15][15]){int x,y,i;cout<<" ";for(i=0;i<15;i++)cout<<setw(3)<<i;< p="">cout<<endl;< p="">for(x=0;x<15;x++){cout<<setw(2)<<x;< p="">for(y=0;y<15;y++)cout<<setw(3)<<a[x][y];< p="">cout<<endl;< p="">}}bool osheng(char a[15][15]){int x,y;for(x=0;x<15;x++)for(y=0;y<11;y++)if(a[x][y]=='o'&&a[x][y+1]=='o'&&a[x][y+2]=='o'&&a[x][y+ 3]=='o'&&a[x][y+4]=='o') return 1;for(x=0;x<11;x++)for(y=0;y<15;y++)if(a[x][y]=='o'&&a[x+1][y]=='o'&&a[x+2][y]=='o'&&a[x+3][ y]=='o'&&a[x+4][y]=='o') return 1;for(x=0;x<11;x++)for(y=0;y<11;y++)if(a[x][y]=='o'&&a[x+1][y+1]=='o'&&a[x+2][y+2]=='o'&&a [x+3][y+3]=='o'&&a[x+4][y+4]=='o' )return 1;for(x=15;x>4;x--)return 0;}bool xsheng(char a[15][15]){int x,y;for(x=0;x<15;x++)for(y=0;y<11;y++)if(a[x][y]=='x'&&a[x][y+1]=='x'&&a[x][y+2]=='x'&&a[x][y+ 3]=='x'&&a[x][y+4]=='x') return 1;for(x=0;x<11;x++)for(y=0;y<15;y++)if(a[x][y]=='x'&&a[x+1][y]=='x'&&a[x+2][y]=='x'&&a[x+3][ y]=='x'&&a[x+4][y]=='x') return 1;for(x=0;x<11;x++)for(y=0;y<11;y++)if(a[x][y]=='x'&&a[x+1][y+1]=='x'&&a[x+2][y+2]=='x'&&a[ x+3][y+3]=='x'&&a[x+4][y+4]=='x' )return 1;for(x=15;x>4;x--)for(y=15;y>4;y--)if(a[x][y]=='x'&&a[x+1][y-1]=='x'&&a[x+2][y-2]=='x'&&a[x+3][y-3]=='x'&&a[x-4][y+4]=='x') return 1;return 0;}bool he(char a[15][15]){int x,y;for(x=0;x<15;x++)for(y=0;y<15;y++)if(a[x][y]=='-')return 0;return 1;}void main(){int x,y,s,q;char a[15][15];for(x=0;x<15;x++)for(y=0;y<15;y++)cin>>q;if(q==1)goto two;/* elsegoto one; */two:cout<<"请选择是否进入悔棋模式:1.是;2.否\n";cin>>q;if(q==2)goto three;shuchu(a);while(1){s: while(1){cout<<"请玩家1输入下子的坐标"<<endl;< p="">cin>>x>>y;if(a[x][y]=='o'||a[x][y]=='x')cout<<"此处已经有字,请重下"<<endl;< p="">else{a[x][y]='o';break;}}shuchu(a);cout<<"是否需要悔棋?是请输入:1;否请输入:0"<<endl;< p=""> cin>>s;switch(s){case 1:a[x][y]='-';goto s;break;case 0:break;}s1: if(osheng(a)){cout<<"玩家1胜";break;}s2: while(1){cout<<"请玩家2输入下子的坐标"<<endl;< p="">cin>>x>>y;if(a[x][y]=='o'||a[x][y]=='x')cout<<"此处已经有字,请重下"<<endl;< p="">else{a[x][y]='x';break;}}shuchu(a);cout<<"是否需要悔棋?是请输入:1;否请输入:0"<<endl;< p=""> cin>>s;switch(s){case 1:a[x][y]='-';goto s2;break;case 0:break;}s3: if(xsheng(a)){cout<<"玩家2胜";if(he(a)){cout<<"平局";break;}}three: shuchu(a);while(1){while(1){cout<<"请玩家1输入下子的坐标"<<endl;< p=""> cin>>x>>y;if(a[x][y]=='o'||a[x][y]=='x')cout<<"此处已经有字,请重下"<<endl;< p=""> else{a[x][y]='o';break;}}shuchu(a);if(osheng(a)){cout<<"玩家1胜"; break;}}shuchu(a);if(xsheng(a)){cout<<"玩家2胜"; break;}if(he(a)){cout<<"平局"; break;}}}三、感想体会本实验是用C++来设计完成了五子棋游戏。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《面向对象程序设计课程设计》————五子棋学号:201201051738学院:信息科学与工程学院班级:网络工程2班指导老师:学生姓名:日期:2013 年06 月24 日C++课程设计——五子棋一、功能描述设计一个五子棋游戏,实现双人对战,通过鼠标进行操作,具有悔棋功能,可以多次进行游戏,界面美观,有音效。

重要的是按键进行弹窗提醒,由用户进行确认。

二、概要设计窗口注册:向系统注册窗口。

建立窗口:初始化并建立窗口。

处理消息:等待消息传入,调用处理函数。

POINT_类:记录一个点及其处理函数,包括点的位置规范化函数。

Chess类:记录棋子相关信息及其处理函数,包括落子,起子函数。

GameGolbal类:记录一个五子棋游戏的整体信息及其处理函数,包括定义了POINT_类,Chess类的成员,及一些游戏中会用到的整体变量。

主要函数包括如下:窗口刷新函数:通过储存的数据重新绘制窗口。

新游戏函数:对游戏的变量进行初始化的处理。

悔棋函数:对储存数据修改,达到悔棋的目的,会调用窗口刷新函数。

声音播放函数:播放效果声音。

结果判断函数:每次落子后判断结果。

结果显示函数:绘制游戏胜利的结果。

程序运行流程及函数调用关系如下:建立窗口绘制棋子注册窗口悔棋ID_BACK标准化并记录坐标窗口刷新判断并累加操作的棋子判断是否棋子覆盖修改数据调用声音函数关于IDM_ABOUT退出IDM_EXIT鼠标左单击 WM_LBUTTODOWN新的一局 ID_NEW数据初始化窗口菜单命令WM_COMMAND判断胜负判断胜负显示结果等待信息三、详细设计窗口注册:声明窗口结构与类别,对窗口的信息进行描述建立窗口:通过窗口的描述,初始化窗口,显示窗口。

处理消息:等待消息传入,调用处理函数处理信息。

POINT_类:储存棋子在棋盘上的位置,其中的void STAND(int X,int Y)函数负责将输入的点规范为棋盘格上对应位置。

Chess类:棋子类储存棋子信息,包括棋子颜色,阴线阳线上的棋子个数,同时其中包含落子函数,起子函数来对相应的数据进行操作。

落子函数除了对数据进行记录之外,还负责棋子的绘制,绘制棋子时,主要是加载棋子贴图,由于为了使棋子落在边缘时不会遮挡棋盘边缘的纹理,所以对贴图边缘要进行透明化处理,应用的是简单的图形运算,通过异或处理,使图片与背景贴合。

最后悔棋函数用棋子类建立一个二维矩阵,其横纵坐标与棋盘上的位置对应。

GameGolbal类:记录一个五子棋游戏的整体信息及其处理函数,包括定义了POINT_类,Chess类的成员,及一些游戏中会用到的整体变量。

主要函数包括如下:窗口刷新函数:通过储存的数据绘制窗口,屏幕刷新时调用,或者主动调用,比如开始新的一局,悔棋时。

新游戏函数:对游戏的变量进行初始化的处理,之后调用窗口刷新函数。

悔棋函数:对储存数据修改,将棋盘矩阵的相应纵坐标减一,同时调用棋子类二维数组中对应的元素起子函数。

之后调用窗口刷新函数,棋子会在棋盘上消失。

声音播放函数:主要是产生落子声音和胜利的声音,播放声音函数将完成建立DirectSound对象,创建缓存区,设置文件格式,读取文件,播放声音,清空缓存区等一系列操作,完成声音的播放。

结果判断函数:每次落子后调用,通过判断相邻的阴线,阳线上是否存在5 个连续的同色棋子,判断是否一方已胜利,若存在胜利的一方,返回的结果是胜利的一方的整形数据代号,否则返回的是无关整形数据。

结果显示函数:绘制游戏胜利的结果,加载贴图。

弹窗:弹窗的目的主要是对让用户先前做出的行为进行确认,通过调用系统的int MessageBox(HWND hWnd,LPCTSTRlpText,LPCTSTRlpCaption,UINT uType)函数,弹出一个窗口,由用户对输入消息确认,通过返回值获取用户结果,进行相应的操作。

四、效果及存在问题效果图如下:进入后界面落子效果悔棋后结果显示选项菜单帮助菜单弹窗提示关于窗口不足之处1、不能进行存档,学习文件流之后可以进一步改进。

2、不能进行人机对战,这属于策略型游戏AI,我本身对五子棋不是很擅长,确实有一定难度,这方面有时间可以参考相关资料的算法进行改进。

3、弹出的窗口比较简单,只是调用了MessageBox命令,而已,对API窗口的建立和调用以及其他资源文件的加载还是不够了解。

4、因为本程序不需要改变窗口大小,游戏全屏后部分地方为白色,改变之后反而有可能会影响美观,因此可以去掉最大化窗口和改变窗口大小的功能,但我对窗口的建立不是很熟悉,因此暂时还没有去掉。

五、心得体会通过对这个五子棋程序的编写,我在一定的程度上对VC的API可视化编程有了一定的了解,对Windows下程序运行流程有了简单的认识,修正了一些以前对程序运行的错误观念。

在编程的过程中,我认识到编程前对程序整体结构的分析,对各个部分的联系的把握的重要性,否则在编程中就会产生混乱,耽误时间。

同时,编程一定要仔细,在关键的地方或者有疑惑的地方写下备注,以备以后查看或者修改,一个小小的错误就要花上大量的时间去寻找,这是很不值得的。

虽然这个程序对类的应用不是很多,但是仍然可以看到类的应用使程序的编写更加的方便,增加了程序的可移植性。

同时系统自定义的一些类的熟练运用无疑会极大地提高编程速度。

六、附录窗口的注册,初始化,以及消息获取与循环函数有系统自动生成,在此不再显示。

POINT_类:class POINT_{public:int x,y;public:POINT_(){x=0;y=0;}POINT_(int x_,int y_){x=x_;y=y_;}~POINT_ (){}void STAND(int X,int Y){int dis=36,x_=17,y_=18;x=X+(dis+3)/2-x_;y=Y+dis/2-y_;x=x/(dis+3)*(dis+3)+x_;y=y/dis*dis+y_;}};Chess类:class Chess{private:int NS,WE,WN,EN,color;friend class GameGlobal;public:Chess(){NS=0;WE=0;WN=0;EN=0;color=2;}~Chess (){}void down( int c ,HWND hWnd,POINT_ p){HDC hdc,mdc;HBITMAP dra;int X=p.x,Y=p.y;NS=1;WE=1;WN=1;EN=1;color=c;hdc = GetDC(hWnd);mdc = CreateCompatibleDC (hdc);if(c == 0) //黑子{dra = (HBITMAP) LoadImage (NULL,"drabchess.bmp",IMAGE_BITMAP,72,36,LR_LOADFROMFILE) ;}else //白子{dra = (HBITMAP) LoadImage (NULL,"drawchess.bmp",IMAGE_BITMAP,72,36,LR_LOADFROMFILE) ;}SelectObject (mdc,dra);BitBlt (hdc,X-18,Y-18,36,36,mdc,36,0,SRCAND);BitBlt (hdc,X-18,Y-18,36,36,mdc,0,0,SRCPAINT);ReleaseDC (hWnd,hdc);}void up (){NS=0;WE=0;WN=0;EN=0;color=2;}int showcolor (){return color;}};GameGlobal类:class GameGlobal{private:HWND hWnd;HDC mdc,hdc;int color;//颜色int winer;int ax_i,ax_j; //二维矩阵参数HBITMAP hbmp,dra;POINT_ circle[2][16*16/2];Chess chess[16][16]; //棋子类,储存棋子周围信息及其颜色public:GameGlobal(){color=0;ax_i=0;ax_j=0;winer = 2;}GameGlobal(HWND h) {hWnd = h;}~GameGlobal(){}void getHWND(HWND h){hWnd = h;}int getwiner(){return winer;}void changewiner(int w){winer = w;}void back();int downchess(int L,int H);BOOL Result(int x,int y);void ShowResult (int winer);void MyPaint ();void newgame();void PlaySound (int song);};//结果判断函数int GameGlobal::Result(int x,int y){int c,n=15;c=chess[x][y].showcolor();int re;for (re=1;x-re>=0;re++)////////////////////判断横向{if (chess[x-re][y].WE==0||chess[x-re][y].color!=c)break;elsechess[x][y].WE++;}for (re=1;x+re<n;re++){if (chess[x+re][y].WE==0||chess[x+re][y].color!=c)break;elsechess[x][y].WE++;}for (re=1;y-re>=0;re++)////////////////////判断纵向{if (chess[x][y-re].NS==0||chess[x][y-re].color!=c)break;elsechess[x][y].NS++;}for (re=1;y+re<n;re++){if (chess[x][y+re].NS==0||chess[x][y+re].color!=c)break;elsechess[x][y].NS++;}for (re=1;x-re>=0&&y-re>=0;re++)////////////////////判断西北{if (chess[x-re][y-re].WN==0||chess[x-re][y-re].color!=c)break;elsechess[x][y].WN++;}for (re=1;x+re<n&&y+re<n;re++){if (chess[x+re][y+re].WN==0||chess[x+re][y+re].color!=c)break;elsechess[x][y].WN++;}for (re=1;x-re>=0&&y+re<n;re++)////////////////////判断东北{if (chess[x-re][y+re].EN==0||chess[x-re][y+re].color!=c)break;elsechess[x][y].EN++;}for (re=1;x+re<n,y-re>=0;re++){if (chess[x+re][y-re].EN==0||chess[x+re][y-re].color!=c)break;elsechess[x][y].EN++;}if (chess[x][y].NS>4||chess[x][y].WE>4||chess[x][y].WN>4||chess[x][y].EN>4)return c;elsereturn 2;}//窗口刷新函数void GameGlobal::MyPaint (){hdc = GetDC (hWnd);mdc = CreateCompatibleDC (hdc);if (winer != 2){if (winer==1)hbmp=(HBITMAP)LoadImage(NULL,"whbmp.bmp",IMAGE_BITMAP,600,550,LR_LOADFROMFILE) ;elsehbmp=(HBITMAP)LoadImage(NULL,"bhbmp.bmp",IMAGE_BITMAP,600,550,LR_LOADFROMFILE) ;SelectObject (mdc,hbmp);BitBlt (hdc,0,0,600,550,mdc,0,0,SRCCOPY);ReleaseDC (hWnd,hdc);}else{int i;hbmp=(HBITMAP)LoadImage(NULL,"hbmp.bmp",IMAGE_BITMAP,585,543,LR_LOADFROMFILE) ;SelectObject (mdc,hbmp);BitBlt (hdc,0,0,600,600,mdc,0,0,SRCCOPY);dra=(HBITMAP)LoadImage(NULL,"drawchess.bmp",IMAGE_BITMAP,72,36,LR_LOADFROMFILE) ;SelectObject (mdc,dra);for (i=0;i<ax_i;i++){BitBlt (hdc,circle[1][i].x-18,circle[1][i].y-18,36,36,mdc,36,0,SRCAND);BitBlt (hdc,circle[1][i].x-18,circle[1][i].y-18,36,36,mdc,0,0,SRCPAINT);}dra=(HBITMAP)LoadImage(NULL,"drabchess.bmp",IMAGE_BITMAP,72,36,LR_LOADFROMFILE) ;SelectObject (mdc,dra);for (i=0;i<ax_j;i++){BitBlt (hdc,circle[0][i].x-18,circle[0][i].y-18,36,36,mdc,36,0,SRCAND);BitBlt (hdc,circle[0][i].x-18,circle[0][i].y-18,36,36,mdc,0,0,SRCPAINT);}ReleaseDC (hWnd,hdc);}}//结果显示函数void GameGlobal::ShowResult (int winer){hdc = GetDC(hWnd);mdc = CreateCompatibleDC (hdc);if (winer==1)hbmp=(HBITMAP)LoadImage(NULL,"whbmp.bmp",IMAGE_BITMAP,600,550,LR_LOADFROMFILE) ;elsehbmp=(HBITMAP)LoadImage(NULL,"bhbmp.bmp",IMAGE_BITMAP,600,550,LR_LOADFROMFILE) ;SelectObject (mdc,hbmp);BitBlt (hdc,0,0,600,550,mdc,0,0,SRCCOPY);ReleaseDC (hWnd,hdc);}//重新开始函数void GameGlobal::newgame (){for (int i=0;i<16;i++)for (int j=0;j<16;j++)chess[i][j].up();color = 0;winer = 2;ax_i=0;ax_j=0;}int GameGlobal::downchess(int L,int H){int ax_,x,y,dis=36,pd;POINT_ O(17,18);if (color == 1){ax_ = ax_i;ax_i++;}else{ax_ = ax_j;ax_j++;}circle[color][ax_].STAND(L,H);x = (circle[color][ax_].x-O.x)/(dis+3); //对应的棋子类二维数组的中成员y = (circle[color][ax_].y-O.y)/dis;if (chess[x][y].showcolor()==2) //避免重复落子{chess[x][y].down (color,hWnd,circle[color][ax_]);PlaySound (1);color=color==1?0:1;}pd=Game.Result (x,y);return pd;}//悔棋函数void GameGlobal::back(){POINT_ O(17,18);int dis = 36,x,y;if (color == 0){if (ax_i > 0){color = 1;ax_i = ax_i - 1;x = (circle [color][ax_i].x-O.x)/(dis+3); //对应的棋子类二维数组的中成员y = (circle [color][ax_i].y-O.y)/dis;}}else{if (ax_j > 0){color = 0;ax_j = ax_j - 1;x = (circle [color][ax_j].x-O.x)/(dis+3); //对应的棋子类二维数组的中成员y = (circle [color][ax_j].y-O.y)/dis;}}chess[x][y].up();Game.MyPaint ();}//播放声音void GameGlobal::PlaySound (int song){LPDIRECTSOUND pDS;HRESULT result;LPDIRECTSOUNDBUFFER pPBuf;DSBUFFERDESC dsdesc;WAVEFORMATEX pwfmt;WAVEFORMATEX swfmt;MMCKINFO ckRiff;MMCKINFO ckInfo;MMRESULT mmresult;HMMIO hmmio;DWORD size;LPDIRECTSOUNDBUFFER pSBuf;LPVOID pAudio;DWORD bytesAudio;result = DirectSoundCreate( NULL, &pDS, NULL ); //建立DirectSoundif(result != DS_OK)MessageBox(NULL,"","建立DirectSound 对象失败!",MB_OK);result = pDS->SetCooperativeLevel( hWnd, DSSCL_PRIORITY );if(result != DS_OK)MessageBox(NULL,"","设定协调层级失败!",MB_OK);memset( &dsdesc,0, sizeof(dsdesc) );dsdesc.dwSize = sizeof(dsdesc);dsdesc.dwFlags = DSBCAPS_PRIMARYBUFFER;dsdesc.dwBufferBytes = 0;dsdesc.lpwfxFormat = NULL;result = pDS->CreateSoundBuffer( &dsdesc, &pPBuf, NULL );if(result != DS_OK)MessageBox(NULL,"","建立主缓存区失败!",MB_OK);memset( &pwfmt,0, sizeof(pwfmt) );pwfmt.wFormatTag = WAVE_FORMAT_PCM;pwfmt.nChannels = 2;pwfmt.nSamplesPerSec = 44100;pwfmt.wBitsPerSample = 16; //位元pwfmt.nBlockAlign = pwfmt.wBitsPerSample / 8 * pwfmt.nChannels; pwfmt.nAvgBytesPerSec = pwfmt.nSamplesPerSec * pwfmt.nBlockAlign; result = pPBuf->SetFormat(&pwfmt); //设定播放格式if(result != DS_OK)MessageBox(NULL,"","设定播放格式失败!",MB_OK);if (song == 1)hmmio = mmioOpen("1.wav", NULL, MMIO_ALLOCBUF|MMIO_READ );//文件名称elsehmmio = mmioOpen("2.wav", NULL, MMIO_ALLOCBUF|MMIO_READ ); //开启文件if(hmmio == NULL) //判断是否为空MessageBox(NULL,"","档案不存在!",MB_OK);ckRiff.fccType = mmioFOURCC('W', 'A', 'V', 'E');//设定档案类型mmresult = mmioDescend(hmmio,&ckRiff,NULL,MMIO_FINDRIFF);//if(mmresult != MMSYSERR_NOERROR)MessageBox(NULL,"","档案格式错误!",MB_OK);ckInfo.ckid = mmioFOURCC('f','m','t',' ');mmresult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);//if(mmresult != MMSYSERR_NOERROR)MessageBox(NULL,"","档案格式错误!",MB_OK);if(mmioRead(hmmio,(HPSTR)&swfmt,sizeof(swfmt)) == -1) //读取档案格式MessageBox(NULL,"","读取格式失败!",MB_OK);mmresult = mmioAscend(hmmio,&ckInfo,0);ckInfo.ckid = mmioFOURCC('d','a','t','a');mmresult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);//if(mmresult != MMSYSERR_NOERROR)MessageBox(NULL,"","档案格式错误!",MB_OK);size = ckInfo.cksize; //取得资料大小memset( &dsdesc,0,sizeof(dsdesc)); //清空结构內容dsdesc.dwSize = sizeof(dsdesc); //配置结构大小dsdesc.dwFlags = DSBCAPS_STATIC |DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME| DSBCAPS_GLOBALFOCUS;dsdesc.dwBufferBytes = size; //设定档案大小dsdesc.lpwfxFormat = &swfmt; //设定缓存区格式result = pDS->CreateSoundBuffer( &dsdesc, &pSBuf, NULL );if(result != DS_OK)MessageBox(NULL,"","建立此缓存区失败!",MB_OK);result =pSBuf->Lock (0,size,&pAudio,&bytesAudio,NULL,NULL,NULL);//if(result != DS_OK)MessageBox(NULL,"","锁定缓存区失败!",MB_OK);mmresult = mmioRead(hmmio,(HPSTR)pAudio,bytesAudio);//if(mmresult == -1)MessageBox(NULL,"","读取音频失败!",MB_OK);result =pSBuf->Unlock(pAudio,bytesAudio,NULL,NULL);//解除缓存区if(result != DS_OK)MessageBox(NULL,"","解除锁定缓存区失败失败!",MB_OK);mmioClose(hmmio,0);pSBuf->Play(0,0,0);}七、参考文献《VisualC++游戏编程基础》电子工业出版社肖永亮主编《C++面向对象程序设计》电子工业出版社杜茂康李昌兵曹慧英王永编著。

相关文档
最新文档