1. 程式人生 > 程式設計 >DOS簡易版C語言貪吃蛇

DOS簡易版C語言貪吃蛇

本文例項為大家分享了C語言實現貪吃蛇的具體程式碼,供大家參考,具體內容如下

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。