功能超级丰富的彩色贪吃蛇,有道具,有等级!
生活随笔
收集整理的這篇文章主要介紹了
功能超级丰富的彩色贪吃蛇,有道具,有等级!
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
彩色的貪吃蛇實現,功能強大。有等級模塊。道具功能,后面有效果預覽。先上代碼:
console.h
#include <windows.h>//顏色定義 #define FWHITE FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE //白色前景 #define FRED FOREGROUND_INTENSITY|FOREGROUND_RED //紅色前景 #define FBLUE FOREGROUND_INTENSITY|FOREGROUND_BLUE //藍色前景 #define FGREEN FOREGROUND_INTENSITY|FOREGROUND_GREEN //綠色前景 #define FYELLOW FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN //黃色前景 #define FPURPLE FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_BLUE //紫色前景 #define FBLACK NULL //黑色前景#define BBLACK NULL //黑色背景 #define BWHITE BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE //白色背景 #define BRED BACKGROUND_INTENSITY|BACKGROUND_RED //紅色背景 #define BBLUE BACKGROUND_INTENSITY|BACKGROUND_BLUE //藍色背景 #define BGREEN BACKGROUND_INTENSITY|BACKGROUND_GREEN //綠色背景 #define BYELLOW BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN //黃色背景 #define BPURPLE BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_BLUE //紫色背景void xSetCursor(int x,int y) {COORD c;c.X = x - 1;c.Y = y - 1;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c); } void HideCursor() {CONSOLE_CURSOR_INFO cursor_info = {1, 0}; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info); } void xSetColor(WORD color) {SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color); }/* int SetConsoleTitle(char *title) */int ShowConsoleInfo() {int ret;HANDLE hWin = GetStdHandle(STD_OUTPUT_HANDLE);CONSOLE_SCREEN_BUFFER_INFO csbiInfo;ret = GetConsoleScreenBufferInfo(hWin, &csbiInfo);if (ret){printf("Buffer Size: [X]%d - [Y]%d\n", csbiInfo.dwSize.X, csbiInfo.dwSize.Y);printf("Cursor Pos : [X]%d - [Y]%d\n", csbiInfo.dwCursorPosition.X, csbiInfo.dwCursorPosition.Y);printf("Attributes : %d\n", csbiInfo.wAttributes);printf("Current Win: [L]%d - [R]%d - [T]%d - [B]%d\n", \csbiInfo.srWindow.Left, csbiInfo.srWindow.Right, csbiInfo.srWindow.Top, csbiInfo.srWindow.Bottom);printf("Maximum Win: [X]%d - [Y]%d\n", csbiInfo.dwMaximumWindowSize.X, csbiInfo.dwMaximumWindowSize.Y);puts("Over.");}return ret; }setting.h
#include <windows.h>//界面圖案設定 char sharp[][3] = {"","■","□","◎","◆"}; #define SnakeHead 0 #define SnakeBody 1 #define Wall 1 #define White 2 #define SnakeEnd 3 #define SFood 4 #define StartSnakeLen 8//游戲設定 #define MAP_WIDTH 24 #define MAP_HIGH 22 #define CTRLWNDLEFT 5 #define CTRLWNDWIDTH 10 #define CTRLWNDHIGH MAP_HIGH #define MINSPEED 400 #define MAXSPEED 200//蛇定義 struct Snake {int x,y;struct Snake *next,*front; }; struct Snake *Snake_Head;struct Snake *Snake_End =NULL; struct Snake *Snake_OldEnd =NULL; struct Snake Food; struct Snake *ExtraFood[5]; struct Snake temp;enum direct {LEFT,RIGHT,UP,DOWN}; enum direct Direct;//食物 enum styfood {FOOD_NORMAL,FOOD_GETDEF,FOOD_FIVEFOOD}; enum styfood FoodStyle; enum styfood ExtraFoodStyle[5];//定義屬性 long int Score = 0; int IsPause = 0; int EatNum = 0; int LEVEL = 0; long int EXP = 0; int SPEED = MINSPEED;int Tool_Defense = 0; int Tool_FiveFood = 0;/*初始化數據*/ void Init() {Snake_Head = (struct Snake*)malloc(sizeof(struct Snake));int i; for (i = 0 ; i < 5; i++){ExtraFood[i] = (struct Snake*)malloc(sizeof(struct Snake));ExtraFood[i]->next = NULL;}temp.x=0;temp.y=0;Score = 0;IsPause = 0;EatNum = 0;LEVEL = 0;EXP = 0;SPEED = MINSPEED;Direct = RIGHT;Tool_Defense = 10;Tool_FiveFood = 10; }snake.h
#include<stdio.h> #include<conio.h> #include<stdlib.h> #include<time.h> #include<string.h> #include"setting.h" #include"console.h"/*函數聲明*//* 開場畫面 */ void BeginImage(); /*初始化,畫蛇,畫食物*/ void Start(); /*移動。包含蛇的描繪*/ void Move(); /*畫地圖*/ void Draw_Map(); /*畫所有蛇*/ void Draw_Snake(); /*輸出成績*/ void Draw_Score(); /*畫食物*/ void Draw_Food(); /*畫控制區域*/ void Draw_CtrlWnd(); /*輸出游戲中提示*/ void Draw_Play(); /*輸出升級提示*/ void Draw_UpLevel(); /*輸出工具信息*/ void Draw_Tool(); /*推斷是否死亡*/ int IsDeath(); /*推斷輸入是否是游戲控制按鍵*/ int IsGameCtrl(unsigned char ch); /*生成食物*/ int CreateFood(int count); /*食物被吃,包含畫食物*/ int EatFood(); // /*對蛇的操控*/ int Snake_Ctrl(unsigned char ch); /*蛇不死*/ int Snake_Defense(); /*游戲暫停*/ void Game_Pause(); /*游戲結束*/ void Game_Over(); /*計算并輸出分數*/ void CalcScore(int num); /*清空控制區域*/ void Cls_CtrlWnd(); /*控制區域閃爍型提示*/ void CtrlWnd_Flash(char *a,char *b,int loc,int);void BeginImage() { //開場畫面HideCursor();xSetColor(FGREEN);printf(" \n\n /^\/^\\\ \n");printf(" ◇_|__| ◇|\\ \n");printf(" \\/ ~ 〓 \_/ \\\ \n");printf(" 按 \\____|________/ \\\ \n");printf(" 任 \_______\\\ \n");printf(" 意 `\ \ \\ \\\ \n");printf(" 鍵 | | 貪 \\\ \n");printf(" 進 / / 吃 \\\\ \n");printf(" 入 / / 蛇 \\\\\ \n");printf(" 貪 / / \\ \\\ \n");printf(" 吃 / / \\ \\\ \n");printf(" 蛇 / / _----_ \\ \\\ \n");printf(" 世 / / _-~ ~-_ \ | |\ \n");printf(" 界 ( ( _-~ _--_ ~-_ _\/ |\ \n");printf(" ! \\ ~-____-~ _-~ ~-_ ~-_-~ /\ \n");printf(" ~-_ _-~ ~-_ _-~ \ \n");printf(" ~--______-~ ~-___-~\ \n");printf(" \n");int t = getch();if (t == 0 || t==224) getch(); //特殊輸入會輸入兩個字符,如F1~F12和控制鍵system("cls"); }void Start() { Snake_Head->x = MAP_WIDTH/3*4 - 1 ; //蛇頭坐標Snake_Head->y = MAP_HIGH / 4*1;Snake_Head->front = NULL;struct Snake *ps = Snake_Head, *p;int m;for (m = 2; m <= StartSnakeLen; m++) //蛇身坐標{p = (struct Snake *)malloc(sizeof(struct Snake));p->x = MAP_WIDTH/3*4 - m*2 +1;p->y = MAP_HIGH / 4*1;p->next = NULL;p->front = ps;ps->next = p;ps = p;}Snake_End = Snake_Head;while(Snake_End->next != NULL)Snake_End = Snake_End->next;Draw_Map(); Draw_CtrlWnd();Draw_Snake();Draw_Score();Draw_Tool();Draw_Play();xSetColor(FPURPLE);xSetCursor(MAP_WIDTH/2*2-7,MAP_HIGH/2);printf(" 隨意鍵開始! ");int t = getch();if (t == 0 || t==224) getch(); //特殊輸入會輸入兩個字符,如F1~F12和控制鍵xSetColor(FGREEN);xSetCursor(MAP_WIDTH/2*2-7,MAP_HIGH/2);for (m = 1 ; m <= 8; m++)printf("%2s",sharp[White]);srand(time(NULL));CreateFood(0); Draw_Food();} void Draw_Map() { //描繪地圖xSetColor(FGREEN);int m,n;for (m = 1; m <= MAP_HIGH; m++){for (n = 1; n <= MAP_WIDTH; n++)printf("%s",sharp[White]);xSetCursor(1,m+1);}for (m = 1; m <= MAP_HIGH; m++){xSetCursor(1,m);printf("%s",sharp[Wall]);xSetCursor(MAP_WIDTH * 2 - 1,m);printf("%s",sharp[Wall]);}for (m = 1; m <= MAP_WIDTH; m++){xSetCursor(m * 2 - 1,1);printf("%s",sharp[Wall]);xSetCursor(m * 2 - 1,MAP_HIGH);printf("%s",sharp[Wall]);} } void Draw_Snake() { //畫所有蛇xSetColor(FRED);struct Snake *ps = Snake_Head;for (;ps != NULL; ps = ps->next){xSetCursor(ps->x , ps->y);if (ps == Snake_Head)printf("%s",sharp[SnakeHead]);else if (ps->next == NULL)printf("%s",sharp[SnakeEnd]);elseprintf("%s",sharp[SnakeBody]);} } int IsDeath() {struct Snake *ps = Snake_Head ;switch(Direct) //與蛇身相撞{case LEFT:for (;ps != NULL; ps = ps->next)if ((Snake_Head->y == ps->y) && (Snake_Head->x - 2 == ps->x) )return 1;if (Snake_Head->x - 2 <= 2)return 1;break;case RIGHT:for (;ps != NULL; ps = ps->next)if ((Snake_Head->y == ps->y) && (Snake_Head->x + 2 == ps->x) )return 1;if (Snake_Head->x + 2 >= MAP_WIDTH*2-1)return 1;break;case UP:for (;ps != NULL; ps = ps->next)if ((Snake_Head->y - 1 == ps->y) && (Snake_Head->x == ps->x) )return 1;if (Snake_Head->y - 1 <= 1)return 1;break;case DOWN:for (;ps != NULL; ps = ps->next)if ((Snake_Head->y + 1 == ps->y) && (Snake_Head->x == ps->x) )return 1;if (Snake_Head->y + 1 >= MAP_HIGH)return 1;break;}return 0; }void Move() { //移動struct Snake *ps = (struct Snake*)malloc(sizeof(struct Snake)); //初始化新蛇頭switch(Direct){case LEFT:ps->x = Snake_Head->x - 2;ps->y = Snake_Head->y ;break;case RIGHT:ps->x = Snake_Head->x + 2;ps->y = Snake_Head->y ;break;case UP:ps->x = Snake_Head->x ;ps->y = Snake_Head->y - 1 ;break;case DOWN:ps->x = Snake_Head->x ;ps->y = Snake_Head->y + 1;break;}ps->front = NULL;ps->next = Snake_Head;Snake_Head->front = ps;Snake_Head = ps;//填補地圖xSetColor(FGREEN); //地圖顏色xSetCursor(Snake_End->x,Snake_End->y); printf("%2s",sharp[White]); //畫蛇xSetColor(FRED); //蛇顏色xSetCursor(Snake_Head->x,Snake_Head->y); //畫蛇頭printf("%2s",sharp[SnakeHead]);xSetCursor(Snake_Head->next->x,Snake_Head->next->y); //畫第二節蛇身printf("%2s",sharp[SnakeBody]);xSetCursor(Snake_End->front->x,Snake_End->front->y); //畫蛇尾printf("%2s",sharp[SnakeEnd]);Snake_End = Snake_End->front;free(Snake_End->next); //刪除最后一個節點Snake_End->next = NULL; } int CreateFood(int count) { //生成食物int Success = 0;struct Snake *ps;int num,i;if (count == 0){while(!Success){Food.x = rand()%(MAP_WIDTH - 3) * 2 + 3;Food.y = rand()%(MAP_HIGH - 2) + 2 ;for (ps = Snake_Head; ps != NULL; ps = ps->next)if ((ps->x == Food.x) && (ps->y == Food.y)){Success = 0;break;}if (ps == NULL)Success = 1;}if (Success) //食物樣式{num = rand()%16;if (num == 1)FoodStyle = FOOD_GETDEF;else if (num == 2)FoodStyle = FOOD_FIVEFOOD;elseFoodStyle = FOOD_NORMAL;}}else{for (i = 0; i < 5; i++){Success = 0;while(!Success){ //隨機食物位置ExtraFood[i]->x = rand()%(MAP_WIDTH - 3) * 2 + 3;ExtraFood[i]->y = rand()%(MAP_HIGH - 2) + 2 ;for (ps = Snake_Head; ps != NULL; ps = ps->next)if ((ps->x == ExtraFood[i]->x) && (ps->y == ExtraFood[i]->y)){Success = 0;break;}if (ps == NULL)Success = 1;}if (Success) //食物樣式{ExtraFood[i]->next = &temp; //避免NULL值num = rand()%20;if (num == 1)ExtraFoodStyle[i] = FOOD_GETDEF;else if (num == 2)ExtraFoodStyle[i] = FOOD_FIVEFOOD;elseExtraFoodStyle[i] = FOOD_NORMAL;}}}return Success; }int EatFood() {int success = 0;struct Snake *ps = (struct Snake*)malloc(sizeof(struct Snake));if (Snake_Head->x == Food.x && Snake_Head->y == Food.y){//食物被吃ps->x = Food.x;ps->y = Food.y;ps->next = Snake_Head;ps->front = NULL;Snake_Head->front = ps;Snake_Head = ps;//生成食物CreateFood(0);//描繪食物xSetColor(FWHITE);xSetCursor(Food.x,Food.y);printf("%2s",sharp[SFood]);success = 1;if (FoodStyle == FOOD_GETDEF)Tool_Defense++;if (FoodStyle == FOOD_FIVEFOOD)Tool_FiveFood++;}int i;for (i = 0; i < 5; i++) //額外食物{if (ExtraFood[i]->next != NULL){if (Snake_Head->x == ExtraFood[i]->x && Snake_Head->y == ExtraFood[i]->y){ps = (struct Snake*)malloc(sizeof(struct Snake));ps->x = ExtraFood[i]->x;ps->y = ExtraFood[i]->y;ps->next = Snake_Head;ps->front = NULL;Snake_Head->front = ps;Snake_Head = ps;if (ExtraFoodStyle[i] == FOOD_GETDEF)Tool_Defense++;if (ExtraFoodStyle[i] == FOOD_FIVEFOOD)Tool_FiveFood++;ExtraFood[i]->next = NULL;success = 1;}}}Draw_Tool();return success; }int Snake_Ctrl(unsigned char ch) { switch(ch) //方向改變返回1 用于Sanke_Defense(){case 224:Snake_Ctrl(getch());break;case 72:case 119:if (Direct != DOWN )Direct = UP;return 1;case 80:case 115:if (Direct != UP)Direct = DOWN;return 1;case 77:case 100:if (Direct != LEFT)Direct = RIGHT;return 1;case 75:case 97:if (Direct != RIGHT)Direct = LEFT;return 1;case 32:IsPause = 1;break;case 49:if (Tool_FiveFood > 0){CreateFood(5);Draw_Food();Tool_FiveFood--;Draw_Tool();}default: while(kbhit()){ if (IsGameCtrl(ch))Snake_Ctrl(getch());else ch = getch();}}return 0; } int Snake_Defense() {if (Tool_Defense > 0){CtrlWnd_Flash("撞車了!","無敵護罩開啟!",4,1);CtrlWnd_Flash("撞車了!","無敵護罩開啟!",4,1);CtrlWnd_Flash("撞車了!","無敵護罩開啟!",4,1);CtrlWnd_Flash("趕緊跑!","換個方向繼續!",6,1);CtrlWnd_Flash("趕緊跑!","換個方向繼續!",6,0);while(IsDeath()){if (Snake_Ctrl(getch()) && !IsDeath()) break;}CtrlWnd_Flash(" "," ",6,0);Tool_Defense--;Draw_Play();Draw_Tool();return 1;}return 0; }void Draw_Score() {xSetColor(FGREEN);xSetCursor(MAP_WIDTH * 2 + CTRLWNDLEFT + 4, 3);printf("等級:%8d",LEVEL);xSetCursor(MAP_WIDTH * 2 + CTRLWNDLEFT + 4, 4);if (Score == 0)printf("經驗:%8d",EXP);elseprintf("經驗:%6d/%d",EXP,(LEVEL+1)*30);xSetCursor(MAP_WIDTH * 2 + CTRLWNDLEFT + 4, 5);printf("吞噬:%8d",EatNum);xSetCursor(MAP_WIDTH * 2 + CTRLWNDLEFT + 4, 6);printf("分數:%8d",Score);} void Draw_CtrlWnd() { //畫控制面板int m,n;//xSetColor(BBLACK|FBLUE);xSetCursor(MAP_WIDTH*2 + CTRLWNDLEFT,1);for (n = 1; n <= CTRLWNDWIDTH; n++){printf("%2s",sharp[Wall]);}xSetCursor(MAP_WIDTH*2 + CTRLWNDLEFT , CTRLWNDHIGH);for (n = 1; n <= CTRLWNDWIDTH; n++){printf("%2s",sharp[Wall]);}for (m = 1; m <= CTRLWNDHIGH; m++){xSetCursor(MAP_WIDTH*2 + CTRLWNDLEFT, m);printf("%2s",sharp[Wall]);xSetCursor(MAP_WIDTH*2 + CTRLWNDLEFT + CTRLWNDWIDTH*2, m );printf("%2s",sharp[Wall]);} }int IsGameCtrl(unsigned char ch) {switch(ch){case 49: //1case 97: //a case 100: //dcase 115: //scase 119: //wcase 224: //控制case 72: //上case 75: //左case 80: //下case 77: //右case 32: //空格return 1;default:return 0;} } void Game_Pause() {int m;xSetColor(FPURPLE);xSetCursor(MAP_WIDTH/2*2-6,MAP_HIGH/2);printf(" 暫停中! ");while(IsPause){CtrlWnd_Flash("暫停中!","按隨意鍵繼續!",4,1);if (kbhit()){if (getch() == 224) getch();IsPause = 0;}}xSetColor(FGREEN);xSetCursor(MAP_WIDTH/2*2-7,MAP_HIGH/2);for (m = 1 ; m <= 8; m++)printf("%2s",sharp[White]);Draw_Snake();Draw_Play(); }void Game_Over() {Cls_CtrlWnd();Draw_Score();xSetColor(FPURPLE);xSetCursor(MAP_WIDTH/2*2-10,MAP_HIGH/2);printf(" GAME OVER! SCORE = %d ",Score);CtrlWnd_Flash("已陣亡!","按回車再來一把!",9,0);xSetCursor(MAP_WIDTH*2 + CTRLWNDLEFT + 3,CTRLWNDHIGH - 12);printf("終于得分: %d",Score);while(getch() != 13);Cls_CtrlWnd(); }void CalcScore(int num) {Score= Score + num*5 + rand()%3;EatNum++;EXP = EXP + (LEVEL + 1)*3 + num*5 + rand()%4;if (EXP >= (LEVEL+1)*30) Draw_UpLevel();while (EXP >= (LEVEL+1)*30) {EXP = EXP - (LEVEL+1)*30;LEVEL++;if (EXP < 0 )EXP = 0;if (SPEED - 10 > MAXSPEED)SPEED = SPEED - 10;}Draw_Score();} void Draw_Play() {CtrlWnd_Flash("游戲中!","按空格鍵暫停!",4,0); }void Draw_Food() {//描繪食物xSetColor(FWHITE);xSetCursor(Food.x,Food.y);printf("%2s",sharp[SFood]);int i;for (i=0; i<5; i++){if (ExtraFood[i]->next != NULL){xSetColor(FWHITE);xSetCursor(ExtraFood[i]->x,ExtraFood[i]->y);printf("%2s",sharp[SFood]);}} } void Cls_CtrlWnd() {int m,n;//xSetColor(BBLACK);for (m = 2; m < CTRLWNDHIGH; m++){xSetCursor(MAP_WIDTH*2 + CTRLWNDLEFT + 2 , m);for (n = 2; n < CTRLWNDWIDTH; n++)printf("11");} } void Draw_UpLevel() { CtrlWnd_Flash(" "," ",4,0);CtrlWnd_Flash("升級了!","速度有所提升!",7,1);CtrlWnd_Flash("升級了!","速度有所提升!",7,1);CtrlWnd_Flash("游戲中!","按空格鍵暫停!",4,0);}void Draw_Tool() {xSetColor(FGREEN);xSetCursor(MAP_WIDTH*2 + CTRLWNDLEFT + 4,8);printf("道具: ");if (Tool_Defense > 0){xSetCursor(MAP_WIDTH*2 + CTRLWNDLEFT + 7,9);printf("無敵護罩:%-4d",Tool_Defense);}if (Tool_FiveFood > 0){xSetCursor(MAP_WIDTH*2 + CTRLWNDLEFT + 4,10);printf("[1]食物爆發:%-4d",Tool_FiveFood);}if (Tool_Defense <= 0 && Tool_FiveFood <= 0){xSetCursor(MAP_WIDTH*2 + CTRLWNDLEFT + 11,8);printf("無");CtrlWnd_Flash(" "," ",CTRLWNDHIGH - 10,0);}}/*控制區域閃爍型提示*/ void CtrlWnd_Flash(char *a,char *b,int loc,int isflash) {int t;xSetColor(FGREEN);xSetCursor(MAP_WIDTH*2 + CTRLWNDLEFT + 3,CTRLWNDHIGH - 1 - loc);printf("%s",a);if (b != NULL){xSetCursor(MAP_WIDTH*2 + CTRLWNDLEFT + 3,CTRLWNDHIGH - loc);printf("%s",b);}if (isflash){Sleep(500);xSetCursor(MAP_WIDTH*2 + CTRLWNDLEFT + 3,CTRLWNDHIGH - 1 - loc);t = strlen(a);for (; t > 0 ; t--)printf(" ");if (b != NULL){xSetCursor(MAP_WIDTH*2 + CTRLWNDLEFT + 3,CTRLWNDHIGH - loc);t = strlen(b);for (; t > 0 ; t--)printf(" ");}Sleep(500);} }main.c
/*wsad或方向鍵控制上下左右取消多線程修正死亡時鉆入墻中修正與自身相撞漏洞修正非法輸入時失控 增加開始畫面 增加控制面板顯示區域 */ #include"snake.h" int main() {SetConsoleTitle("貪吃蛇V3.0 QQ:836663997 WSAD或方向鍵控制 1鍵使用道具");BeginImage();while(1) //一次循環一次游戲 {/*游戲初始準備*/system("cls");Init();Start();while(1) //游戲主體 {Move(); Sleep(SPEED); if (kbhit()) Snake_Ctrl(getch());if (EatFood()) CalcScore(1);if (IsPause) Game_Pause();if (IsDeath())if (Snake_Defense()) ;else break; }Game_Over();}return 0; }預覽圖:
本文轉自mfrbuaa博客園博客,原文鏈接:http://www.cnblogs.com/mfrbuaa/p/5230847.html,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的功能超级丰富的彩色贪吃蛇,有道具,有等级!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hadoop 伪分布式 配置文件详情
- 下一篇: css选择器 nth-child