c语言贪吃蛇图形界面设计,c语言实现,图形化贪吃蛇

承接上篇的扫雷,在分享一个贪吃蛇的代码,w,a,s,d控制方向。

0818b9ca8b590ca3270a3433284dd417.png

其实在写贪吃蛇的时候,代价或许会不懂蛇的尾巴怎么画,这个告诉大家一个技巧,背景融入法,就是一条边画成黑色,相信大家都懂了,相信大家如果在写的时候,可能会有些许疑惑,蛇怎么实现转弯,那么大家可以换一种思维,蛇只有头前进,身体的其他部位都是跟着前一段身体走,这样或许大家就知道怎么写了(array[1]和array[2]),数组紧贴赋值,其实根本不用考虑转弯。

附上代码:

//

//程序名称:贪吃蛇娱乐版 //

//作者: ys//

//最后修改:2014.7.27//

//编辑条件:VC6.0//

//

#include

#include

#include

#include

#define SIZE_ALL_BODY20

#define SIZE_UNIT_BODY20

#define WIDTH480

#define HEIGHT360

int x0,y0;

int m_maxx,m_maxy;

typedef enum//蛇移动的四个方向

{

left, right, up, down

}DIR;

typedef struct//结构体化坐标

{

int x;//x坐标

int y;//y坐标

}COOR;

struct FOOD//定义食物的信息

{

int flag;//食物的状态,1表示没吃,0表示吃了

COOR crd;//食物的坐标

}food;

struct SNAKE//定义蛇的状态信息

{

int body_num;//蛇身多少节

COOR body[SIZE_ALL_BODY];//蛇身每节的坐标

DIR dir;//蛇头方向

}snake;

/******************************************************/

void init_system();//初始化系统

void setfood();//设置食物信息

void draw_food();//画食物

void judge_hit();//判断是否撞击

void eatfood();//蛇吃食物

void snakemove();//蛇的移动

void gameover();//游戏结束

void showsnake();//画蛇

void keyboard();//键盘操作

/*****************************************************/

int main()

{

init_system();

while(1)

{

while(!kbhit())

{

if (!food.flag)

setfood();//判断食物是否被吃

draw_food();//画食物

showsnake();//画蛇

snakemove();//蛇的移动

judge_hit();//蛇是否发生撞击

eatfood();//吃食物

}

keyboard();

}

getch();

return 0;

}

//判断是否撞击身体或者边界

void judge_hit()

{

int i;

if (snake.body[0].x < x0 || snake.body[0].x > x0+WIDTH-SIZE_UNIT_BODY ||//判断撞击边界

snake.body[0].y < y0 || snake.body[0].y > y0+HEIGHT-SIZE_UNIT_BODY)

{

gameover();

}

for (i=snake.body_num-1;i>0;i--)//判断撞击身体

{

if (snake.body[0].x==snake.body[i].x && snake.body[0].y==snake.body[i].y)

{

gameover();

}

}

}

//蛇的移动

void snakemove()

{

int i;

for (i=snake.body_num;i>0;i--)

{

snake.body[i].x=snake.body[i-1].x;

snake.body[i].y=snake.body[i-1].y;

}

switch(snake.dir)

{

case right:

snake.body[0].x+=SIZE_UNIT_BODY;break;

case left:

snake.body[0].x-=SIZE_UNIT_BODY;break;

case up:

snake.body[0].y-=SIZE_UNIT_BODY;break;

case down:

snake.body[0].y+=SIZE_UNIT_BODY;break;

}

Sleep(100);

}

//键盘控制

void keyboard()

{

switch(getch())

{

case 'w':

case 'W':

if (snake.dir!=down)

{

snake.dir=up;

break;

}

case 'a':

case 'A':

if (snake.dir!=right)

{

snake.dir=left;

break;

}

case 's':

case 'S':

if (snake.dir!=up)

{

snake.dir=down;

break;

}

case 'd':

case 'D':

if (snake.dir!=left)

{

snake.dir=right;

break;

}

}

}

//画蛇

void showsnake()

{

int i;

for (i=snake.body_num-1;i>=0;i--)

{

rectangle(snake.body[i].x,snake.body[i].y,snake.body[i].x+SIZE_UNIT_BODY,snake.body[i].y+SIZE_UNIT_BODY);

}

setlinecolor(BLACK);

rectangle(snake.body[snake.body_num].x,snake.body[snake.body_num].y,snake.body[snake.body_num].x+SIZE_UNIT_BODY,snake.body[snake.body_num].y+SIZE_UNIT_BODY);

}

//画食物

void draw_food()

{

int i=0;

i=rand()%4;

switch(i)

{

case 0:setlinecolor(RED);break;

case 1: setlinecolor(GREEN);break;

case 2: setlinecolor(WHITE);break;

case 3: setlinecolor(BLUE);break;

}

i++;

rectangle(food.crd.x,food.crd.y,food.crd.x+SIZE_UNIT_BODY,food.crd.y+SIZE_UNIT_BODY);

}

