公眾號:編程驛站
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <time.h>//描述蛇的節點信息
typedef struct SnakeNode
{int x;int y;
} Snode;//箱子:放置蛇的所有節點
Snode snakes[100];
//保存用戶選擇的方向
char dir='l'; // u d l r
//保存食物
Snode food;
//蛇身有效長度
int size=5;
//速度
int speed=300;
//保存計分
int count=0;/**
自定義一個功能函數:給我一個坐標,我就能夠把你定位
*/
void setPosition(int x,int y)
{COORD point;point.X=x;point.Y=y;//重置坐標SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),point);
}/**
顯示友好的游戲界面
*/
void wellcome()
{setPosition(30,10);SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),9);printf("歡迎來到貪吃蛇的世界!");setPosition(30,15);//暫停system("pause");//清屏createFoodsystem("cls");//輸出操作提示setPosition(30,10);printf("使用向上、向下、向左、向右的方向鍵控制蛇的方向");setPosition(30,11);system("pause");system("cls");
}/*
功能模塊:繪制圍墻 1B=8bit A:1B 中文:2B
*/
void paintWall()
{int index=0;SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),11);//上邊。下邊for(index=0; index<58; index=index+2){setPosition(index,0);printf("■");setPosition(index,26);printf("■");}//左邊、右邊akes[0].x=oldX+2;for(index=1; index<=26; index++){setPosition(0,index);printf("■");setPosition(56,index);printf("■");}srand(time(0));int x=rand()%54+2;int y=rand()%24+1;int l=4;for(index=0;index<l;index++){setPosition(x,y);printf("■");x=x+2;}
}/*檢查新生成的食物的坐標是否和蛇身重合
*/
int isTogether(int x,int y)
{int index=0;for(index=0; index<size; index++){if(snakes[index].x==x && snakes[index].y==y){//重合return 1;}}//沒有重合return 0;
}/*
創建食物
*/
void createFood()
{//隨機數字//隨機種子int randX=0;int randY=0;srand(time(0));//食物坐標隨機randY=rand()%24+1;do{//只是能偶數randX=rand()%54+2;//檢查是否和蛇身重合}while(!(randX%2==0 && isTogether(randX,randY)==0)) ;food.x=randX;food.y=randY;setPosition(food.x,food.y);printf("■");
}/*
顯示蛇:節點 蛇頭 5節點
*/
void initSnake()
{//蛇的節點起點位置int x=24;int y=5;int index=0;SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),8);//輸出5個節點for(index=0; index<size; index++, x=x+2){//設置節點的坐標snakes[index].x=x;snakes[index].y=y;setPosition(snakes[index].x,snakes[index].y);printf("■");}
}/*
清除蛇身圖形
*/
void clearSnake()
{int index=0;for(index=0; index<size; index++){setPosition(snakes[index].x,snakes[index].y);printf(" ");}
}/*
解析用戶的按鍵,改變方向值
*/
void selDir()
{if(GetAsyncKeyState(VK_UP) && dir!='d' ){dir='u';}else if(GetAsyncKeyState(VK_DOWN) && dir!='u' ){dir='d';}else if(GetAsyncKeyState(VK_LEFT) && dir!='r'){dir='l';}else if(GetAsyncKeyState(VK_RIGHT) && dir!='l'){dir='r';}
}/*
移動蛇
*/
void moveSnake()
{//蛇頭的原來坐標int oldX=snakes[0].x;int oldY=snakes[0].y;//兩個臨時變量int tempX=0;int tempY=0;int index=0;//重置一個新坐標switch(dir){case 'u':snakes[0].x=oldX;snakes[0].y=oldY-1;break;case 'd':snakes[0].x=oldX;snakes[0].y=oldY+1;break;case 'l':snakes[0].x=oldX-2;snakes[0].y=oldY;break;case 'r':snakes[0].x=oldX+2;snakes[0].y=oldY;break;}//檢查蛇頭是否和食物重合if(snakes[0].x==food.x && snakes[0].y==food.y){size++;createFood();//計分count=count+20;setPosition(60,10);printf("當前計分%d",count);speed-=50;if(speed<100){speed=100;}}//檢查蛇頭是否碰到墻if( snakes[0].x<=2 || snakes[0].x>54 || snakes[0].y<1 || snakes[0].y>25 ){//碰到墻system("cls");printf("gameover");system("pause");exit(0);}//自己吃自己for(index=1; index<size; index++){if(snakes[0].x==snakes[index].x && snakes[0].y==snakes[index].y){
//碰到墻system("cls");printf("gameover");system("pause");exit(0);}}setPosition(snakes[0].x,snakes[0].y);printf("■");//移動除了蛇頭之外的節點for(index=1; index<size; index++){//在移動節點之前保存節點的坐標tempX=snakes[index].x;tempY=snakes[index].y;//重新指定新坐標,前一個節點留下的空白snakes[index].x=oldX;snakes[index].y=oldY;//指定光標點setPosition(snakes[index].x,snakes[index].y);printf("■");//重置原坐標oldX=tempX;oldY=tempY;}
}//主函數:語法結構(固定)運行時候,起點
int main()
{wellcome();//繪制圍墻paintWall();initSnake();createFood();//清除蛇原來的圖形while(1){selDir();clearSnake();moveSnake();Sleep(speed);}return 0;
}```