C语言设计拼图游戏Word格式.docx
《C语言设计拼图游戏Word格式.docx》由会员分享,可在线阅读,更多相关《C语言设计拼图游戏Word格式.docx(19页珍藏版)》请在冰豆网上搜索。
useoftheTCgraphicslibrary,randomnumbergeneration,andpositioningthecursor.
Keywords:
Clanguage;
Puzzle;
TurboC;
graphics
第一章绪论
1.1设计的功能
功能包括方向键控制方块移动、空格键重新开始、Esc键退出。
1.2游戏编程思想
1.2.1确定软件的功能
玩家可以通过按键上、下、左、右实现数字换位,并且有记录移动次数功能,直到把数字矩阵排列成为
123
456
78
即为胜利。
“space”重新开局或“Esc”退出游戏。
1.2.2定义软件的核心数据结构
全局变量puzz[9]为九宫格的10个数字;
方格的移动就是一次次的刷新屏幕,puzz[n]为0的方格,既不打印充填矩形,也不打印数字(九宫格总有一个个空缺,我用0来标记);
change(a,b)作用是交换puzz[9]数组元素的顺序,通过数组内元素的顺序变化来控制九宫格的打印情况。
1.2.3对整个软件进行功能模块化分
1.初始化:
首先显示欢迎屏幕,然后按任意键(Esc除外)进入游戏初始化界面,此时puzz[9]={1,2,3,4,5,6,7,8,0},屏幕宫格顺序排列。
2.进入游戏循环:
在初始化界面按任意键进入游戏循环,此时宫格被随机打乱;
这是可以按方向键控制方格移动;
无效按键做忽略处理(如果空格已在最底端,则按up键时无效)。
游戏是死循环,用while
(1)实现;
3.判断是否胜利:
游戏在循环中,每次执行一次按键操作,都会扫描一次当前数组是否与初始化时相符合,若相符,则游戏成功,在中间宫格上打印出一个红色五角星,上面打印文字“SUCCESSFUL!
!
”。
然后按任意键再次进入初始化界面,此时可以继续玩或者退出游戏。
1.2.4整个拼图游戏的功能介绍
1.初始化屏幕。
2.方向键控制宫格移动方向。
3.计数。
4.空格键复位游戏。
5.Esc键退出游戏。
第二章游戏的总体设计
2.1功能模块设计
本程序包括4个模块,分别是初始化模块、按键模块、交换模块和图形打印模块。
2.1.1系统模块图
2.1.2任务执行流程图
(N/A)
2.2数据结构设计
2.2.1设置全局变量
①定义puzz[9]一维数组,记录九宫格的数据变化。
②i初始化界面的提示语,j获取空格位置,k移动次数。
③space空缺位置
2.3函数功能描述
第三章拼图游戏的程序实现
3.1源码分析
3.1.1程序预处理
/*加载头文件*/
#include<
stdio.h>
stdlib.h>
conio.h>
time.h>
graphics.h>
/*定义全局变量*/
intpuzz[9];
//九格游戏数组
inti=0,j,k;
//i初始化界面的提示语,j获取空格位置,k移动次数
intspace;
//空缺位置
/*自定义函数原型*/
voidinterface()//界面,包括打印充填矩形和数字
voidchange(inta,intb)//交换
voidpress()//按键
voidstart()//初始化和判断是否胜利
屏幕默认分辨率640*480
3.1.2初始化模块
{
inta,b,c;
intstar[22]={300,120,320,160,360,160,320,200,340,240,300,200,260,240,280,200,240,160,280,160,300,120};
k=0;
for(a=0;
a<
8;
a++)
puzz[a]=a+1;
puzz[8]=0;
interface();
for(c=0;
c<
100;
c++)//随机打乱顺序
{
a=rand()%9;
b=(a+2)%8;
//关于有无解问题,搞不清楚,引用的
change(a,b);
}
while
(1)
interface();
for(a=0;
if(puzz[a]!
=a+1)
break;
if(a==8)
{
drawpoly(11,star);
//五角星
setcolor
(1);
//文本“SUCCESSFUL”颜色
setfillstyle(1,4);
//五角星填充色
floodfill(300,150,15);
//五角星内一点
outtextxy(260,180,"
SUCCESSFUL!
"
);
getch();
start();
}
for(j=0;
j<
=8;
j++)
if(puzz[j]==0)
space=j;
press();
}
3.1.3画图模块
clearviewport();
//清楚屏幕图形
setbkcolor(6);
//设置背景色
setfillstyle(2,2);
//矩形块颜色
if(puzz[0]!
=0)
bar(160,60,240,140);
if(puzz[1]!
bar(260,60,340,140);
if(puzz[2]!
bar(360,60,440,140);
if(puzz[3]!
bar(160,160,240,240);
if(puzz[4]!
bar(260,160,340,240);
if(puzz[5]!
bar(360,160,440,240);
if(puzz[6]!
bar(160,260,240,340);
if(puzz[7]!
bar(260,260,340,340);
if(puzz[8]!
bar(360,260,440,340);
gotoxy(25,7);
printf("
%d"
puzz[0]);
gotoxy(38,7);
puzz[1]);
gotoxy(50,7);
puzz[2]);
gotoxy(25,13);
puzz[3]);
gotoxy(38,13);
puzz[4]);
gotoxy(50,13);
puzz[5]);
gotoxy(25,19);
puzz[6]);
gotoxy(38,19);
puzz[7]);
gotoxy(50,19);
puzz[8]);
if(i==0)
\n\n\n\n\n\t\tPressanykeytodare"
getch();
gotoxy(60,4);
//打印移动次数
printf("
%dth"
k);
i+=1;
return;
3.1.5主函数
intmain()
{
intgdriver=VGA,gmode=VGAHI;
initgraph(&
gdriver,&
gmode,"
c:
\\tc30\\BGI"
srand((unsigned)time(NULL));
//播种子
clearviewport();
//清屏
printf("
\n\n\t\t\t/////////////////////////////\n"
\n"
\t\t\t\tPUZZLEGAME\n"
\t\t\t/////////////////////////////\n"
\n\n\n\n\n\n\tPressanykeytostartgame"
\n\n\tPressEsctoexit\n\n\t"
if(getch()==27)
clrscr();
\n\n\n\t\t\t//////////////////////////////////\n"
\n\t\t\t\tSeeyounexttime\n"
\n\t\t\t//////////////////////////////////\n"
\n\n\n\n\n\t\t\tPressanykeytoexit"
getch();
closegraph();
return0;
start();
return0;
}
3.2运行结果分析
3.2.1进入游戏界面
欢迎屏幕:
初始化界面:
随机打乱顺序:
移动过程中计数功能:
3.2.2游戏成功
第四章总结
本文介绍了一种用C语言编写九宫格拼图小游戏的方法。
其中用到了TurboC的图形库,画了一些简单几何图形,从而完成了可视化的小游戏界面。
作者论文格式仿照《XX文库.基于C语言推箱子游戏设计》[2];
设计程序参考《XX文库.最经典的C语言拼图小游戏源代码》[3]。
本文与参考资料的原理是完全不同的:
参考资料的界面用定位光标和打印特殊字符组成了非常简洁的界面;
由于作者对C尚不够深入,能力尚不强大,无法理解参考资料具体实现宫格移动的方法,所以作者最后决定采用调用图形库绘图的方法实现游戏界面。
作者从参考资料得到一个思路和引用一个算法:
思路是通过交换数组元素的位置来控制可视化界面的图形打印;
引用这个算法是为了解决随机打乱顺序后没有解的问题。
心得体会:
C语言已经结课,可是书本上讲的只是一些基础,关于光标定位和图形界面问题未曾涉及。
学完之后不免有困惑:
C语言还能干什么?
作者通过从网络上搜集的大量资料,加上自己的探索,终于做出了拼图游戏,这也证明了C语言可以制作小游戏!
遗憾:
关于随机交换出现无解情况的的问题,是个数学问题,网上介绍甚少,作者未能理解问题原因,所以直接引用了参考资料的一个算法解决此问题。
参考文献
[1]谭浩强.C程序设计(第三版)
[2]XX文库.基于C语言推箱子游戏设计
[3]XX文库.最经典的C语言拼图小游戏源代码
源代码:
intpuzz[9];
inti=0,j,k;
intspace;
voidinterface()//界面,包括打印充填矩形和数字
voidchange(inta,intb)//交换
intt;
t=puzz[a];
puzz[a]=puzz[b];
puzz[b]=t;
voidpress()//按键
voidstart();
charkey=0;
key=getch();
switch(key)
case80:
//上
if(space>
=3)
{
change(space,space-3);
k++;
}
break;
case72:
//下
if(space<
=5)
change(space,space+3);
case77:
//左
if(space%3!
change(space,space-1);
case75:
//右
=2)
change(space,space+1);
case32:
//空格键重新开始
i=0;
case27:
clrscr();
clearviewport();
printf("
closegraph();
exit
(1);
voidstart()//初始化和判断是否胜利
i=0;
setcolor(4);
//五角星边框
//五角星填充
floodfill(300,150,4);
//文本“SUCCESSFUL”
intmain()
\t\t\t\tPUZZLE