WinTCC语言贪吃蛇游戏程序设计.docx
- 文档编号:8238000
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:26
- 大小:300.54KB
WinTCC语言贪吃蛇游戏程序设计.docx
《WinTCC语言贪吃蛇游戏程序设计.docx》由会员分享,可在线阅读,更多相关《WinTCC语言贪吃蛇游戏程序设计.docx(26页珍藏版)》请在冰豆网上搜索。
WinTCC语言贪吃蛇游戏程序设计
Win-TC(C语言)贪吃蛇游戏程序设计
贪吃蛇游戏是大家熟悉的一个经典游戏,现在用Win-TC编译环境来实现游戏过程。
游戏功能如下:
游戏开始后在屏幕出现一条自由活动的蛇,玩家可通过小键盘的方向功能键来控制蛇的运动方向,系统每间隔10秒钟随机投放一次食物(一颗食用果或毒果)。
蛇每吃到一颗食用果后其身体长度会自动增长一节,玩家得到5分的成绩奖励,当蛇吃到毒果或碰到四周边界和蛇头碰到蛇身的某一部位时,游戏结束。
(更新版本)
图1、贪吃蛇游戏效果图
游戏源程序清单如下:
#include
#include
#include
#include
#include
#include
#defineMAXSIZE1000/*定义贪吃蛇最大长度*/
#defineLEFT75/*定义方向键左向键盘值*/
#defineRIGHT77/*定义方向键右向键盘值*/
#defineUP72/*定义方向键上向键盘值*/
#defineDOWN80/*定义方向键下向键盘值*/
#defineWINTOP120/*定义游戏区上边界y坐标值*/
#defineWINDOWN360/*定义游戏区下边界y坐标值*/
#defineWINLEFT140/*定义游戏区左边界x坐标值*/
#defineWINRIGHT500/*定义游戏区右边界x坐标值*/
charFILLC[]={0xfe,0x90,0x49,0xa0,0x30,0xc0,0x29,0xc0,
0x46,0xa0,0xfe,0x90,0x49,0xa0,0x30,0xc0,
0x21,0xc0,0x53,0x20,0x80,0x90,0x10,0x40};
/*恢复屏幕数据*/
charRNULL[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
/*头部数据*/
/*top*/
charheadt[]={0x00,0x00,0x0f,0x00,0x1f,0x80,0x3f,0xc0,
0x26,0x40,0x26,0x40,0x3f,0xc0,0x3f,0xc0,
0x3f,0xc0,0x3f,0xc0,0x1f,0x80,0x1f,0x80};
/*down*/
charheadd[]={0x1f,0x80,0x1f,0x80,0x3f,0xc0,0x3f,0xc0,
0x3f,0xc0,0x3f,0xc0,0x26,0x40,0x26,0x40,
0x3f,0xc0,0x1f,0x80,0x0f,0x00,0x00,0x00};
/*right*/
charheadr[]={0x00,0x00,0x00,0x00,0x3f,0x80,0xfc,0xc0,
0xfc,0xe0,0xff,0xe0,0xff,0xe0,0xfc,0xe0,
0xfc,0xc0,0x3f,0x80,0x00,0x00,0x00,0x00};
/*left*/
charheadl[]={0x00,0x00,0x00,0x00,0x1f,0xc0,0x33,0xf0,
0x73,0xf0,0x7f,0xf0,0x7f,0xf0,0x73,0xf0,
0x33,0xf0,0x1f,0xc0,0x00,0x00,0x00,0x00};
/*身体数据*/
/*leftdown*/
charleftd[]={0x1f,0x80,0x1f,0x80,0x1f,0xc0,0x1f,0xf0,
0x1f,0xf0,0x0f,0xf0,0x0f,0xf0,0x07,0xf0,
0x01,0xf0,0x00,0x00,0x00,0x00,0x00,0x00};
/*rightdown*/
charrightd[]={0x1f,0x80,0x1f,0x80,0x3f,0x80,0xff,0x80,
0xff,0x80,0xff,0x00,0xff,0x00,0xfe,0x00,
0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
/*lefttop*/
charleftt[]={0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xf0,
0x07,0xf0,0x0f,0xf0,0x0f,0xf0,0x1f,0xf0,
0x1f,0xf0,0x1f,0xc0,0x1f,0x80,0x1f,0x80};
/*righttop*/
charrightt[]={0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,
0xfe,0x00,0xff,0x00,0xff,0x00,0xff,0x80,
0xff,0x80,0x3f,0x80,0x1f,0x80,0x1f,0x80};
/*topdown*/
chartp_dn[]={0x1f,0x80,0x1f,0x80,0x1f,0x80,0x1f,0x80,
0x1f,0x80,0x1f,0x80,0x1f,0x80,0x1f,0x80,
0x1f,0x80,0x1f,0x80,0x1f,0x80,0x1f,0x80};
/*leftright*/
charlf_rh[]={0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xf0,
0xff,0xf0,0xff,0xf0,0xff,0xf0,0xff,0xf0,
0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00};
/*尾巴数据*/
/*down*/
charre_dn[]={0x09,0x00,0x19,0x80,0x19,0x80,0x19,0x80,
0x19,0x80,0x19,0x80,0x19,0x80,0x1f,0x80,
0x1f,0x80,0x1f,0x80,0x1f,0x80,0x1f,0x80};
/*top*/
charre_tp[]={0x1f,0x80,0x1f,0x80,0x1f,0x80,0x1f,0x80,
0x1f,0x80,0x19,0x80,0x19,0x80,0x19,0x80,
0x19,0x80,0x19,0x80,0x19,0x80,0x09,0x00};
/*right*/
charre_rh[]={0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xf0,
0xff,0xf0,0x01,0xf0,0x01,0xf0,0xff,0xf0,
0x7f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00};
/*left*/
charre_lf[]={0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xe0,
0xff,0xf0,0xf8,0x00,0xf8,0x00,0xff,0xf0,
0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00};
/*食用果数据*/
charsfood[]={0x00,0x00,0x0f,0x00,0x1f,0x80,0x3f,0xc0,
0x7f,0xe0,0x7f,0xe0,0x7f,0xe0,0x7f,0xe0,
0x3f,0xc0,0x1f,0x80,0x0f,0x00,0x00,0x00};
/*毒果数据*/
charblock[]={0x06,0x00,0x06,0x00,0x0f,0x00,0x0f,0x00,
0x3f,0xc0,0x7f,0xe0,0x7f,0xe0,0x3f,0xc0,
0x0f,0x00,0x0f,0x00,0x06,0x00,0x06,0x00};
/*定义贪吃蛇数据类型*/
typedefstructTANCHISHE
{
intx;/*每节位置x分量*/
inty;/*每节位置y分量*/
intns;/*每节蛇体(位图)状态标识*/
intleft;/*向左运动标识状态*/
intright;/*向右运动标识状态*/
inttop;/*向上运动标识状态*/
intdown;/*向下运动标识状态*/
}TANCHISHE;
/*定义整条蛇的数据类型*/
typedefstruct
{
TANCHISHESnakeh;/*头部数据*/
TANCHISHESnakeb[MAXSIZE];/*刷新蛇体数据*/
TANCHISHEold_Snakeb[MAXSIZE];/*保存上一次蛇体数据*/
TANCHISHESnaket;/*尾巴数据*/
intcx;/*恢复屏幕数据位置x分量*/
intcy;/*恢复屏幕数据位置y分量*/
inthx;/*头部位置x分量*/
inthy;/*头部位置y分量*/
intsize;/*每节长度大小*/
intfront;/*队列头指针*/
intrear;/*队列尾指针*/
}TCsQueue;
staticchar*TCShead[4]={headt,headd,headl,headr};
staticchar*TCSbody[6]={leftt,leftd,rightt,rightd,lf_rh,tp_dn};
staticchar*TCStail[4]={re_lf,re_rh,re_tp,re_dn};
/*定义食物的数据类型*/
typedefstructFOOD
{
intfx;/*食物x坐标位置分量*/
intfy;/*食物y坐标位置分量*/
intfns;/*食物种类标识符*/
intfkey;/*游戏区是否有食物标识符*/
intfnew_t;/*投放食物时间分量*/
}FOOD;
/*设置蛇头运动方向*/
voidSetSnakeHeadMove(inttop,intdown,intleft,intright,TCsQueue*st)
{
st->Snakeh.top=top;
st->Snakeh.down=down;
st->Snakeh.left=left;
st->Snakeh.right=right;
}
/*初始化蛇*/
voidinit_TCs(TCsQueue*st)
{
intnt,sx=320,sy=240,size=12;
srand((unsigned)time(NULL));
nt=rand()%4;
st->front=-1;
st->rear=0;
st->Snakeh.x=sx;
st->Snakeh.y=sy;
st->Snakeh.ns=nt;
SetSnakeHeadMove(0,0,0,0,st);
st->size=size;
st->Snakeb[st->rear].left=0;
st->Snakeb[st->rear].right=0;
st->Snakeb[st->rear].top=0;
st->Snakeb[st->rear].down=0;
switch(nt)
{
case0:
st->hx=sx;
st->hy=sy;
st->Snakeh.top=1;
st->Snakeb[st->rear].ns=5;
st->Snakeb[st->rear].top=1;
st->Snakeb[st->rear].x=st->Snakeh.x;
st->Snakeb[st->rear].y=st->Snakeh.y+st->size;
st->Snaket.ns=2;
st->Snaket.x=st->Snakeb[st->rear].x;
st->Snaket.y=st->Snakeb[st->rear].y+st->size;
st->cx=st->Snaket.x;
st->cy=st->Snaket.y+st->size;
break;
case1:
st->hx=sx;
st->hy=sy+size;
st->Snakeh.down=1;
st->Snakeb[st->rear].ns=5;
st->Snakeb[st->rear].down=1;
st->Snakeb[st->rear].x=st->Snakeh.x;
st->Snakeb[st->rear].y=st->Snakeh.y-st->size;
st->Snaket.ns=3;
st->Snaket.x=st->Snakeb[st->rear].x;
st->Snaket.y=st->Snakeb[st->rear].y-st->size;
st->cx=st->Snaket.x;
st->cy=st->Snaket.y-st->size;
break;
case2:
st->hx=sx;
st->hy=sy;
st->Snakeh.left=1;
st->Snakeb[st->rear].ns=4;
st->Snakeb[st->rear].left=1;
st->Snakeb[st->rear].x=st->Snakeh.x+st->size;
st->Snakeb[st->rear].y=st->Snakeh.y;
st->Snaket.ns=0;
st->Snaket.x=st->Snakeb[st->rear].x+st->size;
st->Snaket.y=st->Snakeb[st->rear].y;
st->cx=st->Snaket.x+st->size;
st->cy=st->Snaket.y;
break;
case3:
st->hx=sx+size;
st->hy=sy;
st->Snakeh.right=1;
st->Snakeb[st->rear].ns=4;
st->Snakeb[st->rear].right=1;
st->Snakeb[st->rear].x=st->Snakeh.x-st->size;
st->Snakeb[st->rear].y=st->Snakeh.y;
st->Snaket.ns=1;
st->Snaket.x=st->Snakeb[st->rear].x-st->size;
st->Snaket.y=st->Snakeb[st->rear].y;
st->cx=st->Snaket.x-st->size;
st->cy=st->Snaket.y;
break;
}
st->old_Snakeb[st->rear].ns=st->Snakeb[st->rear].ns;
st->old_Snakeb[st->rear].x=st->Snakeb[st->rear].x;
st->old_Snakeb[st->rear].y=st->Snakeb[st->rear].y;
st->old_Snakeb[st->rear].left=st->Snakeb[st->rear].left;
st->old_Snakeb[st->rear].right=st->Snakeb[st->rear].right;
st->old_Snakeb[st->rear].top=st->Snakeb[st->rear].top;
st->old_Snakeb[st->rear].down=st->Snakeb[st->rear].down;
}
/*获取键盘按键码*/
intget_key()
{
unionREGSrg;
rg.h.ah=0;
int86(0x16,&rg,&rg);
returnrg.h.ah;
}
/*绘制位图*/
voidDrawBit(intx,inty,charmaske[])
{
inti,j,k,n=2,size=12;
for(i=0;i for(j=0;j for(k=0;k<8;k++) { if(j&&k>3) break; if(maske[i*n+j]&(0x80>>k)) { if(FILLC[i*n+j]&(0x80>>k)) putpixel(x+j*8+k,y+i,10); else putpixel(x+j*8+k,y+i,2); } else putpixel(x+j*8+k,y+i,0); } } /*绘制蛇体*/ voidDrawSnake(TCsQueue*st) { inti; DrawBit(st->Snakeh.x,st->Snakeh.y,TCShead[st->Snakeh.ns]); for(st->front=0;st->front<=st->rear;st->front++) DrawBit(st->Snakeb[st->front].x,st->Snakeb[st->front].y,TCSbody[st->Snakeb[st->front].ns]); DrawBit(st->Snaket.x,st->Snaket.y,TCStail[st->Snaket.ns]); DrawBit(st->cx,st->cy,RNULL); st->front=-1; for(i=0;i<3;i++) { delay(50000); } } /*刷新和保存蛇体运动轨迹数据*/ voidSet_Snake(intx,inty,intns,intleft,intright,inttop,intdown,TCsQueue*st) { st->Snakeb[0].x=x; st->Snakeb[0].y=y; st->Snakeb[0].ns=ns; st->Snakeb[0].left=left; st->Snakeb[0].right=right; st->Snakeb[0].top=top; st->Snakeb[0].down=down; for(st->front=1;st->front<=st->rear;st->front++) { st->Snakeb[st->front].ns=st->old_Snakeb[st->front-1].ns; st->Snakeb[st->front].x=st->old_Snakeb[st->front-1].x; st->Snakeb[st->front].y=st->old_Snakeb[st->front-1].y; st->Snakeb[st->front].left=st->old_Snakeb[st->front-1].left; st->Snakeb[st->front].right=st->old_Snakeb[st->front-1].right; st->Snakeb[st->front].top=st->old_Snakeb[st->front-1].top; st->Snakeb[st->front].down=st->old_Snakeb[st->front-1].down; } st->cx=st->Snaket.x; st->cy=st->Snaket.y; st->Snaket.x=st->old_Snakeb[st->rear].x; st->Snaket.y=st->old_Snakeb[st->rear].y; if(st->old_Snakeb[st->rear].left) st->Snaket.ns=0; if(st->old_Snakeb[st->rear].right) st->Snaket.ns=1; if(st->old_Snakeb[st->rear].top) st->Snaket.ns=2; if(st->old_Snakeb[st->rear].down) st->Snaket.ns=3; for(st->front=0;st->front<=st->rear;st->front++) { st->old_Snakeb[st->front].ns=st->Snakeb[st->front].ns; st->old_Snakeb[st->front].x=st->Snakeb[st->front].x; st->old_Snakeb[st->front].y=st->Snakeb[st->front].y; st->old_Snakeb[st->front].left=st->Snakeb[st->front].left; st->old_Snakeb[st->front].right=st->Snakeb[st->front].right; st->old_Snakeb[st->front].top=st->Snakeb[st->front].top; st->old_Snakeb[st->front].down=st->Snakeb[st->front].down; } st->front=-1; DrawSnake(st); } /*描述蛇体运动轨迹*/ voidMove_Snake(TCsQueue*st) { if(st->Snakeh.top) { st->Snakeh.y-=st->size; st->hx=st->Snakeh.x; st->hy=st->Snakeh.y; Set_Snake(st->Snakeh.x,st->Snakeh.y+st->size,5,0,0,1,0,st); } if(st->Snakeh.down) { st->Snakeh.y+=st->size; st->hx=st->Snakeh.x; st->hy=st->Snakeh.y+st->size; Set_Snake(st->Snakeh.x,st->Snakeh.y-st->size,5,0,0,0,1,st); } if(st->Snakeh.left) { st->Snakeh.x-=st->size; st->hx=st->Snakeh.x; st->hy=st->Snakeh.y; Set_Snake(st->Snakeh.x+st->size,st->Snakeh.y,4,1,0,0,0,st); } if(st->Snakeh.right) { st->Snakeh.x+=st->size; st->h
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- WinTCC 语言 贪吃 游戏 程序设计