一个C语言开发的炸金花纸牌游戏附带vs性能分析报告

一、游戏说明:

        编写的是一个模拟炸金花的纸牌游戏,游戏附有一个操作说明文档,按照文档上的操作方法,可以简单的开启游戏,整个程序包扩一个编译好的.exe文件,和两个资源文件夹,分别存有该游戏运行时候所需要的照片资源和音乐资源,用户可以直接点击exe文件运行游戏,然后按照相关操作方法来进行游戏。


二、编程语言环境介绍:

   本游戏是在VC6.0环境下,用C语言加上一个easyx的C语言图形库实现的。程序源文件建立的是.cpp文件,但是程序开发是采用的C语言语法和风格,建立.cpp文件的原因是,easyx图形库的的调用的需要。


三:编写方法介绍:
   本游戏,整体上是按照功能来编写的,是一种按照过程来编程而非面向对象的方法,游戏中,根据每一个游戏界面的区分,分别实现每一个游戏界面的开发,在每个界面中有相应的键盘监听,可以触发程序运行的方向,然后通过整体上的连接,将每一个界面按照功能逻辑连接成一个完整的游戏。


四: visual studio 性能分析报告:
说明: 性能测试是按照一次正常的游戏过程的执行来测试的。


                                                                                                                               图一


                                                                                                                                图二


                                                                                                                                 图三


五、性能报告结果分析:
   从第一张图反映整个程序的运行,整体上的资源消耗比较平稳,只是在不同的阶段有一些合理的波动,这与程序的代码的实现上是有关的,由于每一个界面的图形绘制都是通过相应的图形库函数来实现的,这种图形绘制工作量在资源的消耗上波动不是太大,因为每个界面的内容不会导致对资源的消耗有明显的区别。然后就是每个界面的监听和相关处理不同会对程序阶段性资源消耗造成一些不同。
    第二张图反映热路劲的核心函数对资源的消耗,都不是单个函数的消耗,几乎全部都是有子函数的调用和运行对资源的消耗构成,因为在程序代码上看,单个函数的处理上,大量的调用了库函数和其他函数,然后整体上控制和与这些子函数进行交流通信,达到整体功能上的实现。
    第三张图反映了程序运行中的几个运行次数最多,对资源消耗最大的子程序。


六、游戏缺点:
   在该游戏中,由于是单机版,只能模拟炸金花的过程,由于要在一台电脑上显示两家牌,这样就与游戏中不能看到对方牌,但是又要看到自家牌的规则相违背。对这个问题的处理是,通过默认不翻牌,只在按下相关键的情况下,翻开对应牌,这就造成了游戏的用户体验上的缺陷,但这也是由于该游戏性质和单机版本这两个因素的限制。
    另外就是,在该游戏中有很多位置还有待优化和补漏,游戏的虽然可以在正常的操作下正常运行,但是有些位置对非正确的操作,程序的鲁棒性还不好,因而有待于对一些特殊情况的处理上进行改进。


七、游戏运行界面展示:

                                                                                                                       图三 游戏界面1

        


                                                                                                                          图四 游戏界面2

八、对编写过程的总结

         首先很明显的一点就是,由于C语言不适合做图形开发,因而用C语言写这个程序的时候,在图形的处理上花费了很多精力和代码量。其次,在做大一点的这种应用的开发时候,前期的规划工作一定要规划好,这样在整个开发的过程中才不会显得那么吃力,也会少很多逻辑上和其他的错误。面向过程的方法编写程序过程,虽然可以按照功能来开发,思路清晰,但是在代码复用、修改和增量改进上有欠缺,并且开发投入比较大。每一种语言都有它的优点和缺点,我们使用的时候,关键是要学会的那种开发过程中的思想和对问题的处理方法,只要运用的好,每一种语言都能做不不平凡的应用。


九、源代码:

#include<easyx.h>
#include<conio.h>
#include<time.h>
#include<windows.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>


#include<graphics.h>
#include<iostream.h>
#include<math.h>
#include<Mmsystem.h>
#pragma comment ( lib, "Winmm.lib" )


#define ok 0
#define eror 1


enum CMD
{
CMD_confirm,    // 确认
CMD_up,                        //上移
CMD_DOWN,                   // 下移
};
char NAM1[50],NAM2[50];
int CAS1=0,CAS2=0,JETON=0,w1[3][2],w2[3][2],countgame=0;


int getCMDNum();
CMD getCmd();
int mianInterface(int x,int y,int z);
int instruction();
int shutDown();
int loading();
int welcome();
int setCash();
int gameInterface();
int initImage(int i,int j,IMAGE * p);


int Is_BaoZi(int a[3][2]);
int Is_TongHuaShun(int a[3][2]);
int Is_ShunZi(int a[3][2]);
int Is_TongHua(int a[3][2]);
int Is_DuiZi(int a[3][2]);
void Sort(int a[3][2]);
int comparePoker();
int compareOnePoker(int i,int j);




