打砖块小游戏程序设计李亚鑫111408085
发布时间:2024-11-02
发布时间:2024-11-02
辽 宁 工 业 大 学
课程设计(论文)
题目: 打砖块小游戏程序设计
院 (系): 软件学院 专业班级: 汽车电子技术113班 学 号: 111408085 学生姓名: 李亚鑫 指导教师: 王彦华 教师职称: 助 教 起止时间:2011.12.05至2011.12.16
课程设计(报告)任务及评语
目 录
第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系统功能模块结构图 ............................................ 2 2.2.3数据结构设计及用法说明 ........................................ 3 2.2.4程序结构(画流程图) .......................................... 3 2.2.5各模块的功能 .................................................. 6 2.3程序源代码及注释 .................................................... 7 第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程序功能介绍
本程序主要是运用了C语言中的一些函数,来实现图形划的一个小游戏设计,在本程序中,主要运用到的函数有以下几个,所需的文件头:"graphics.h","stdio.h","conio.h" 通过一些调试来进行打砖块游戏的实现。 2.2程序整体设计说明
首先,本程序定义了一个“开始界面函数”,int open(),在这个函数里,是对开始界面进行一下定义,也就是开始界面所需要的必须步骤,然后在int quitwindow()函数里,对整个程序的结束界面进行了定义,退出界面也就是游戏结束或者失败后所提示的The end。程序中的char s[100]是声明用于存放字符串的数组,sprintf(s,"Your score is:%d",score);是用来表示格式化输出记分器的值,在定义前两个函数后,接下来是主函数,也就是main函数的代码。 2.2.1设计思路
本程序的设计思路就是先把开始和结束的界面函数定义出来,然后在对主函数进行编写定义,在主函数main里运用的一些循环语句和一些算法都是我们课上所学过的,比如说while循环,if循环,if for循环等等,这个打砖块程序主要就是应用了一些我们所掌握的C语言的基本知识来编写的,所以不是很完善,还需要进一步的改进。 2.2.2数据结构设计及用法说明
在整个程序中有多种数据结构,下面我将来解释其用法,首先在main函数里,我们先定义以下函数:int gdriver,gmode;在这里gdriver这个函数是用来表示设置图形适配器的,而gmode函数是用来表示设置图形模式的,在主函数main里先定义了这两个函数,接下来运用的是一个while循环语句,在这个while循环语句里有一个函数cleardevice();是用来表示图形状态下清屏的。下面这个算法是很重要的:for(i=0,k=0;i<=6;i++)这个for循环是用来绘制方砖阵列,这样的循环在程序中多次出现,他们分别起到不同的作用。
2.2.3程序结构(流程图)
2.2.4各模块的功能及程序说明
本程序的各模块如流程图所示,一共分为六个模块,下面我将解释这六个模块的功能以及程序的说明。
首先是开始界面,这个函数的代码如下: int open() {
setviewport(100,100,500,380,1); setcolor(4);
rectangle(0,0,399,279); setfillstyle(SOLID_FILL,7); floodfill(50,50,4); setcolor(8);
settextstyle(0,0,9); outtextxy(90,80,"BALL"); settextstyle(0,0,1);
outtextxy(110,180,"version 1.0"); outtextxy(110,190,"made by ddt"); setcolor(128); settextstyle(0,0,1);
outtextxy(120,240,"Press any key to continue......"); }
首先运用int来进行定义,setviewport(100,100,500,380,1); 的意思是设置图形窗口区域,设置好窗口区域后再进行颜色的填充等定义。由以上步骤即可定义开始界面。
在下个模块里我们来定义小球和方砖的初始化,因为只有初始化才能进行程序的运行,程序中的这段代码:
int driver,mode,l=320,t=400,r,a,b,dl=5,n,x=200,y=400,r1=10,dx=-2,dy=-2; intleft[100],top[100],right[100],bottom[100],i,j,k,off=1,m,num[100][100];
上边的是用来定义小球的数组,而下边的是用来定义方砖的,这个static int phrase;是定义一系列起开关作用的变量,我们只有定义开关变量才能进行开始程序的步骤,cleardevice();clearviewport();分别是表示图形状态下清屏和清除现行图形窗口内容因为在初始化的时候需要事先清除下,也就是说把变量全部变为0。经过了以上的步骤,我们就可以来绘制方砖了,方砖的绘制函数如下:
for(i=0,k=0;i<=6;i++) {
top[i]=k;
bottom[i]=top[i]+20; k=k+21; oop--;
for(j=0,m=0;j<=7;j++)
{ left[j]=m;
right[j]=left[j]+80; m=m+81; setcolor(4);
rectangle(left[j],top[i],right[j],bottom[i]); setfillstyle(SOLID_FILL,j+oop); floodfill(left[j]+1,top[i]+1,4); num[i][j]=pp++;
} }
方砖的绘制运用了一个for的双循环语句,起初我们先设置变量i的取值范围是0-6,k=0,在第一个循环里在套用一个for循环,在第2个for循环里来设置j变量的取值范围是0-7,m=0,这样一个方砖阵列就可以绘制出来了,下面来进行程序的第4步骤,控制小球来进行游戏。这个模块的程序代码如下:
while(1) {
while(!kbhit()) { x=x+dx; y=y+dy;
if(x+r1>r||x+r1<r) { phrase=0;}
if((x-r1<=r||x+r1<=r)&&x+r1>=l) { if(y<t) phrase=1;
if(y+r1>=t&&phrase==1) {dy=-dy;y=t-1-r1;}
}
这里是一个while的循环语句,在while循环语句里还有if的判断语句,互相嵌套而成的,在while里设置了两个变量x和y,并且分别对他们进行定义,x=x+dx,y=y+dy;这样就可以用if语句来判断他们的值。最后来进行整个函数的结束界面的定义,由于跟开始界面有相同之处,在这里就不进行过多的讲述。 2.2.5程序结果
当运行程序是的开始界面如图2.1所示:
图2.1 开始界面图
当运行游戏后,在游戏失败的时候会给出以下的提示,如图2.2:
图2.2 运行游戏失败图
2.3程序源代码及注释
/*===========================Program Description==========================*/ /*程序名称:game.c */ /*程序目的:打砖块游戏演示 */ /*written by :沈跃 */ /*========================================================================*/
#include "graphics.h" #include "stdio.h"
#include "conio.h" /*所需的头文件*/
int on; /*声明具有开关作用的全局变量*/ static int score; /*声明静态的记分器变量*/ /* 定义开始界面函数*/ int open() {
setviewport(100,100,500,380,1); /*设置图形窗口区域*/ setcolor(4); /*设置作图色*/
rectangle(0,0,399,279); /*以矩形填充所设的图形窗口区域*/ setfillstyle(SOLID_FILL,7); /*设置填充方式*/ floodfill(50,50,4); /*设置填充范围*/ setcolor(8);
settextstyle(0,0,9); /*文本字体设置*/ outtextxy(90,80,"BALL"); /*输出文本内容*/ settextstyle(0,0,1);
outtextxy(110,180,"version 1.0"); outtextxy(110,190,"made by ddt"); setcolor(128); settextstyle(0,0,1);
outtextxy(120,240,"Press any key to continue......"); }
/*定义退出界面函数*/ int quitwindow() {
char s[100]; /*声明用于存放字符串的数组*/ setviewport(100,150,540,420,1); setcolor(YELLOW); rectangle(0,0,439,279); setfillstyle(SOLID_FILL,7); floodfill(50,50,14); setcolor(12); settextstyle(0,0,8); outtextxy(120,80,"End"); settextstyle(0,0,2);
outtextxy(120,200,"quit? Y/N");
sprintf(s,"Your score is:%d",score);/*格式化输出记分器的值*/ outtextxy(120,180,s);
on=1; /*初始化开关变量*/
}
star:cleardevice();/*程序重载的介入点*/ sum=0;
qx=100.0+pianx-10;qy=180.0+pianx-10;k=0.33; setcolor(7);
rectangle((int)(pianx-2),(int)(piany-2),(int)((tx+jx)*8+2+pianx),302+piany); setcolor(1);
rectangle((int)(pianx-1),(int)(piany-1),(int)((tx+jx)*8+1+pianx),301+piany); /*读取盘面情况*/ for(i=0;i<5;i++)
fscanf(p,"%x ",&zhuan[i]); /*主函数*/ main() {
int gdriver,gmode;
gdriver=DETECT; /*设置图形适配器*/ gmode=VGA; /*设置图形模式*/ registerbgidriver(EGAVGA_driver); /*建立独立图形运行程序*/ initgraph(&gdriver,&gmode,""); /*图形系统初试化*/ setbkcolor(14);
open(); /*调用开始界面函数*/ getch(); /*暂停*/
while(1) /*此大循环体控制游戏的反复重新进行*/
{ int
driver,mode,l=320,t=400,r,a,b,dl=5,n,x=200,y=400,r1=10,dx=-2,dy=-2;/*初始化小球相关参数*/
int
left[100],top[100],right[100],bottom[100],i,j,k,off=1,m,num[100][100];/*方砖
阵列相关参数*/
static int pp;
static int phrase; /*一系列起开关作用的变量*/ int oop=15; pp=1; score=0; driver=DETECT; mode=VGA;
registerbgidriver(EGAVGA_driver); initgraph(&driver,&mode,""); setbkcolor(10);
cleardevice(); /*图形状态下清屏*/ clearviewport(); /*清除现行图形窗口内容*/ b=t+6; r=l+60; setcolor(1);
rectangle(0,0,639,479); setcolor(4); rectangle(l,t,r,b);
setfillstyle(SOLID_FILL,1); floodfill(l+2,t+2,4);
for(i=0,k=0;i<=6;i++) /*此循环绘制方砖阵列*/ { top[i]=k;
bottom[i]=top[i]+20; k=k+21; oop--; for(j=0,m=0;j<=7;j++) { left[j]=m;
m=m+81;
setcolor(4);
rectangle(left[j],top[i],right[j],bottom[i]); setfillstyle(SOLID_FILL,j+oop); floodfill(left[j]+1,top[i]+1,4); num[i][j]=pp++; }
while(1) /*此循环控制整个动画*/
/*下面的函数用于实现设置鼠标的移动范围*/ void Setmouse(int left,int right,int top,int buttom) regs.x.ax=7; regs.x.cx=left; regs.x.dx=right;
int86(0x33,& regs,& regs); regs.x.ax=8; regs.x.cx=top; regs.x.dx=buttom;
int86(0x33,& regs, ); & regs
/*下面这个子程序是完成描绘一个按钮*/
void Draw(int x,int y,int sizex,int sizey)/* x, y为左上角坐标sizex,sizey为长和宽*/
{int sizx=sizex-1; int sizy=sizey-1;
setcolor(15);/*这里最好用白色*/ line(x,y,x+sizx-1,y); line(x,y+1,x+sizx-2,y+1); line(x,y,x,y+sizy-1); line(x+1,y,x+1,y+sizy-2); setcolor(8);/*这里最 好用深灰色*/
line(x+1,y+sizy,x+sizx,y+sizy); line(x+2,y+sizy-1,x+sizx,y+sizy-1); line(x+sizx-1,y+1,x+sizx-1,y+sizy); line(x+sizx,y+2,x+sizx,y+sizy); setcolor(7);/*这里最好用灰色*/ putpixel(x,y+sizy,3); putpixel(x+1,y+sizy-1,3); putpixel(x+sizx,y,3); putpixel(x+sizx-1,y+1,3);
setfillstyle(1, 7);/*这里最好用灰色,设置填充模式*/ bar(x+2,y+2,x+sizx-2,y+sizy-2); }
while(!kbhit()) {
x=x+dx; /*小球运动的圆心变量控制*/ y=y+dy;
if(x+r1>r||x+r1<r) { phrase=0;}
if((x-r1<=r||x+r1<=r)&&x+r1>=l) {
if(y<t) phrase=1;
if(y+r1>=t&&phrase==1) {dy=-dy;y=t-1-r1;} } if(off==0) continue;
for(i=0;i<=6;i++) /*此循环用于判断、控制方砖阵列的撞击、擦除*/
for(j=0;j<=7;j++) /*边判断1*/
if(qy>=y-ty/2 && qy<=y+ty/2 &&(pow(qx+r-x+tx/2,2)<1 || pow(qx-r-x-tx/2,2)<1)) {flag=-flag;k=-k; zhuan[gi]=zhuan[gi]|l; sum-=1;
if(sum==0) {printf("Win!\n");getch();goto star;} setfillstyle(1, 0);
bar((jx+tx)*i+pianx+jx,(jy+ty)*j+piany+jy,(jx+tx)*i+pianx+jx+tx,(jy+ty){
if((x+r1<=right[j]&&x+r1>=left[j])||(x-r1<=right[j]&&x-r1>=left[j])) {
if(( y-r1>top[i]&&y-r1<=bottom[i])||(y+r1>=top[i]&&y+r1<=bottom[i] )) {
if(num[i][j]==0) {continue; } setcolor(10);
rectangle(left[j],top[i],right[j],bottom[i]); setfillstyle(SOLID_FILL,10); floodfill(left[j]+1,top[i]+1,10); dy=-dy; num[i][j]=0; score=score+10;
printf("%d\b\b\b",score);
}
}
if((y+r1>=top[i]&&y+r1<=bottom[i])||(y-r1>=top[i]&&y-r1<=bottom[i]))
{
if((x+r1>=left[j]&&x+r1<right[j])||(x-r1<=right[j]&&x-r1>left[j])) {
上一篇:组织机构与部门 设置说明
下一篇:合同法司法解释(二)理解与适用