c语言贪吃蛇游戏问题描述,贪吃蛇小游戏的几个问题

已结贴√

问题点数:20 回复次数:2

ca56232b3bbedf9a539d07f37fffb99a.gif

3144d8b7615c79d9f638db40d5689d26.gif

a218af6549b45ee526caf607ebff1358.gif

0f8df0e29816ae721419de940fb833d1.gif

贪吃蛇小游戏的几个问题

下面这个代码中

1.蛇是如何实现移动的?

2.蛇是如何死的?

3.蛇所吃的食物是怎么生成的?

#include "graphics.h"

#include

#define MAP_W 40

#define MAP_H 30

const int GCOLOR[] = {DARKGRAY, GREEN, RED};

int gw, gh;

struct SNAKE {

int dir, head, inc, tail;

int pool[MAP_W* MAP_H];

} game;

inline void drawAt( const int &i ) {

int x = ( i % MAP_W ) * gw, y = ( i / MAP_W ) * gh;

setfillcolor( GCOLOR[game.pool[i] >> 16] );

bar( x, y, x + gw, y + gh );

}

void newFruit( void ) {

int nf;

while ( game.pool[nf = random( MAP_W * MAP_H )] >> 16 );

game.pool[nf] = 0x20000, drawAt( nf );

}

int moveSnake( const int dx, const int dy, const bool u = false ) {

if ( u && dx + ( game.dir & 3 ) == 1 && dy + ( game.dir >> 2 ) == 1 ) return 1;

int nh;

if ( dx && !dy ) {

nh = game.head % MAP_W + dx;

if ( nh < 0 || nh >= MAP_W ) return 0;

nh = game.head + dx;

} else {

nh = game.head / MAP_W + dy;

if ( nh < 0 || nh >= MAP_H ) return 0;

nh = game.head + dy * MAP_W;

}

int s = game.pool[nh] >> 16;

if ( s == 1 ) return 0;

if ( s == 2 ) game.inc += 5, newFruit();

if ( game.inc > 0 ) --game.inc;

else {

game.tail = game.pool[s = game.tail] & 0xffff;

game.pool[s] = 0, drawAt( s );

}

game.pool[game.head] |= nh;

game.pool[game.head = nh] = 0x10000, drawAt( nh );

game.dir = ( dx + 1 ) | ( ( dy + 1 ) << 2 );

return 1;

}

void gameInit( void ) {

int data[] = {6, 0, 2, 0, 0x10000};

memset( game.pool, 0, sizeof( game.pool ) );

memmove( &game, data, sizeof( data ) );

}

void gameScene( void ) {

PIMAGE img = newimage();

getimage(img, "界面.png",600,600);

putimage(0, 0, img);

setfillcolor( GREEN );

bar( 0, 0, gw, gh );

newFruit();

for ( int c = -1; is_run(); delay_fps( 60 ), --c ) {

while ( kbhit() ) {

int key = getch() | 0x20;

if ( key == ( 27 | 0x20 ) ) return;

if ( key == 'a' || key == 'd' ) {

if ( !moveSnake( ( ( key - 'a' ) >> 1 << 1 ) - 1, 0, true ) ) return;

} else if ( key == 's' || key == 'w' ) {

if ( !moveSnake( 0, 1 - ( ( key - 's' ) >> 2 << 1 ), true ) ) return;

}

}

if ( c < 0 ) {

if ( !moveSnake( ( game.dir & 3 ) - 1, ( game.dir >> 2 ) - 1 ) ) return;

c = 20;

}

}

}

int jiemian()

{

initgraph( 600, 600 );

PIMAGE img = newimage();

getimage(img, "界面.png",600,600);

putimage(0, 0, img);

key_msg k = {0};

for ( ; is_run(); delay_fps(120))

{

mouse_msg msg={0};

if (mousemsg())

{

msg = getmouse();

if(msg.is_down()&&msg.x>=50&&msg.x<=200&&msg.y>=350&&msg.y<=460)

{

cleardevice();

delimage(img);

randomize();

gameInit();

gameScene();

}

}

}

}

int main( void ) {

setinitmode( INIT_ANIMATION );

initgraph( 640, 480 );

gw = getwidth() / MAP_W, gh = getheight() / MAP_H;

jiemian();

return 0;

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值