dos系统c语言教程,DOS简易版C语言贪吃蛇

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

#include

#include

#include

#include

#include

#define WALL_LENGTH 22

#define LEFT 0x4b

#define RIGHT 0x4d

#define DOWN 0x50

#define UP 0x48

struct Snakes{

int x;

int y;

struct Snakes *prev;

struct Snakes *next;

};

struct Food{

int x;

int y;

};

struct Snakes *header;

struct Snakes *tailer;

struct Food *food;

int wall[WALL_LENGTH][WALL_LENGTH];

int direction = RIGHT;

/**/

void init();

void draw();

void move();

void doMove(int x1, int y1);

void eat();

void keydown();

void foods();

int isOver();

int isDrawSnake(int x, int y);

int isDrawFood(int x, int y);

int main(){

init();

while(1){

if(isOver()){

break;

}

move();

eat();

draw();

_sleep( 100 );

keydown();

}

printf("GAME OVER!");

system("pause");

}

void init(){

int y, x;

for(y=0; y < WALL_LENGTH; y++){

for(x=0; x < WALL_LENGTH; x++){

if(y == 0 || y == WALL_LENGTH - 1 || x == 0 || x == WALL_LENGTH - 1){

wall[y][x] = 1;

}

}

}

header=(struct Snakes *)malloc(sizeof(struct Snakes));

header->x=10;

header->y=10;

header->prev=NULL;

tailer=(struct Snakes *)malloc(sizeof(struct Snakes));

tailer->x=9;

tailer->y=10;

tailer->next=NULL;

tailer->prev=header;

header->next=tailer;

foods();

}

void draw(){

int y, x;

system("cls");

for(y=0; y < WALL_LENGTH; y++){

for(x=0; x < WALL_LENGTH; x++){

if(wall[y][x] == 1){

printf("[]");

}else if(isDrawSnake(x, y)){

printf("[]");

}else if(isDrawFood(x, y)){

printf("()");

}else{

printf(" ");

}

}

printf("\n");

}

}

void move(){

switch(direction){

case LEFT :

doMove(-1, 0);

break;

case RIGHT :

doMove(1, 0);

break;

case UP :

doMove(0, -1);

break;

case DOWN :

doMove(0, 1);

break;

}

}

void doMove(int x1, int y1){

struct Snakes *temp_tailer = tailer->prev;

tailer->x=header->x + x1;

tailer->y=header->y + y1;

tailer->next=header;

tailer->prev->next = NULL;

tailer->prev = NULL;

header->prev=tailer;

header = tailer;

tailer = temp_tailer;

}

void eat(){

if(header->x == food->x && header->y == food->y){

int x1=0, y1 =0;

struct Snakes *temp_tailer = tailer;

tailer=(struct Snakes *)malloc(sizeof(struct Snakes));

switch(direction){

case LEFT :

x1 = -1;

y1 = 0;

break;

case RIGHT :

x1 = 1;

y1 = 0;

break;

case UP :

x1 = 0;

y1 = -1;

break;

case DOWN :

x1 = 0;

y1 = 1;

break;

}

tailer->x=temp_tailer->x + x1;

tailer->y=temp_tailer->y + y1;

tailer->next=NULL;

tailer->prev=temp_tailer;

temp_tailer->next = tailer;

foods();

}

}

void foods(){

int y,x;

struct Snakes *temp = header;

_sleep(20);

srand((unsigned)time(NULL));

y=rand()%WALL_LENGTH;

x=rand()%WALL_LENGTH;

if(y == 0 || y == WALL_LENGTH - 1 || x == 0 || x == WALL_LENGTH - 1 ){

return foods();

}

do{

if(temp->x == x && temp->y == y){

return foods();

}

temp = temp->next;

}while(temp != NULL);

if(food == NULL){

food=(struct Food *)malloc(sizeof(struct Food));

}

food->x = x;

food->y = y;

}

void keydown(){

char keycode;

if(_kbhit()&&(keycode =_getch())) {

switch(keycode) {

case LEFT:

if(RIGHT!=direction) {

direction=LEFT;

// move();

// draw();

}

break;

case RIGHT:

if(LEFT!=direction) {

direction=RIGHT;

// move();

// draw();

}

break;

case UP:

if(DOWN!=direction) {

direction=UP;

// move();

// draw();

}

break;

case DOWN:

if(UP!=direction){

direction=DOWN;

// move();

// draw();

}

break;

}

}

}

int isDrawSnake(int x, int y){

struct Snakes *temp = header;

do{

if(temp->x == x && temp->y == y){

return 1;

}

temp = temp->next;

}while(temp != NULL);

return 0;

}

int isDrawFood(int x, int y){

if(food->x == x && food->y == y){

return 1;

}

return 0;

}

int isOver(){

int x1=0, y1 =0;

switch(direction){

case LEFT :

x1 = -1;

y1 = 0;

break;

case RIGHT :

x1 = 1;

y1 = 0;

break;

case UP :

x1 = 0;

y1 = -1;

break;

case DOWN :

x1 = 0;

y1 = 1;

break;

}

if(header->x + x1 <= 0 || header->x + x1 >= WALL_LENGTH - 1

|| header->y + y1 <= 0 || header->y + y1 >= WALL_LENGTH - 1){

return 1;

}

return 0;

}

好久没写过C语言了,随便写个贪吃蛇玩一玩,BUG不少,当记录了。

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值