CC++语言贪吃蛇源码.docx
- 文档编号:10856596
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:20
- 大小:19.37KB
CC++语言贪吃蛇源码.docx
《CC++语言贪吃蛇源码.docx》由会员分享,可在线阅读,更多相关《CC++语言贪吃蛇源码.docx(20页珍藏版)》请在冰点文库上搜索。
CC++语言贪吃蛇源码
注意:
本源代码包含
环境:
WINDOWS7VC6.0
程序清单:
库文件MYFILE.H
/***************************************************************************************************
FileName:
MYFILE.H
Copyright:
ModuleName:
CPU:
Inteli7
RTOS:
CreatDate:
2017/1/13
Author:
Yang
AbstractDescription:
C++、C实用函数
****************************************************************************************************/
#ifndef_MYFILE_
#define_MYFILE_
#include
#include
voidintroduce()
{
printf("欢迎使用!
MYFILE.H\n");
}
/*********************************C++常用类******************************/
template
classSTACK
{
private:
inttop;
T_STACKstackspace[100];
public:
STACK()
{
top=-1;
}
voidPUSH(T_STACKx)
{
if(top>=100-1)
cout<<"STACKOVERFLOW"< else {top++; stackspace[top]=x; } } T_STACKPOP() { T_STACKx; if(top<-1) {top=-1;cout<<"STACKEMPTY"< x=stackspace[top]; top--; returnx; } }; template classLIST { private: intpoint_in; intpoint_out; T_Listlistspace[100]; public: LIST() { point_in=-1; point_out=-1; } voidINList(T_Listx) { point_in=(point_in+1)%100; listspace[point_in]=x; } T_ListOUTList() { T_Listx; point_out=(point_out+1)%100; x=listspace[point_out]; returnx; } voidshowList() { inti=0; for(i=point_out+1;i<=point_in;i++) cout< } }; /**************************C语言通用数据结构********************************/ /***************************C语言控制台显示*********************************/ #include #definexystep(15) #defineIMAGE_X(450) #defineIMAGE_Y(450) //初始化UI界面 voidUI_init() { initgraph(IMAGE_X,IMAGE_Y); settextcolor(LIGHTGREEN); setbkcolor(BLACK); } //display_rectange(坐标轴x,坐标轴y,要显示的字符串,颜色); voiddisplay_str(intx,inty,char*s,intcolor) {x=(x)*xystep; y=(y)*xystep; switch(color) { case1: settextcolor(BLACK);break; case2: settextcolor(LIGHTBLUE);break; case3: settextcolor(LIGHTGREEN);break; case4: settextcolor(LIGHTCYAN);break; case5: settextcolor(LIGHTRED);break; case6: settextcolor(LIGHTMAGENTA);break; case7: settextcolor(YELLOW);break; case8: settextcolor(WHITE);break; case9: settextcolor(BROWN);break; case10: settextcolor(LIGHTGRAY);break; case11: settextcolor(RED);break; default: settextcolor(WHITE); } outtextxy(x,y,s); } //使用printf在指定位置输出字符串(WIN32API) voidWIN32display(intx,inty,char*c)//在x,y显示一个字符串 { //RECTrect; COORDpos; HANDLEhOutput; pos.X=x; pos.Y=y; hOutput=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(hOutput,pos); printf("%s",c); } #endif //源程序 /*************************************************************************************************** FileName: 贪吃蛇 Copyright: ModuleName: CPU: Inteli7 RTOS: CreatDate: 2017/1/19 Author: Yang AbstractDescription: 小游戏制作 编译环境: VisualC++6.0绿色版 ****************************************************************************************************/ #include #include #include #include #include #include /*****************************函数和类声明******************************/ voidUI(); voidCreatfood(); classSQUARE; /*****************************一些宏***********************************/ #defineBUILD_COLOR5//建筑物颜色 #defineSTEP20000//速度 #defineTIMR_REPAIR0//时间量修复(系统键盘输入等待偏差) #defineSNAKE_COLOR3//蛇的身体颜色 #defineFOOD_COLOR4//食物的颜色 /*****************************一些全局变量****************************/ staticintkey_vaule='U'; staticintkey_vaule_2='D';//key_vaule_2是key_vaule的一个备份 staticintSCORE=0; staticSQUARE*Snake; staticSQUARE*Build; staticSQUARE*Food; staticintEND=0; staticinttime_step=0; /*****************************节点类定义******************************/ classSQUARE//一个小方块类 { public: intx_location;//x坐标【列坐标】 inty_location;//y坐标 intcolor; chardischa[5]; intnature;//0: 隐身1: 砖块2: 蛇3: 食物 SQUARE*NEXT; SQUARE(char*s,intx=-1,inty=-1,intcolor_in=2,intnature=0) { x_location=x; y_location=y; color=color_in; strcpy(discha,s); NEXT=NULL; } ~SQUARE() {//注意: 链表在销毁时,不能随意对其中的节点删除NEXT指针 //因为NEXT指针指向的,恰好就是下一个节点 //而这个类参与组成链表,所以不能在析构函数里面写deleteNEXT; //而其他的地方创建的节点(如vIew),凡是运行完毕跳出循环都NEXT归了NULL; //又或者本来就不能删掉(NextHead,Snake头节点,Build整条链,New,Food) //所以这个析构函数其实不必写 } voiddisplay() { display_str(x_location,y_location,discha,color); } voideraser() { display_str(x_location,y_location," ",color); } }; /*****************************子函数定义*****************************/ voidDisplay(SQUARE*X)//展示链表: Display(头节点) { SQUARE*vIew; vIew=newSQUARE(" "); vIew->NEXT=X; while(vIew->NEXT! =NULL) { vIew->NEXT->display(); vIew->NEXT=vIew->NEXT->NEXT; } deletevIew; vIew=NULL; } voidSnake_Move(intdirection,SQUARE*food)//蛇的移动[带有判断能力] {intCut=1; charscore[20]={'\0'}; //----------------------增加蛇的头---------------------- SQUARE*NextHead; NextHead=newSQUARE(" ",0,0,0,0); if(direction==1)//上 { NextHead->x_location=Snake->x_location; NextHead->y_location=Snake->y_location-1; } if(direction==2)//下 { NextHead->x_location=Snake->x_location; NextHead->y_location=Snake->y_location+1; } if(direction==3)//左 { NextHead->x_location=Snake->x_location-1; NextHead->y_location=Snake->y_location; } if(direction==4)//右 { NextHead->x_location=Snake->x_location+1; NextHead->y_location=Snake->y_location; } NextHead->nature=3; strcpy(NextHead->discha,"●"); NextHead->color=SNAKE_COLOR; NextHead->NEXT=Snake; strcpy(Snake->discha,"⊙"); Snake=NextHead; //---------------------------尝试割掉蛇的尾巴[带判断]----------------- SQUARE*vIew; vIew=newSQUARE(" ",0,0,0,0); vIew->NEXT=Snake; if(food->x_location==Snake->x_location&&food->y_location==Snake->y_location) {Cut=0;SCORE++;Creatfood();itoa(SCORE,score,10);display_str(27,10,score,3);} if(Cut) { while(vIew->NEXT->NEXT->NEXT! =NULL) { vIew->NEXT=vIew->NEXT->NEXT; } vIew->NEXT->NEXT->eraser(); delete(vIew->NEXT->NEXT); vIew->NEXT->NEXT=NULL; } //-----------是否失败? --------------------- vIew->NEXT=Snake->NEXT; while(vIew->NEXT! =NULL)//咬到自己? 失败! { if(vIew->NEXT->x_location==Snake->x_location&&vIew->NEXT->y_location==Snake->y_location) {display_str(7,12,"ENDTHEGAME! ! ",5);END=1;gotoend;}//游戏失败 else vIew->NEXT=vIew->NEXT->NEXT; } vIew->NEXT=Build->NEXT;//咬到建筑物? 失败! while(vIew->NEXT! =NULL) { if(vIew->NEXT->x_location==Snake->x_location&&vIew->NEXT->y_location==Snake->y_location) {display_str(7,12,"ENDTHEGAME! ! ",5);END=1;gotoend;}//游戏失败 else vIew->NEXT=vIew->NEXT->NEXT; } Display(Snake); end: deletevIew; vIew=NULL; } voidCreatfood() { deleteFood;//先释放,再分配,才能得到新的数据空间 Food=newSQUARE("★",rand()%20+1,rand()%20+5,FOOD_COLOR,3); Food->NEXT=NULL; SQUARE*vIew; vIew=newSQUARE(" ",0,0,0,0); vIew->NEXT=Snake; while(vIew->NEXT! =NULL)//防止食物出在蛇的身上 { if(vIew->NEXT->x_location==Food->x_location&&vIew->NEXT->y_location==Food->y_location) Creatfood(); else vIew->NEXT=vIew->NEXT->NEXT; } Food->display(); deletevIew; vIew=NULL; } voidkey_deal(SQUARE*Food) { if(kbhit())//kbhit(): 检测当前是否有按键按下非阻塞函数 { key_vaule=getch(); switch(key_vaule) { case'A': case'a': if(key_vaule_2! ='D'&&key_vaule_2! ='d'){key_vaule_2=key_vaule;time_step=STEP;}else{key_vaule='U';time_step+=(TIMR_REPAIR);}break; case'D': case'd': if(key_vaule_2! ='A'&&key_vaule_2! ='a'){key_vaule_2=key_vaule;time_step=STEP;}else{key_vaule='U';time_step+=(TIMR_REPAIR);}break; case'S': case's': if(key_vaule_2! ='W'&&key_vaule_2! ='w'){key_vaule_2=key_vaule;time_step=STEP;}else{key_vaule='U';time_step+=(TIMR_REPAIR);}break; case'w': case'W': if(key_vaule_2! ='S'&&key_vaule_2! ='s'){key_vaule_2=key_vaule;time_step=STEP;}else{key_vaule='U';time_step+=(TIMR_REPAIR);}break; case'U': break;//U: 不做反应 default: ; } } else {time_step--; key_vaule='U'; if(time_step<=0)//自动下降 { key_vaule=key_vaule_2; time_step=STEP; } } if(key_vaule! ='U') switch(key_vaule) { case'A': case'a': Snake_Move(3,Food);break; case'D': case'd': Snake_Move(4,Food);break; case'S': case's': Snake_Move(2,Food);break; case'w': case'W': Snake_Move(1,Food);break; case'U': break;//U: 不做反应 default: ; } } voidUI()//用户问好界面 {UI_init(); display_str(23,10,"SCORE",7); display_str(27,10,"0 ",3); display_str(1,0,"YWQ: 贪吃蛇平台WINDOWS_7VC6.0",3); display_str(1,1,"欢迎各路大神讨论C/C++的学习",4); display_str(24,20,"W: 向上",8); display_str(24,21,"S: 向下",8); display_str(24,22,"A: 向左",8); display_str(24,23,"D: 向右",8); } /*****************************主函数执行******************************/ voidmain() {inti=0; UI(); srand((unsigned)time(NULL)); SQUARE*New; //----------------游戏前的建筑工事------------------ //建立链表1: 建筑物 SQUARE*Current; Build=newSQUARE(" ",0,0,3,0);//Build: 头结点 Current=newSQUARE(" ",0,0,3,0); Current->NEXT=Build;//Current指向最后一个节点 Build->NEXT=NULL; //扩建链表 for(i=1;i<21;i++) { New=newSQUARE("■",i,4,BUILD_COLOR,1); New->NEXT=NULL; Current->NEXT->NEXT=New; C
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CC 语言 贪吃 源码
![提示](https://static.bingdoc.com/images/bang_tan.gif)