首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++ 纯 C 实现贪吃蛇小游戏

纯C实现贪吃蛇经典小游戏!

#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");

//清屏createFood

system("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;

}

纯C语言实现贪吃蛇小游戏!

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OTlXQPVYBUj35C2GSW7Yey4g0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券