void main()
{
time_t rawtime;
struct tm * timeinfo;
FILE * fp;
char tim[50];
time ( &rawtime );
    timeinfo = localtime ( &rawtime );
    srand((unsigned)time(0));
strcpy(tim,asctime (timeinfo));
if((fp=fopen("gameLog.txt","a"))==NULL)
{
printf("File open eror!\n");
exit(eror);
}
else
{
fprintf(fp,"\n%s",tim);
if(fclose(fp))
{
printf("file close eror");
exit(eror);
}

}
initgraph(1024,640);
mciSendString( "open ./sound/1003.mp3 alias 1003", 0, 0, 0 );
mciSendString( "play 1003 ", 0, 0, 0 );
mianInterface(0,0,0);
/*mciSendString(L"status sound length", buf, 256, NULL);
mciSendString(L"pause sound", NULL, 0, NULL);
mciSendString(L"play sound", NULL, 0, NULL); // 从当前位置播放到文件尾
mciSendString(L"stop sound", NULL, 0, NULL);
mciSendString(L"close sound", NULL, 0, NULL);*/


}
int gameInterface()
{
int n1,n2,i=0,len,end,c2,k=0,flag[6]={0,0,0,0,0,0},view[6]={0,0,0,0,0,0},num=0,pos=2,exitprogram=0,lock=0;
int fan1[2]={-1,-1},fan2[2]={-1,-1},bigger=-1,count=0,time=15,counttime=0,flagtime=0,completeInput=0;
char game[50],cash1[50],cash2[50],ch,showtime[10],numchar[20];
IMAGE clock,pb,p1[3],p2[3];
FILE *fp;
mciSendString( "close 1000 ", 0, 0, 0 );
CAS1 -= 5, CAS2 -= 5;
JETON = 10;
loadimage(&clock,"./picture/clock.jpg", 80, 80);
loadimage(&pb,"./picture/bm.jpg", 120, 180);
n1=strlen(NAM1);
n2=strlen(NAM2);
cleardevice();
setcolor(YELLOW);
setfont( 25, 0,"楷体");
line(0,29,1024,29);
outtextxy(0,2,"天天炸金花");
setfont( 40, 0,"楷体");
outtextxy(50,50,"玩家1");
outtextxy(874,50,"玩家2");
outtextxy(50,100,NAM1);
outtextxy(974-n2*20,100,NAM2);
sprintf(cash1, "%d", CAS1);
sprintf(cash2, "%d", CAS2);
c2=strlen(cash2);
outtextxy(50,150,cash1);
outtextxy(974-c2*20,150,cash2);
sprintf(game, "%d", JETON);
len=strlen(game);
if(len%2==0)
{
outtextxy(512-(len/2)*20,550,game);
}
else
{
outtextxy(512-(len/2)*20-10,550,game);
}
putimage(472, 110, &clock, SRCINVERT);
end = comparePoker();
for(i = 0; i < 3; i++)
{
initImage(w1[i][0],w1[i][1],&p1[i]);
initImage(w2[i][0],w2[i][1],&p2[i]);
}
mciSendString( "open ./sound/chupai.mp3 alias chupai", 0, 0, 0 );
mciSendString( "play chupai ", 0, 0, 0 );
for(i=0;i<40;i+=2)
{
clearrectangle(452,300-i,572,480-i);
putimage(452, 300-i, &pb, SRCINVERT);
Sleep(100);
}
i=260;
putimage(100, i-40, &pb, SRCINVERT);
putimage(804, i-40, &pb, SRCINVERT);
Sleep(200);
clearrectangle(100,i+20,220,i+200);
clearrectangle(804,i+20,924,i+200);
putimage(100, i+20, &pb, SRCINVERT);
putimage(804, i+20, &pb, SRCINVERT);
mciSendString("close chupai", NULL, 0, NULL);
while(true)
{
BeginBatchDraw();
if(count==0)
{
k=rand()%4;
if(k==0)
mciSendString( "open ./sound/2000.mp3 alias music", 0, 0, 0 );
else if(k==1)
{
mciSendString( "open ./sound/2001.mp3 alias music", 0, 0, 0 );
}
else if(k==2)
{
mciSendString( "open ./sound/2002.mp3 alias music", 0, 0, 0 );
}
else
{
mciSendString( "open ./sound/2002.mp3 alias music", 0, 0, 0 );
}
mciSendString( "play music ", 0, 0, 0 );
}
if(count==1500)
mciSendString("close music", NULL, 0, NULL);
if(count==1501)
count=0;
begin: if(kbhit())
{
ch=getch();
switch(ch)
{
case '5':
end=2;
goto start3;
case '0':
end = 1;
goto start3;
case '4':
start1: for(k=0;k<pos;k++)
{
clearrectangle(100,i-40+k*60,220,i-40+k*60+180);
if(view[k]==1)
{
putimage(100, i-40+k*60, &p1[k], SRCINVERT);
flag[k]=1;
}
else
{
if(flag[k]==0&&ch=='4')
{
putimage(100, i-40+k*60, &p1[k], SRCINVERT);
flag[k]=1;
}
else
{
putimage(100, i-40+k*60, &pb, SRCINVERT);
   flag[k]=0;
}
}
}
break;
case '9':
start2: for(k=0;k<pos;k++)
{
clearrectangle(804,i-40+k*60,924,i-40+k*60+180);
if(view[k+3]==1)
{
putimage(804, i-40+k*60, &p2[k], SRCINVERT);
flag[k+3]=1;
}
else
{
if(flag[k+3]==0&&ch=='9')
{
putimage(804, i-40+k*60, &p2[k], SRCINVERT);
flag[k+3]=1;
}
else
{
putimage(804, i-40+k*60, &pb, SRCINVERT);
   flag[k+3]&#

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值