//设置食物信息

void setfood()

{

srand((unsigned)time(NULL));

food.crd.x=x0+rand()%(WIDTH/SIZE_UNIT_BODY)*SIZE_UNIT_BODY;

food.crd.y=y0+rand()%(HEIGHT/SIZE_UNIT_BODY)*SIZE_UNIT_BODY;

food.flag=1;

}

//蛇吃食物

void eatfood()

{

if (snake.body[0].x==food.crd.x && snake.body[0].y==food.crd.y)

{

snake.body_num++;

setlinecolor(RED);

rectangle(food.crd.x,food.crd.y,food.crd.x+SIZE_UNIT_BODY,food.crd.y+SIZE_UNIT_BODY);

food.flag=0;

}

}

//初始化系统

void init_system()

{

int gdriver=DETECT,gmode;

initgraph(&gdriver,&gmode," ");//初始化图形界面模式

m_maxx=getmaxx();

m_maxy=getmaxy();

x0=(m_maxx-WIDTH)/2;

y0=(m_maxy-HEIGHT)/2;

snake.body_num=1;//初始化蛇的状态

srand((unsigned)time(NULL));

snake.body[0].x=x0+rand()%(WIDTH/SIZE_UNIT_BODY/2)*SIZE_UNIT_BODY;;

snake.body[0].y=y0+rand()%(HEIGHT/SIZE_UNIT_BODY/2)*SIZE_UNIT_BODY;

food.flag=0;

int dir;

dir=rand()%4;

switch(dir)

{

case 0:

snake.dir=right;break;

case 1:

snake.dir=left;break;

case 2:

snake.dir=up;break;

case 3:

snake.dir=down;break;

}

setlinecolor(WHITE);

rectangle(x0-1,y0-1,x0+WIDTH+1,y0+HEIGHT+1);//画游戏框

}

//游戏结束

void gameover()

{

int x,y;

settextstyle(40,40,_T("宋体"));

x=(m_maxx-textwidth("GAME OVER!"))/2;

y=10;

outtextxy(x,y,_T("GAME OVER!"));

getch();

closegraph();

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言实现贪吃蛇的游戏通常涉及到图形界面编程,这可能需要一些特定的库如 Allegro, SDL, 或者使用终端模拟器(如 ncurses)在控制台上绘制字符。为了简单起见,这里我会提供一个基本的控制台版本的贪吃蛇的示例,使用字符来表示蛇的身体和食物。 ```c #include <stdio.h> #include <stdlib.h> #include <conio.h> // Windows下使用,Unix/Linux需替换为`#include <termios.h>` #define SNAKE_SPEED 5 #define SNAKE_LENGTH 10 #define SNAKE_HEAD '@' #define SNAKE_BODY '#' #define FOOD 'O' typedef struct { int x, y; int length; } Snake; Snake snake; int food_x, food_y; void print_board() { for (int i = 0; i < 20; i++) { for (int j = 0; j < 20; j++) { if (i == snake.y && j == snake.x) printf("%c", SNAKE_HEAD); else if (i == food_y && j == food_x) printf("%c", FOOD); else printf("%c", SNAKE_BODY); if ((i + 1) % 10 == 0) printf("\n"); } } printf("\n"); } void move_snake(char direction) { switch (direction) { case 'w': snake.y--; break; case 's': snake.y++; break; case 'a': snake.x--; break; case 'd': snake.x++; break; } // 检查是否撞墙或吃到食物 if (snake.x < 0 || snake.x >= 20 || snake.y < 0 || snake.y >= 20 || snake.body[snake.length - 1].x == snake.x && snake.body[snake.length - 1].y == snake.y) { // 如果撞到边界或自己,游戏结束 printf("Game over!\n"); return; } // 吃到食物时增长蛇身 if (snake.x == food_x && snake.y == food_y) { food_x = rand() % 20; food_y = rand() % 20; snake.length++; } else { // 移动蛇身到头部位置 memmove(&snake.body, &snake.body, sizeof(Snake) * (snake.length - 1)); } snake.body[snake.length - 1].x = snake.x; snake.body[snake.length - 1].y = snake.y; } int main() { srand(time(0)); // 初始化随机数生成器 snake.x = 10; snake.y = 10; snake.length = SNAKE_LENGTH; food_x = rand() % 20; food_y = rand() % 20; while (true) { print_board(); char direction = _getch(); // 获取用户输入,Windows下使用 move_snake(direction); } return 0; } ``` 这段代码创建了一个简单的贪吃蛇游戏,玩家通过方向键来控制蛇的移动。注意,这个版本仅在控制台上运行,并且没有包含完整的游戏循环和用户界面,如果你想制作一个图形化的游戏,你需要使用专门的游戏开发库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值