文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

用C语言实现贪吃蛇小游戏

2024-04-02 19:55

关注

本文实例为大家分享了C语言实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下

实现功能

蛇最开始三节,向右移动。用户可以通过按上下左右来控制蛇的移动,食物随机产生,蛇吃到食物后蛇的身体会变长。蛇撞墙或者撞到自己身体后,游戏结束。

怎么实现

要实现一个贪吃蛇小游戏,首先要想清楚游戏里有什么,怎样实现功能。

很明显游戏中只有两样东西,蛇和食物。
所以要建立蛇和食物信息,然后将蛇和食物进行初始化,在将蛇和食物画出来。

实现的功能有:

 1. 蛇的移动
 2. 按键控制蛇的移动
 3. 食物的产生
 4. 蛇吃食物后蛇身体变长
 5. 游戏的结束

用结构体建立蛇和食物的信息


struct COOR{//位置,x,y坐标
 int x;
 int y;
};

struct SNAKE{//蛇的基础信息
 int size;//节数
 int speed;//运动速度
 char dir;//运动方向
 struct COOR xy[MAX];//位置
}snakes;

struct FOOD{//食物信息
 struct COOR fooddir;//食物位置
 int flag;//判断食物是否被吃掉,1未被吃掉,0被吃掉
}food;

实现功能的函数:

蛇:


void snakeInit(){//初始化蛇的信息
void drawSnake(){//画蛇
void moveSnake(){//蛇的移动
void coorSnake(){//按键控制蛇的运动方向

食物:


void initFood(){//初始化食物的信息
void drawFood(){//画食物

其它:


int gameOver(){//游戏结束情况
void gameInit(){//初始化窗口范围

代码


#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<graphics.h>
#include<conio.h>
#include<Windows.h>

#define MAX 200
HWND hwnd = NULL;

enum DIR{//枚举移动方向
 UP,
 DOWN,
 LEFT,
 RIGHT,
};

struct COOR{//位置,x,y坐标
 int x;
 int y;
};

struct SNAKE{//蛇的基础信息
 int size;//节数
 int speed;//运动速度
 char dir;//运动方向
 struct COOR xy[MAX];//位置
}snakes;

struct FOOD{//食物信息
 struct COOR fooddir;//食物位置
 int flag;//判断食物是否被吃掉,1未被吃掉,0被吃掉
}food;

void snakeInit(){//初始化蛇的信息
 snakes.size = 3;//开始节数
 snakes.dir = RIGHT;//开始运动方向
 snakes.speed = 10;
 int i = 0;
 for (; i < snakes.size; i++){//每一节书的位置,注意将第一节作为头
  snakes.xy[i].x = 40 - 10 * i;
  snakes.xy[i].y = 10;
 }

}

void drawSnake(){//画蛇
 int i = 0;
 for (; i < snakes.size; i++){
 setlinecolor(BLACK);//画线的颜色
 setfillcolor(RED);//填充色
 //fillrectangle(snakes.xy[i].x, snakes.xy[i].y, snakes.xy[i].x + 10, snakes.xy[i].y+10);//矩形
 fillcircle(snakes.xy[i].x, snakes.xy[i].y, 5);//圆形
 }


}

void moveSnake(){//蛇的移动
 //snakes.xy[0].x++;

 int i = 0;
 for (i = snakes.size-1; i >0; i--){//蛇身跟着舌头运动
  snakes.xy[i].x = snakes.xy[i-1].x;
  snakes.xy[i].y = snakes.xy[i-1].y;
 }
 switch (snakes.dir){
 case UP:
  snakes.xy[0].y-=snakes.speed;
  break;
 case DOWN:
   snakes.xy[0].y+=snakes.speed;
  break;
 case LEFT:
   snakes.xy[0].x-=snakes.speed;
  break;
 case RIGHT:
   snakes.xy[0].x+=snakes.speed;
  break;
 default:
  break;
 }


}

void coorSnake(){//按键控制蛇的运动方向
 if (_kbhit()){ //等待获取按键
  char c = _getch();//获得按键
  switch (c){
  case 72:
  case'w':
   if (snakes.dir != DOWN){
    snakes.dir = UP;
   }
   break;
  case 80:
  case's':
   if (snakes.dir != UP){
    snakes.dir = DOWN;
   }
   break;
  case 75:
  case'a':
   if (snakes.dir != RIGHT){
    snakes.dir = LEFT;
   }
   break;
  case 77:
  case'd':
   if (snakes.dir != LEFT){
    snakes.dir = RIGHT;
   }
   break;
  default:
   break;
  }
 }
}
void initFood(){//初始化食物的信息
 food.flag = 1;
 while (1){
START:
  food.fooddir.x = rand() % 63 * 10;//食物位置随机
  food.fooddir.y = rand() % 47 * 10;
  for (int i = 0; i < snakes.size; i++){//防止食物生成在蛇身上。
   if (food.fooddir.x == snakes.xy[i].x&&food.fooddir.y == snakes.xy[i].y){
    goto START;
   }
   else{
    break;
   }
  }
  break;
 }
}

void drawFood(){//画食物
 //food.fooddir.x = 100;
 //food.fooddir.y = 200;
 setlinecolor(BLACK);
 setfillcolor(RED);
 fillcircle(food.fooddir.x, food.fooddir.y, 5);

}
void eatFood(){//蛇吃食物
 if (snakes.xy[0].x - food.fooddir.x <= 5 && snakes.xy[0].y - food.fooddir.y <= 5 \
  && food.fooddir.x - snakes.xy[0].x <= 5 && food.fooddir.y - snakes.xy[0].y <= 5 && food.flag == 1){
  food.flag = 0;
  snakes.size++;
 }

}

int gameOver(){//游戏结束情况
 if (snakes.xy[0].x < 5 || snakes.xy[0].y <= 0 || snakes.xy[0].x > 635 || snakes.xy[0].y > 478){
  MessageBox(hwnd, "GAME OVER!","你撞墙了!", MB_OK);
  return 1;
 }
 for (int i = 1; i < snakes.size; i++){
  if (snakes.xy[0].x == snakes.xy[i].x&&snakes.xy[0].y == snakes.xy[i].y){
   MessageBox(hwnd, "GAME OVER!", "你撞了自己",MB_OK);
   return 1;
  }
 }
 return 0;
}


void gameInit(){
 hwnd=initgraph(640, 480);//设置窗口大小
 setbkcolor(GREEN);//设置窗口颜色
}


int main(){
 srand((unsigned long)time(NULL));//生成随机数
 gameInit();
 cleardevice();//刷新窗口
 snakeInit();
 initFood();
 while (1){
  cleardevice();
  if (food.flag == 0){
   initFood();
  }
  drawFood();
  drawSnake();
  coorSnake();
  eatFood();
  moveSnake();
  //eatFood();
  if (gameOver()){
   break;
  }
  //stopGame();
  Sleep(100);
 }
 getchar();//防止闪屏
 closegraph();
 system("pause");
 return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