C语言设计拼图游戏.docx
《C语言设计拼图游戏.docx》由会员分享,可在线阅读,更多相关《C语言设计拼图游戏.docx(19页珍藏版)》请在冰豆网上搜索。
C语言设计拼图游戏
(郑重声明:
本文绝对本人原创,XX)
(免费提供给爱好C语言的朋友,希望志同道合的朋友们一起加油!
)
(运行环境TurboC,下载的朋友把图形驱动路径改为自己驱动实际路径即可)
(对本文有意见或建议者,请联系Q772833493)
(本文流程图没画,函数功能没有介绍。
但是代码不长,细细研究一下一定会弄明白)
基于C语言的拼图游戏设计
彭云毅,黄波
(成都信息工程学院,四川,成都610225)
摘要:
近年来随着科技的飞速发展,C语言的应用正在不断深入。
C语言目前是国际上比较流行的计算机高级编程语言之一,因其简洁、使用方便且具有强大的功能而受到编程人员的普遍青睐。
它既适合作为系统描述语言,也可用来编写系统软件,还可以用来编写应用软件和设计游戏等。
本文着重分析C语言实现一个简单的拼图游戏,旨在介绍拼图游戏的实现方法。
编程工具TurboC。
涉及内容:
TC图形库的使用、随机数的产生、光标定位。
关键词:
C语言;拼图;TurboC;图形库
中图分类号:
TP3文献标识码:
A
PuzzleGamebasedontheCLanguage
PengYun-yi
(ChengduUniversityofInformationTechnology,SichuanChengdu,China,610225)
Abstract:
Withtherapiddevelopmentofscienceandtechnologyinrecentyears,Clanguage,applicationsarecontinuouslyindepth.Clanguageisnowmorepopularinternationallyinhigh-levelcomputerprogramminglanguage,oneofitssimplicity,easytouseandwithpowerfulfeaturesfavoredbyordinaryprogrammers.Itissuitableasasystemdescriptionlanguage,canalsobeusedtowritesystemsoftware,applicationsoftwarecanalsobeusedtowritesystemsoftware,applicationsoftwarecanalsobeusedtowriteanddesigngames.ThistitlefocusesontheanalysisofClanguagetoachieveasimplejigsawpuzzle,puzzlegamedesignedtointroducerealizationmethod.ProgrammingtoolTurboC.Content:
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函数功能描述
(N/A)
第三章拼图游戏的程序实现
3.1源码分析
3.1.1程序预处理
/*加载头文件*/
#include
#include
#include
#include
#include
/*定义全局变量*/
intpuzz[9];//九格游戏数组
inti=0,j,k;//i初始化界面的提示语,j获取空格位置,k移动次数
intspace;//空缺位置
/*自定义函数原型*/
voidinterface()//界面,包括打印充填矩形和数字
voidchange(inta,intb)//交换
voidpress()//按键
voidstart()//初始化和判断是否胜利
屏幕默认分辨率640*480
3.1.2初始化模块
voidstart()//初始化和判断是否胜利
{
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;a<8;a++)
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)
break;
space=j;
press();
}
}
3.1.3画图模块
voidinterface()//界面,包括打印充填矩形和数字
{
clearviewport();//清楚屏幕图形
setbkcolor(6);//设置背景色
setfillstyle(2,2);//矩形块颜色
if(puzz[0]!
=0)
bar(160,60,240,140);
if(puzz[1]!
=0)
bar(260,60,340,140);
if(puzz[2]!
=0)
bar(360,60,440,140);
if(puzz[3]!
=0)
bar(160,160,240,240);
if(puzz[4]!
=0)
bar(260,160,340,240);
if(puzz[5]!
=0)
bar(360,160,440,240);
if(puzz[6]!
=0)
bar(160,260,240,340);
if(puzz[7]!
=0)
bar(260,260,340,340);
if(puzz[8]!
=0)
bar(360,260,440,340);
gotoxy(25,7);
if(puzz[0]!
=0)
printf("%d",puzz[0]);
gotoxy(38,7);
if(puzz[1]!
=0)
printf("%d",puzz[1]);
gotoxy(50,7);
if(puzz[2]!
=0)
printf("%d",puzz[2]);
gotoxy(25,13);
if(puzz[3]!
=0)
printf("%d",puzz[3]);
gotoxy(38,13);
if(puzz[4]!
=0)
printf("%d",puzz[4]);
gotoxy(50,13);
if(puzz[5]!
=0)
printf("%d",puzz[5]);
gotoxy(25,19);
if(puzz[6]!
=0)
printf("%d",puzz[6]);
gotoxy(38,19);
if(puzz[7]!
=0)
printf("%d",puzz[7]);
gotoxy(50,19);
if(puzz[8]!
=0)
printf("%d",puzz[8]);
if(i==0)
{
printf("\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");
printf("\n");
printf("\t\t\t\tPUZZLEGAME\n");
printf("\n");
printf("\t\t\t/////////////////////////////\n");
printf("\n\n\n\n\n\n\tPressanykeytostartgame");
printf("\n\n\tPressEsctoexit\n\n\t");
if(getch()==27)
{
clrscr();
clearviewport();
printf("\n\n\n\t\t\t//////////////////////////////////\n");
printf("\n\t\t\t\tSeeyounexttime\n");
printf("\n\t\t\t//////////////////////////////////\n");
printf("\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语言拼图小游戏源代码
源代码:
#include
#include
#include
#include
#include
intpuzz[9];//九格游戏数组
inti=0,j,k;//i初始化界面的提示语,j获取空格位置,k移动次数
intspace;//空缺位置
voidinterface()//界面,包括打印充填矩形和数字
{
clearviewport();//清楚屏幕图形
setbkcolor(6);//设置背景色
setfillstyle(2,2);//矩形块颜色
if(puzz[0]!
=0)
bar(160,60,240,140);
if(puzz[1]!
=0)
bar(260,60,340,140);
if(puzz[2]!
=0)
bar(360,60,440,140);
if(puzz[3]!
=0)
bar(160,160,240,240);
if(puzz[4]!
=0)
bar(260,160,340,240);
if(puzz[5]!
=0)
bar(360,160,440,240);
if(puzz[6]!
=0)
bar(160,260,240,340);
if(puzz[7]!
=0)
bar(260,260,340,340);
if(puzz[8]!
=0)
bar(360,260,440,340);
gotoxy(25,7);
if(puzz[0]!
=0)
printf("%d",puzz[0]);
gotoxy(38,7);
if(puzz[1]!
=0)
printf("%d",puzz[1]);
gotoxy(50,7);
if(puzz[2]!
=0)
printf("%d",puzz[2]);
gotoxy(25,13);
if(puzz[3]!
=0)
printf("%d",puzz[3]);
gotoxy(38,13);
if(puzz[4]!
=0)
printf("%d",puzz[4]);
gotoxy(50,13);
if(puzz[5]!
=0)
printf("%d",puzz[5]);
gotoxy(25,19);
if(puzz[6]!
=0)
printf("%d",puzz[6]);
gotoxy(38,19);
if(puzz[7]!
=0)
printf("%d",puzz[7]);
gotoxy(50,19);
if(puzz[8]!
=0)
printf("%d",puzz[8]);
if(i==0)
{
printf("\n\n\n\n\n\t\tPressanykeytodare");
getch();
}
gotoxy(60,4);//打印移动次数
printf("%dth",k);
i+=1;
return;
}
voidchange(inta,intb)//交换
{
intt;
t=puzz[a];
puzz[a]=puzz[b];
puzz[b]=t;
return;
}
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);
k++;
}
break;
case77:
//左
if(space%3!
=0)
{
change(space,space-1);
k++;
}
break;
case75:
//右
if(space%3!
=2)
{
change(space,space+1);
k++;
}
break;
case32:
//空格键重新开始
i=0;
start();
case27:
clrscr();
clearviewport();
printf("\n\n\n\t\t\t//////////////////////////////////\n");
printf("\n\t\t\t\tSeeyounexttime\n");
printf("\n\t\t\t//////////////////////////////////\n");
printf("\n\n\n\n\n\t\t\tPressanykeytoexit");
getch();
closegraph();
exit
(1);
}
return;
}
voidstart()//初始化和判断是否胜利
{
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;
i=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;a<8;a++)
if(puzz[a]!
=a+1)
break;
if(a==8)
{
setcolor(4);//五角星边框
drawpoly(11,star);//五角星
setfillstyle(1,4);//五角星填充
floodfill(300,150,4);//五角星内一点
setcolor
(1);//文本“SUCCESSFUL”
outtextxy(260,180,"SUCCESSFUL!
!
");
getch();
start();
}
for(j=0;j<=8;j++)
if(puzz[j]==0)
break;
space=j;
press();
}
}
intmain()
{
intgdriver=VGA,gmode=VGAHI;
initgraph(&gdriver,&gmode,"c:
\\tc30\\BGI");
srand((unsigned)time(NULL));//播种子
clearviewport();//清屏
printf("\n\n\t\t\t/////////////////////////////\n");
printf("\n");
printf("\t\t\t\tPUZZLE