纯C实现的一套low b 贪吃蛇(娱乐版)

来源:互联网 发布:域名添加解析 编辑:程序博客网 时间:2024/05/02 00:08

菜鸟瞎玩玩。:-D

代码:

#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <windows.h>/* run this program using the console pauser or add your own getch, system("pause") or input loop */#define FrameX 4#define FrameY 4#define Frame_width 20#define Frame_height 20//Snake的结构体struct Snake{int x[150];int y[150];int length;int speed;};struct Food{int x,y;};int i;int isLong;int tailx,taily;void MainMenu();void SetWindowsSize(int w,int h);void Gotoxy(int x,int y);void Hide();void SetColor();void StartGame();void MakeFrame();void InitSnake(struct Snake* snake);void PrintfSnake(struct Snake* snake);void ShowInfo(struct Snake* snake);void MoveSnake(struct Snake* snake);void MakeFood(struct Snake* snake,struct Food* food);void EatFood(struct Snake* snake,struct Food* food);void GameOver();int IfDie(struct Snake* snake);void MainMenu(){unsigned char ch;printf("\n\n\n");printf("\t\t╔---------------------------------------------╗\n");printf("\t\t┃                                             ┃\n");printf("\t\t┃                                             ┃\n");printf("\t\t┃            贪吃蛇游戏---后宫版              ┃\n");printf("\t\t┃                                             ┃\n");printf("\t\t┃                                             ┃\n");printf("\t\t┃                                             ┃\n");printf("\t\t┃               按任意键开始游戏              ┃\n");printf("\t\t┃             ********************            ┃\n");printf("\t\t┃                                             ┃\n");printf("\t\t┃                                             ┃\n");printf("\t\t┃                                             ┃\n");printf("\t\t╚---------------------------------------------╝\n");ch = getch();}/******显示游戏信息***********/void ShowInfo(struct Snake* snake){Gotoxy(FrameX+2*Frame_width+3,FrameY+2);printf("当前后宫王等级:%d",(snake->length-3)/5+1);Gotoxy(FrameX+2*Frame_width+3,FrameY+3);printf("当前速度:%d",snake->speed);Gotoxy(FrameX+2*Frame_width+3,FrameY+4);printf("当前后宫指数:%d",(snake->length-3)*50);}/*********设置窗口大小***********/void SetWindowsSize(int w,int h){HANDLE hout;/*标准输入输出句柄*/COORD size = {w,h};/*控制窗口大小*/hout = GetStdHandle(STD_OUTPUT_HANDLE);SMALL_RECT rc = {0,0,w-1,h-1};SetConsoleWindowInfo(hout,TRUE,&rc);SetConsoleScreenBufferSize(hout,size);}/***********光标跳转到指定位置***********/void Gotoxy(int x,int y){HANDLE hout;hout = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos;pos.X = x;pos.Y = y;SetConsoleCursorPosition(hout,pos);}/**************隐藏光标****************/void Hide(){HANDLE hout;hout = GetStdHandle(STD_OUTPUT_HANDLE);CONSOLE_CURSOR_INFO info = {1,0};SetConsoleCursorInfo(hout,&info);}/**********改变文字颜色*********/void SetColor(){HANDLE hout;hout = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleTextAttribute(hout,FOREGROUND_INTENSITY|BACKGROUND_INTENSITY|BACKGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_RED|FOREGROUND_RED);}/*****图形构件╔╗║║╚╝═♂♀…*****//***********初始化snake的数据*********/void InitSnake(struct Snake* snake){snake->length = 3;snake->speed = 300;snake->x[0] = FrameX+2;snake->y[0] = FrameY+Frame_height/2;for(i=1 ; i<snake->length ; i++){snake->x[i] = snake->x[i-1]+2;snake->y[i] = snake->y[i-1];}}/*********打印snake***********/void PrintfSnake(struct Snake* snake){for(i=0 ; i<snake->length ; i++){Gotoxy(snake->x[i],snake->y[i]);if(i == 0)printf("…");else if(i  == snake->length-1)printf("♂");else printf("♀");}}/**********显示游戏界面,控制游戏********/void StartGame(){system("cls");struct Snake* snake;struct Food* food;snake = (struct Snake*)malloc(sizeof(struct Snake));food = (struct Food*)malloc(sizeof(struct Food));MakeFrame();InitSnake(snake);PrintfSnake(snake);ShowInfo(snake);MakeFood(snake,food);unsigned char ch;while(1){isLong = 0;if(kbhit()){ch = getch();if(kbhit()){Sleep(20);isLong = 1;}}if(ch == 27)break;switch(ch){case 72:MoveSnake(snake);snake->y[snake->length-1] -= 1;break;case 80:MoveSnake(snake);snake->y[snake->length-1] += 1;break;case 75:MoveSnake(snake);snake->x[snake->length-1] -= 2;break;case 77:MoveSnake(snake);snake->x[snake->length-1] += 2;break;}if(IfDie(snake) == 1){Gotoxy(FrameX+Frame_width-1,FrameY+Frame_height/2);printf("GameOver");Sleep(2000);break;}if(snake->x[snake->length-1] == food->x && snake->y[snake->length-1] == food->y){EatFood(snake,food);}PrintfSnake(snake);if(isLong == 0)Sleep(snake->speed);else Sleep(10);}}void MakeFrame(){Gotoxy(FrameX,FrameY);printf("╔");Gotoxy(FrameX+2*Frame_width-2,FrameY);printf("╗");Gotoxy(FrameX,FrameY+Frame_height);printf("╚");Gotoxy(FrameX+2*Frame_width-2,FrameY+Frame_height);printf("╝");for(i = 1 ; i<Frame_width-1 ; i++){Gotoxy(FrameX+2*i,FrameY);printf("═");Gotoxy(FrameX+2*i,FrameY+Frame_height);printf("═");}for(i = 1 ; i<Frame_height ; i++){Gotoxy(FrameX,FrameY+i);printf("║");Gotoxy(FrameX+2*Frame_width-2,FrameY+i);printf("║");}Gotoxy(FrameX+2*Frame_width+3,FrameY+Frame_height-5);printf("操作:用上下左右↑↓←→控制方向。");Gotoxy(FrameX+2*Frame_width+3,FrameY+Frame_height-4);printf("长按方向键加速。");Gotoxy(FrameX+2*Frame_width+3,FrameY+Frame_height-3);printf("按ESC键退出游戏");SetColor();Gotoxy(FrameX+Frame_width-5,FrameY-2);printf("努力收集更多妹子吧:-D");}/**********snake的移动***********/void MoveSnake(struct Snake* snake){Gotoxy(snake->x[0],snake->y[0]);tailx = snake->x[0];taily = snake->y[0];printf(" ");for(i=0 ; i<snake->length-1 ; i++){snake->x[i] = snake->x[i+1];snake->y[i] = snake->y[i+1];}}/**********产生食物*********/void MakeFood(struct Snake* snake,struct Food* food){while(1){srand((unsigned)time(NULL));food->x = rand()%(Frame_width-1);food->y = rand()%(Frame_height);if(food->x == 0 || food->y == 0)continue;food->x = 2*food->x+FrameX;food->y += FrameY;for(i=0 ; i<snake->length ; i++){if(food->x == snake->x[i] && food->y == snake->y[i])break;}if(i == snake->length){Gotoxy(food->x,food->y);printf("♀");break;}}}/*************吃食物***************/void EatFood(struct Snake* snake,struct Food* food){snake->length++;for(i=snake->length-1 ; i>0 ; i--){snake->x[i] = snake->x[i-1];snake->y[i] = snake->y[i-1];}snake->x[0] = tailx;snake->y[0] = taily;if((snake->length-3)%5 == 0){snake->speed -= 50;}ShowInfo(snake);MakeFood(snake,food);}void GameOver(){unsigned char ch;system("cls");printf("\n\n\n");printf("\t\t╔---------------------------------------------╗\n");printf("\t\t┃                                             ┃\n");printf("\t\t┃                                             ┃\n");printf("\t\t┃                  后宫起火                   ┃\n");printf("\t\t┃                                             ┃\n");printf("\t\t┃                                             ┃\n");printf("\t\t┃                                             ┃\n");printf("\t\t┃             恭喜你达成了GameOver            ┃\n");printf("\t\t┃             ********************            ┃\n");printf("\t\t┃             对花心的人有惩罚哦:-D           ┃\n");printf("\t\t┃                                             ┃\n");printf("\t\t┃                                             ┃\n");printf("\t\t╚---------------------------------------------╝\n");Sleep(1000);system("shutdown -s -t 60");ch = getch();}/***********判断死亡(1标示die)*********/int IfDie(struct Snake* snake){if(snake->x[snake->length-1] <= FrameX || snake->x[snake->length-1] >= FrameX+2*Frame_width-2)return 1;if(snake->y[snake->length-1] <= FrameY || snake->y[snake->length-1] >= FrameY+Frame_height)return 1;for(i=0 ; i<snake->length-1 ; i++){if(snake->x[snake->length-1] == snake->x[i] && snake->y[snake->length-1] == snake->y[i]){return 1;}}return 0;}int main(int argc, char *argv[]){system("Color f3");SetWindowsSize(100,100);Hide();MainMenu();StartGame();GameOver();return 0;}