实例介绍
【实例简介】C 经典贪吃蛇小游戏【有源代码】
彩色界面,无需图形库!
【实例截图】
等。。。【许多情况】
【核心代码】
int main() { int olddirection='w'; //初始键盘信号 int newdirection =0;//获取键盘信号 init();//初始化 setmouth(60, 0); setcolour(0xF0); printf("\n得分:"); printf("%d\n", snacklength - 3); printf("请切换为英文输入法\n"); printf("W A S D键分别表示:上 左 下 右\n"); while (1) { if (_kbhit()) { //检测缓冲区中是否有数据 newdirection = tolower(_getch()); //将缓冲区中的数据以字符的形式读出 if (newdirection == 27) { break; } else { //获取小蛇新的移动方向 newdirection=movedire(olddirection, newdirection); if (newdirection != olddirection) { olddirection = newdirection; } } } screenRefresh(newdirection); } return 0; } //更新得分 void updategoal() { setcolour(0xF0); setmouth(60, 0); printf("\n得分:%d", snacklength - 3); if(snacklength==33) { MessageBox(NULL,"恭喜你,成功得到“探花”称号","恭喜你,成功得到“探花”称号",MB_OK); } if(snacklength==53) { MessageBox(NULL,"恭喜你,成功得到“榜眼”称号","恭喜你,成功得到“榜眼”称号",MB_OK); } if(snacklength==103) { MessageBox(NULL,"恭喜你,成功得到“状元”称号","恭喜你,成功得到“状元”称号",MB_OK); } if(snacklength==153) { MessageBox(NULL,"恭喜你,欢迎再来游玩","恭喜你,欢迎再来游玩",MB_OK); exit(0); } } //碰撞检测 int checksnack(int newdirection) { switch (newdirection) { case 'w': if ((show[SnackSite[snackhead].x - 1][SnackSite[snackhead].y].kind)==1) { snackdie(); return 0; }else if((show[SnackSite[snackhead].x - 1][SnackSite[snackhead].y].kind) == 4) { snackdie(); return 0; } else if ((show[SnackSite[snackhead].x - 1][SnackSite[snackhead].y].kind) == 3) { return 1; } else { return 2; } break; case 's': if ((show[SnackSite[snackhead].x 1][SnackSite[snackhead].y].kind) == 1) { snackdie(); return 0; } else if ((show[SnackSite[snackhead].x 1][SnackSite[snackhead].y].kind) == 4) { snackdie(); return 0; } else if ((show[SnackSite[snackhead].x 1][SnackSite[snackhead].y].kind) == 3) { return 1; } else { return 2; } break; case 'a': if ((show[SnackSite[snackhead].x][SnackSite[snackhead].y-1].kind) == 1) { snackdie(); return 0; } else if ((show[SnackSite[snackhead].x][SnackSite[snackhead].y-1].kind) == 4) { snackdie(); return 0; } else if ((show[SnackSite[snackhead].x][SnackSite[snackhead].y-1].kind) == 3) { return 1; } else { return 2; } break; case 'd': if ((show[SnackSite[snackhead].x][SnackSite[snackhead].y 1].kind) == 1) { snackdie(); return 0; } else if ((show[SnackSite[snackhead].x][SnackSite[snackhead].y 1].kind) == 4) { snackdie(); return 0; } else if ((show[SnackSite[snackhead].x][SnackSite[snackhead].y 1].kind) == 3) { return 1; } else { return 2; } break; } } //创建新食物 void newfood() { srand((unsigned)time(NULL)); FoodSite.x = rand() % 38 1; FoodSite.y = rand() % 38 1; } //刷新屏幕 void screenRefresh(int newdirection) { int re = 0; int i = 0; re = checksnack(newdirection); snackmove(newdirection, re); background(); show[FoodSite.x][FoodSite.y] = food; for (i = 0; i <= snackhead; i ) { if (i == snackhead) { show[SnackSite[i].x][SnackSite[i].y] = snack; show[SnackSite[i].x][SnackSite[i].y].colour = 0x75; } else { show[SnackSite[i].x][SnackSite[i].y] = snack; } } showing(); if (re == 1) { snacklength ; updategoal(); newfood(); } } /********************************************* 获取最新的方向 **********************************************/ int movedire(int olddirection, int newdirection) { if (newdirection == 'w' || newdirection == 'a' || newdirection == 's' || newdirection == 'd') { return newdirection; } else { return olddirection; } } /********************************** 展示最新的show *********************************/ void showing() { int line, lie; for (line = 0; line < MaxLine; line ) { for (lie = 0; lie < MaxLie; lie ) { setmouth(line, lie); setcolour(show[line][lie].colour); printf("%s",show[line][lie].display); } } } /****************************************** 小蛇死亡 *******************************************/ void snackdie() { setmouth(20, 5); printf("Game over! 按任意键重新开始游戏!"); getch(); system("cls"); int olddirection='w'; //初始键盘信号 int newdirection =0;//获取键盘信号 init();//初始化 setmouth(60, 0); setcolour(0xF0); printf("\n得分:"); printf("%d\n", snacklength - 3); printf("请切换为英文输入法\n"); printf("W A S D键分别表示:上 左 下 右\n"); while (1) { if (_kbhit()) { //检测缓冲区中是否有数据 newdirection = tolower(_getch()); //将缓冲区中的数据以字符的形式读出 if (newdirection == 27) { break; } else { //获取小蛇新的移动方向 newdirection=movedire(olddirection, newdirection); if (newdirection != olddirection) { olddirection = newdirection; } } } screenRefresh(newdirection); } } //小蛇移动 void snackmove(int newdirection,int re) { int i = 0; switch (newdirection) { case 'w': for (i = 0; i < snackhead;i =1) { SnackSite[i].x = SnackSite[i 1].x; SnackSite[i].y = SnackSite[i 1].y; } SnackSite[snackhead].x -= 1; if (re == 1) { snackhead = 1; SnackSite[snackhead].x = SnackSite[snackhead-1].x-1; SnackSite[snackhead].y = SnackSite[snackhead - 1].y; } break; case 's': for (i = 0; i < snackhead; i =1) { SnackSite[i].x = SnackSite[i 1].x; SnackSite[i].y = SnackSite[i 1].y; } SnackSite[snackhead].x = 1; if (re == 1) { snackhead = 1; SnackSite[snackhead].x = SnackSite[snackhead - 1].x 1; SnackSite[snackhead].y = SnackSite[snackhead - 1].y; } break; case 'a': for (i = 0; i < snackhead; i =1) { SnackSite[i].x = SnackSite[i 1].x; SnackSite[i].y = SnackSite[i 1].y; } SnackSite[snackhead].y -= 1; if (re == 1) { snackhead = 1; SnackSite[snackhead].x = SnackSite[snackhead - 1].x ; SnackSite[snackhead].y = SnackSite[snackhead - 1].y-1; } break; case 'd': for (i = 0; i < snackhead; i =1) { SnackSite[i].x = SnackSite[i 1].x; SnackSite[i].y = SnackSite[i 1].y; } SnackSite[snackhead].y = 1; if (re == 1) { snackhead = 1; SnackSite[snackhead].x = SnackSite[snackhead - 1].x; SnackSite[snackhead].y = SnackSite[snackhead - 1].y 1; } break; } } //初始食物 void startfood() { FoodSite.x = 5; FoodSite.y = 10; show[5][10] = food; } //初始小蛇 void startsnack() { SnackSite[0].x = 35; SnackSite[0].y = 13; SnackSite[1].x = 35; SnackSite[1].y = 12; SnackSite[2].x = 35; SnackSite[2].y = 11; show[35][11] = snack; show[35][11].colour = 0x75; show[35][12] = snack; show[35][13] = snack; } /******************************* 初始化生成show结构体数组 *******************************/ void init() { //设置窗口大小 system("mode con:cols=80 lines=43"); //隐藏光标 hidemouth(); //生成背景图 background(); //创建初始食物 startfood(); //创建初始小蛇蛇体 startsnack(); //显示 showing(); } /************************************** 生成背景图 **************************************/ void background() { int line, lie; for (line = 0; line < MaxLine; line ) { for (lie = 0; lie < MaxLie; lie ) { setmouth(line, lie); if (lie == 0 || lie == MaxLie-1 || line == 0 || line == MaxLine-1) { show[line][lie] = wall; } else { show[line][lie] = livearea; } } } } /******************************** 定义光标位置 *********************************/ void setmouth(int x, int y) { COORD coord; coord.X = y*2; //第3列 coord.Y = x; //第3行 //获取控制台缓冲区句柄 HANDLE ConsoleHandle = GetStdHandle(STD_OUTPUT_HANDLE); //设置光标位置 SetConsoleCursorPosition(ConsoleHandle, coord); } //设置种类的颜色 void setcolour(int a) { HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hConsole, a); } //隐藏光标 void hidemouth() { HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFO CursorInfo; GetConsoleCursorInfo(handle, &CursorInfo);//获取控制台光标信息 CursorInfo.bVisible = 0; //隐藏控制台光标 SetConsoleCursorInfo(handle, &CursorInfo);//设置控制台光标状态 }
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论