DOS簡易版C語言貪喫蛇

 

http://blog.csdn.net/xxb2008/article/details/40747291
 

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <windows.h>

   

#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不少,當記錄了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章