欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C语言开发实现贪吃蛇游戏

程序员文章站 2022-04-21 12:40:02
本文实例为大家分享了c语言实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下1、最好用vs运行2、用到的函数有:_kbhit _getch easyx图形库内一系列函数3、蛇身与食物用矩形画的代码如下...

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

1、最好用vs运行
2、用到的函数有:_kbhit _getch easyx图形库内一系列函数
3、蛇身与食物用矩形画的

代码如下:

#include<stdio.h>
#include<graphics.h>   //easyx头文件
#include<conio.h>
#include<time.h>
/********************设置各种属性**********************/
//坐标属性
typedef struct point {
 int x, y;
}pyint;
//蛇
struct snake {
 pyint xy[100];    //蛇的每节坐标放到数组中
 int position;    //方向
 int num;       //长度
}snake;
//食物
struct food{
 pyint fdxy;
 int flag;      //是否存在
 int grade;      //成绩
}food;
//枚举:方向
//也可用宏 #define
enum position
{
 up, down, left, right
};
/**********************对蛇的操作*****************************/
//初始化蛇
//蛇的每节为 10x10填充的矩形
void initsnake()
{
 snake.xy[0].x = 0;
 snake.xy[0].y = 0;
 //数组第一个元素为蛇头
 snake.xy[1].x = 10;
 snake.xy[1].y = 0;
 snake.xy[2].x = 20;
 snake.xy[2].y = 0;
 snake.position = right; //方向  (随便给)
 snake.num = 3;      //数量 (随便给)
}
//画蛇
void drawsnake()
{
 for (int i = 0; i < snake.num; i++)
 {
 setlinecolor(black);
 setfillcolor(rgb(rand() % 255, rand() % 255, rand() % 255));
 fillrectangle(snake.xy[i].x, snake.xy[i].y, snake.xy[i].x + 10, snake.xy[i].y + 10);
 }
}
//使蛇动起来
/*
  蛇头每向前动一格,其后紧随蛇头:
  我们把蛇的每节坐标放到数组里(蛇头坐标放在数组的第一个),移动时,只需使蛇头(数组第一个元素)改变,其后与前面交换;
*/
void movesnake()
{
 for (int i = snake.num; i > 0; i--) {
 snake.xy[i].x = snake.xy[i - 1].x;
 snake.xy[i].y = snake.xy[i - 1].y;  //使每个元素向前移动
 }
 switch (snake.position)
 {
 case up:          
 snake.xy[0].y -= 10;
 break;
 case down:
 snake.xy[0].y += 10;
 break;
 //上下移动 x坐标不发生改变
 case left:
 snake.xy[0].x -= 10;
 break;
 case right:
 snake.xy[0].x += 10;
 break;
  //左右移动 y坐标不发生改变
 }
}
/******************************按键操作*****************************************/
//当蛇向上运动时,按向下键无效(其他三个相同)
void keydown()
{
 char ch = _getch();
 switch (ch)
 {
 case 'w':
 case 'w':
 case 72:              //小键盘上的“向上”
 if (snake.position != down)  //是否向下
  snake.position = up;
 break;
 case 's':
 case 's':
 case 80:              //小键盘上的“向下”
 if (snake.position != up)   //是否向上
  snake.position = down;
 break;
 case 'a':
 case 'a':
 case 75:             //小键盘上的“向左”
 if (snake.position != right) //是否向右
  snake.position = left;
 break;
 case 'd':
 case 'd':
 case 77:              //小键盘上的“向右”
 if (snake.position != left)  //是否向左
  snake.position = right;
 break;
 }
}
/******************************食物操作**************************************/
//初始化食物
void initfood()
{
 food.fdxy.x = rand() % 60 * 10;        
 food.fdxy.y = rand() % 40 * 10;           //把食物的坐标控制在游戏界面内
 food.flag = 1; //1代表存在食物
 //food.grade = 0;
 for (int i = 0; i < snake.num; i++) {
 if (food.fdxy.x == snake.xy[i].x&&food.fdxy.y == snake.xy[i].y) //如果食物出现在蛇身上,重新产生x y的值
 {
  food.fdxy.x = rand() % 60 * 10;
  food.fdxy.y = rand() % 40 * 10;
 }
 }
}
//画食物
void drawfood()
{
 setlinecolor(black);
 setfillcolor(rgb(rand() % 255, rand() % 255, rand() % 255));         
 fillrectangle(food.fdxy.x, food.fdxy.y, food.fdxy.x + 10, food.fdxy.y + 10);
}
/*************************************吃食物*************************************************/
void eatfood()
{
 if (snake.xy[0].x == food.fdxy.x&&snake.xy[0].y == food.fdxy.y) {
 snake.num++;
 food.flag = 0;      //食物存在的标记(1:存在 0;不存在)
 food.grade += 10;    //每吃一个食物分数加10 (每个食物是10分,可随意改变)
 }
}
/*************************************显示分数*************************************************/
void putgrade()
{
 char str[20] = " ";
 sprintf_s(str, "greade: %d", food.grade);
 settextcolor(red);             //设置字体颜色
 outtextxy(500, 50, str);
}
/***********************************游戏结束***************************************************/
//当蛇头撞墙(蛇头撞上自身)
//只分析一种情况
int gameover()
{
 if (snake.xy[0].x > 600 || snake.xy[0].x < 0 | snake.xy[0].y>400 || snake.xy[0].y < 0) //撞墙
 {
 initgraph(800, 600);
 settextcolor(red);
 outtextxy(600, 400, "你撞墙了");
 settextcolor(yellow);
 settextstyle(50, 50, "楷体");   //字体样式
 outtextxy(200, 250, "game over"); //指定位置输出字符串
 return 1;
 }
 return 0;
}
/*****************************************************************************************/
int main()
{
 initgraph(600, 400);
 setbkcolor(black); //背景颜色
 cleardevice();         //清屏:刷新屏幕
 srand((unsigned int)time(null)); //随机数种子
 initsnake();
 drawsnake();
 while (1)
 {
 cleardevice(); //清屏
 movesnake();
 drawsnake();
 if (food.flag == 0) {
  initfood();
 }
 drawfood();
 if (_kbhit()) {   //_kbhit: 检测是否有按键动作
  keydown();
 }
 if (gameover()) {  //若函数返回1:结束游戏
  break;
 }
 eatfood();
 putgrade();
 sleep(100);  //延长时间 (即蛇移动的速度)
 }
 _getch();     //防止闪屏
 closegraph();   //关闭窗口
 return 0;
}
/**********************************************************/
//rgb(rand() % 255, rand() % 255, rand() % 255) 在三基色范围内随机产生
//记得安装easyx插件

更多有趣的经典小游戏实现专题,分享给大家:

c++经典小游戏汇总

python经典小游戏汇总

python俄罗斯方块游戏集合

javascript经典游戏 玩不停

java经典小游戏汇总

javascript经典小游戏汇总

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

相关标签: C语言 贪吃蛇