C语言设计拼图游戏.docx

上传人:b****6 文档编号:5988578 上传时间:2023-01-02 格式:DOCX 页数:19 大小:435.22KB
下载 相关 举报
C语言设计拼图游戏.docx_第1页
第1页 / 共19页
C语言设计拼图游戏.docx_第2页
第2页 / 共19页
C语言设计拼图游戏.docx_第3页
第3页 / 共19页
C语言设计拼图游戏.docx_第4页
第4页 / 共19页
C语言设计拼图游戏.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

C语言设计拼图游戏.docx

《C语言设计拼图游戏.docx》由会员分享,可在线阅读,更多相关《C语言设计拼图游戏.docx(19页珍藏版)》请在冰豆网上搜索。

C语言设计拼图游戏.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1