湖南文理学院课程设计报告
课程名称:    计算机软件技术基础   
系    部:    电气与信息工程学院   
专业班级:        通信08102班       
学    号:         200816020230     
学生姓名:          向哲奇           
指导教师:          曹玲玲         
完成时间:      2009年10月14日     
报告成绩:                           
         
评阅意见:
              评阅教师                日期适配器字符串是什么                 
黑白棋游戏C程序设计报告
一.设计要求
通过游戏程序设计,提高编程兴趣与编程思路,巩固C语言中所学的知识,合理的运用资料,实现理论与实际相结合。
(1).收集资料,分析课题,分解问题,形成总体设计思路;
(2).深入分析各个小问题,列出大纲,编写各部分程序模块;
(3).对于设计中用到的关键函数,要学会通过查资料,弄懂其用法,要联系问题进行具体介绍;
(4).上机调试,查错,逐步分析不能正常运行的原因,确保所设计的程序正确,并且能正常运行;
(5).完成课程设计报告,并进行答辩。
二.设计的作用、目的
C语言是一种易学易懂的通用程序设计语言,由于它具有功能性强,运用简洁,灵活兼有高级语言与低级语言的优点,以及“目标程序效率高”可移植性和能在各种系统上普遍实现等特点使它成为当今世界上的主流程序设计语言之一,同时被选作目前全世界广泛应用,同时也是大学生必修的科目。作为当代的大学生要很好的利用它,学好一门设计语言,实现学以至用。
    制作C程序报告,是为了巩固和加深对C语言课程的基本知识的理解和掌握,并且能够掌握C语言编程和程序调试的基本技能。
