C++實現(xiàn)簡單貪吃蛇小游戲
本文實例為大家分享了C++實現(xiàn)簡單貪吃蛇小游戲的具體代碼,供大家參考,具體內(nèi)容如下
1 貪吃蛇游戲原理
1.1 構造蛇身:定義一個坐標數(shù)組,存放的是蛇的每一節(jié)蛇身所在的坐標位置。
1.2 移動效果:每次移動時,將每一節(jié)蛇身(蛇頭除外)依次往前移動一節(jié),去掉蛇的最后一節(jié),確定蛇的方向
1.3 移動判斷:每次移動時,判斷蛇頭是否觸碰食物,如果碰到了食物,只進行前移蛇身和增加蛇頭的操作,不進行擦除蛇尾的操作
2游戲設計
2.1 游戲首頁
2.2 開始游戲
2.3 退出游戲
3.游戲實現(xiàn)
3.1 游戲首頁
void fist_show() { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN); cout << " 貪吃蛇游戲 " << endl; cout << " " << endl; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN); cout << "*————————————*" << endl; cout << "* *" << endl; cout << "* *" << endl; cout << "* 1,游戲說明 *" << endl; cout << "* 2,開始游戲 *" << endl; cout << "* 3,結束游戲 *" << endl; cout << "* *" << endl; cout << "* *" << endl; cout << "*————————————*" << endl; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); system("pause"); system("cls"); }
游戲說明介紹
void game_instruction() { color(5); cout << "*********游戲說明如下:***********" << endl; color(3); cout << "* *" << endl; cout << "* 使用↑.↓.←.→控制蛇的移動 *" << endl; cout << "* 不能咬到自己 *" << endl; cout << "* 不能撞到墻 *" << endl; cout << "* 按到空格鍵暫停游戲 *" << endl; color(5); cout << "**********************************" << endl; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); system("pause"); system("cls"); }
3.2 游戲開始
// 食物的坐標 struct food{ int x; int y; }food1; //蛇的相關屬性 struct snake { int speed;//蛇移動的速度 int len;//蛇的當前長度 int x[snake_length];//組成蛇身的每一個*中x的坐標 int y[snake_length];//組成蛇身的每一個*中y的坐標 }snake1;
將光標移動到控制臺的(x,y)坐標點處
//將光標移動到控制臺的(x,y)坐標點處 void gotoxy(int x, int y) { COORD coord; coord.X = x; coord.Y = y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); }
繪制地圖
void creat_map() { //打印上下邊框 for (int i = 0; i <= wide; i += 1) { //將光標移動依次到(i,0)處打印上邊框 gotoxy(i, 0); cout<<"*"; gotoxy(i, hight); cout << "*"; } //打印左右邊框 for (int i = 1; i < hight; i++) { //將光標移動依次到(0,i)處打印左邊框 gotoxy(0, i); cout << "*"; gotoxy(wide, i); cout << "*"; } }
初始化蛇身和食物
void init() { //隨機生成初始食物 food1.x = rand() % (wide - 2) + 2; food1.y = rand() % (hight - 2) + 1; gotoxy(food1.x, food1.y); cout<<"★"; //初始化蛇的屬性 snake1.len = 4; snake1.speed = 200; //在屏幕中間生成蛇頭 snake1.x[0] = wide / 2 + 2;//x坐標為偶數(shù) snake1.y[0] = hight / 2; //打印蛇頭 gotoxy(snake1.x[0], snake1.y[0]); cout<<"■"; //生成初試的蛇身 for (int i = 1; i < snake1.len; i++) { //蛇身的打印,縱坐標不變,橫坐標為上一節(jié)蛇身的坐標值+2 snake1.x[i] = snake1.x[i - 1] + 2; snake1.y[i] = snake1.y[i - 1]; gotoxy(snake1.x[i], snake1.y[i]); printf("■"); } }
讓蛇移動
void snake_move() { int pre_key = key; key = _getch(); *changeFlag為0表明此時沒有吃到食物,因此每走一步就要擦除掉蛇尾,以此營造一個移動的效果 *為1表明吃到了食物,就不需要擦除蛇尾,以此營造一個蛇身增長的效果 */ if (changeFlag == 0) { gotoxy(snake1.x[snake1.len - 1], snake1.y[snake1.len - 1]); cout<<" ";//在蛇尾處輸出空格即擦去蛇尾 } //將蛇的每一節(jié)依次向前移動一節(jié)(蛇頭除外) for (int i = snake1.len - 1; i > 0; i--) { snake1.x[i] = snake1.x[i - 1]; snake1.y[i] = snake1.y[i - 1]; } //蛇當前移動的方向不能和前一次的方向相反,比如蛇往左走的時候不能直接按右鍵往右走 //如果當前移動方向和前一次方向相反的話,把當前移動的方向改為前一次的方向 if (pre_key == 4 && key == 5) { key = 4; } if (pre_key == 5 && key == 4) { key = 5; } if (pre_key == 6 && key == 7) { key = 6; } if (pre_key == 7 && key == 6) { key = 7; } //判斷蛇頭應該往哪個方向移動 switch (key) { case 4: snake1.x[0] -= 2;//往左 break; case 5: snake1.x[0] += 2;//往右 break; case 6: snake1.y[0]--;//往上 break; case 7: snake1.y[0]++;//往下 break; } //打印出蛇頭 gotoxy(snake1.x[0], snake1.y[0]); printf("■"); gotoxy(wide - 2, 0); //由于目前沒有吃到食物,changFlag值為0 changeFlag = 0; return; }
創(chuàng)造食物
void createFood() { if (snake1.x[0] == food1.x && snake1.y[0] == food1.y)//蛇頭碰到食物 { //蛇頭碰到食物即為要吃掉這個食物了,因此需要再次生成一個食物 while (1) { int flag = 1; food1.x = rand() % (wide - 4) + 2; food1.y = rand() % (hight - 2) + 1; //隨機生成的食物不能在蛇的身體上 for (int i = 0; i < snake1.len; i++) { if (snake1.x[i] == food1.x && snake1.y[i] == food1.y) { flag = 0; break; } } } //繪制食物 gotoxy(food1.x, food1.y); printf("★"); snake1.len++;//吃到食物,蛇身長度加1 sorce += 10;//每個食物得10分 snake1.speed -= 5;//隨著吃的食物越來越多,速度會越來越快 changeFlag = 1;//很重要,因為吃到了食物,就不用再擦除蛇尾的那一節(jié),以此來造成蛇身體增長的效果 } return; }
判斷蛇的規(guī)則
//判斷蛇運動是否符合規(guī)則 bool snakeStatus() { //蛇頭碰到上下邊界,游戲結束 if (snake1.y[0] == 0 || snake1.y[0] == hight) return false; //蛇頭碰到左右邊界,游戲結束 if (snake1.x[0] == 0 || snake1.x[0] == wide) return false; //蛇頭碰到蛇身,游戲結束 for (int i = 1; i < snake1.len; i++) { if (snake1.x[i] == snake1.x[0] && snake1.y[i] == snake1.y[0]) return false; } return true; }
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
C語言動態(tài)內(nèi)存分配函數(shù)的實現(xiàn)
這篇文章主要介紹了C語言動態(tài)內(nèi)存分配函數(shù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-05-05