通过游戏程序的设计训练和提高学生的基本技能,掌握字符串的表示方法和字符串函数的功能、Turbo C图形操作的基本知识、键盘上特殊键的获取以及图形方式下光标的显示,提高编程兴趣与编程水平,学会如何正确的书写程序设计说明文档,提高运用C语言解决实际问题的能力,巩固C语言语法规则的理解和掌握,学会通过源程序写出流程图,提高自学以及查阅资料的能力。
三. 课题分析
1.黑白棋游戏描述
本程序设计为人与人对奕,一方执黑棋,一方执白棋,轮流走棋,每方都试图在游戏结束前让自己棋子的数目多于对方。按键盘上的方向键可以上下左右移动棋子,按回车键可以摆放棋子。
黑白棋的详细规则:
1)两人对奕,以轮流方式持黑子与白子。
2)开辟新局者持白子,加入者持黑子,白棋先走,之后以轮流方式将棋子置于棋盘格子中。
3)在提示的格子中,选择一个格子下子。每个棋手下棋时,摆子的位置必须是以自己的棋子能包围住对方一个或多个棋子,被包围的对方棋子将变成自己的棋子。包围的方向可以是上下左右以及左右斜线共8个方向,只要能连成一条线即可。
4)当轮到一个棋手摆子,而他没有可以包围对方棋子的位置时,他必须停步,让对方走棋,直到他可以走为止。
5当棋盘上有一方的棋子为0(也就是被对方吃完)或下满64格,游戏结束,棋子少者输。
游戏初始界面如图1-l所示。当游戏一方胜利后显示胜利信息,如图1-2所示。程序设计中用深灰代表黑棋。
图1-1 游戏初始界面
图1-2 黑棋胜利的界面
2.设计思路分析
黑白棋的游戏是要在一个8*8的网格中进行,而数组属于构造体类型,数组是具有相同数据类型的变量序列,序列中的每个变量成为元素,数组元素由一个统一标识的数组名和顺序好“下标”来表示。需要在游戏中定义一个二维数从而实现游戏的走棋、落棋、判断棋盘的变化等。
游戏不同于基于C语言的其他程序(如学生成绩管理系统、教务工作管理系统、图书管理系统等)由于游戏本身的问地就在于缓解压力,所以基于C语言设计的游戏需要一个良好的游戏界面,给游戏者以轻松和愉快的感觉。TURBO C提供了70多个图形函数,这些函数包括在图形库文件graphics.LIB中,被定义在graphics.h中。有强大的图形处理能力,去设计一个良好的人机交流界面是可行的。
由于此游戏采用的是“人人对战”的模式,所以在游戏时,需要两个游戏者轮流下棋,棋手1走棋完毕后,经过判断棋盘变化过程后棋手2走棋,游戏过程需要在棋手间不断进行转化。在C语言中,提供了包括if……elseswitch……case等分支语句,综合运用这些分支语句,可以完成上述转化。
黑白棋游戏双方共需要走棋64手,每次走棋后,都需要根据相同的标准判断棋盘变化,来判断旗子颜的变化情况。显然需要运用循环语句来简化编程的长度。C语言中提供了while\for等循环语句可以实现上述功能。
游戏需要操作和输出显示游戏的结果,游戏的操作要由计算机的外部设备在人的操作下完成。C语言本身并不提供输入和输出语句,输入和输出的操作都是由函数来完成的,在C语
言的标准库函数中提供了一些输入和输出的函数,这些函数的指针都是针对系统隐含指定的输入和输出设备的。综合运用这些输入和输出的函数可以实现上述的功能。
四.设计的具体实现
1.总体设计描述文档
程序中,通过调用绘制棋盘、棋手对战判断棋盘变化、改变棋子颜等函数的调用来实现主函数的相应的功能子函数功能如下:
序号
名称
功能
备注
1
main
初始化
初始化图形系统,画出棋盘
2
DrawQp
绘制棋盘和初始棋子
在棋盘中绘制8*8的格子,初始棋子
3
SetPlayColor
设置棋子第一次的颜
先走棋者持白子,后走棋黑子,每次交替
4
Playtoplay
人人对战函数
俩棋手交替走棋,定义键盘操作, 接收棋手的按键信息
5
MoveColor
俩棋手交替走棋,定义键盘操作等
棋子由初始位置到落子位置的路径不改变颜
6
QpChange
判断棋盘的变化,改变棋子的颜
每次走棋后,判断棋盘的变化情况,根据变化情况判断是否可以输出分数
7
DoScore
处理分数
根据棋盘上旗子的多少进行分数的处理
8
PrintScore
输出成绩
9
playWin
输出胜利者结果
(1)main()主函数
按照语法规则,首先定义使用到的常数、全局变量、函数原型说明。棋盘状态用数组a[8][8],初值为0,表示空格。函数的实体比较简单,因为要输出图形,所以应初始化图形系统,图形工作方式正确确定后,画出棋盘,调用playtoplay()人人对弈函数开始游戏,一旦游戏结束后,关闭图形系统,程序结束。
(2)DrawQp()画棋盘函数
背景颜设为蓝,从坐标(100,100)开始每隔40个单位用白画一条水平直线,一条垂直线,构成棋盘,用循环语句实现。画线函数line()的参数为线的起点和终点坐标,注意要计算正确。函数setfillstyle()可以设置填充模式和填充颜,fillellipse(int x, int y, int xradius, int yradius)以x和y为圆心,xradius和yradius为水平和垂直轴画一填充椭圆,当xradius和yradius相等时,则画出的是圆,用它表示棋子。
(3)SetPlayColor()设置棋子的颜
因为是两个棋手,同时棋盘也在不断变化,所以要判断棋手和棋盘变化设置了这个函数,函
数的参数为整型变量t,根据t的值来设计填充棋子的当前颜,值为l代表白棋,值为2代表黑棋。
(4)MoveColorl()恢复原来格子的状态
由于棋手在走棋的时候,他的棋子总是首先出现在棋盘的左上角,棋手要通过移动光标键走到要落子的位置,在经过的路程上显示当前棋子,就会覆盖原来的棋盘状态,所以一旦棋子走过后,就应恢复原来的状态,是空格的依然显示空格,是棋子的就显示原来棋子的颜。因为棋子移动过程并没有改变数组元素的值,所以可以根据数组元素的值判定原来的状态,如果值是l,就恢复白棋子,值是2则恢复黑棋子,否则恢复蓝空格。
(5)playtoplay()人人对战函数
这是游戏进行的函数,主要是接收棋手的按键消息,其处理过程如下:
①按Esc键程序可以随时结束。
②按上下左右光标键,则改变棋子移动的坐标值。
③按回车键后判断:
1)如落子的位置已经有棋则无效,继续读下一次按键。
2)如落子位置是空格,可以将棋子落入格内,调用函数QpChange()判断是否引起棋盘的变化,函数值为1有变化,为0没变化。如果棋盘有变化,说明将包围的对方棋子吃掉,统计当前分数,如果棋盘没有变化,则说明落子的位置无法包围对方的棋子也视为无效棋,可以继续寻合适的位置,但开始统计其落子次数,一旦尝试次数超过当前棋盘的空格数,则说明他无棋可走,则放弃此步,让对方下棋。
3)如果棋子变化后,格子己占满64格或一方棋子为0,则游戏结束,显示胜利方信息,按任意键程序结束。
④重复上述步骤,直到游戏结束。
这个函数中注意棋子的坐标和数组元素值的变化。
playtoplay()程序流程图
(6)QpChange()判断棋盘变化
当棋手按回车键落子后,就要分别往8个方向判断是否包围住对方棋子,如果是,则改变棋盘,也就是棋盘上黑白棋子的个数要发生变化。表示黑白棋的图形用屏幕上的像素坐标,而棋子的状态是数组元素a,所以要根据落子的坐标x和y计算出对应数组元素a的下标i和j。i代表行,j代表列,对于8×8的棋盘,它们的值为0~7,如果j<6,往右边判断,从当前位置开始,用循环语句判断右边是否有一个或连续多个对方的棋子,遇到自己的棋子或空格则结束循环,如果循环结束不是遇到空白,且列坐标小于8,则说明这些位置的棋子是被自己包围的对方棋子,将它们吃掉,也就是改变为自己的棋子,如果有棋子发生了变化,给棋盘变化标志值yes赋值为1,同样的方法向左、上、下等8个方向进行判断,并作相应的变化。如果所有方向都判断过,并且没有引起棋盘的变化,则棋盘变化标志值yes为0,返回yes,结束本函数。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。