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不少,当记录了。

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

(0)

相关推荐

  • 基于C语言实现的贪吃蛇游戏完整实例代码

    本文以实例的形式讲述了基于C语言实现的贪吃蛇游戏代码,这是一个比较常见的游戏,代码备有比较详细的注释,对于读者理解有一定的帮助. 贪吃蛇完整实现代码如下: #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <dos.h> #define NULL 0 #define UP 18432 #define DOWN 20480 #define LEFT 19200 #defi

  • C语言手把手教你实现贪吃蛇AI(上)

    本文实例为大家分享了手把手教你实现贪吃蛇AI的具体步骤,供大家参考,具体内容如下 1. 目标 编写一个贪吃蛇AI,也就是自动绕过障碍,去寻找最优路径吃食物. 2. 问题分析 为了达到这一目的,其实很容易,总共只需要两步,第一步抓一条蛇,第二步给蛇装一个脑子.具体来说就是,首先我们需要有一条普通的贪吃蛇,也就是我们常玩儿的,手动控制去吃食物的贪吃蛇:然后给这条蛇加入AI,也就是通过算法控制,告诉蛇怎么最方便的绕开障碍去吃食物.为了讲清楚这个问题,文章将分为三部分:上,写一个贪吃蛇程序:中,算法基础

  • C语言手把手教你实现贪吃蛇AI(下)

    本文实例为大家分享了C语言实现贪吃蛇AI的具体代码,供大家参考,具体内容如下 1. 目标 这一部分的目标是把之前写的贪吃蛇加入AI功能,即自动的去寻找食物并吃掉. 2. 控制策略 为了保证蛇不会走入"死地",所以蛇每前进一步都需要检查,移动到新的位置后,能否找到走到蛇尾的路径,如果可以,才可以走到新的位置:否则在当前的位置寻找走到蛇尾的路径,并按照路径向前走一步,开始循环之前的操作,如下图所示.这个策略可以工作,但是并不高效,也可以尝试其他的控制策略,比如易水寒的贪吃蛇AI 运行效果如

  • C语言链表实现贪吃蛇游戏

    阅读学习了源代码,并做了简单的注释和修改,里面只用了链表数据结构,非常适合C语言入门者学习阅读. 程序可在VS2013下编译运行. #include<stdio.h> #include<time.h> #include<windows.h> #include<stdlib.h> #define U 1 #define D 2 #define L 3 #define R 4 //蛇的状态,U:上 :D:下:L:左 R:右 typedef struct SNAK

  • 70行C语言代码实现贪吃蛇

    本文实例为大家分享了C语言实现贪吃蛇的具体代码,供大家参考,具体内容如下 #include <stdio.h> #include <Windows.h> #include <conio.h> #include <time.h> #define MAX_WIDE 50 #define MAX_HIGH 16 short dx = 1, dy = 0, randxy, score = 0; COORD coord; struct Snake{ short len

  • C语言结构数组实现贪吃蛇小游戏

    一.设计思路 蛇身本质上就是个结构数组,数组里存储了坐标x.y的值,再通过一个循环把它打印出来,蛇的移动则是不断地刷新重新打印.所以撞墙.咬到自己只是数组x.y值的简单比较. 二.用上的知识点 结构数组Windows API函数 三.具体实现 先来实现静态页面,把地图.初始蛇身.食物搞定. 这里需要用到Windows API的知识,也就是对控制台上坐标的修改 //这段代码来自参考1 void Pos(int x, int y) { COORD pos; HANDLE hOutput; pos.X

  • C语言实现贪吃蛇游戏

    最近整理下电脑,看到了自己在上个学期打的贪吃蛇游戏的c代码,觉得真的是略微有点冗长,但是实现起来应该也算是比较好理解,于是把自己的代码搬上来,网络上写贪吃蛇的c语言的文章很多,我这篇也仅是给大家作为一个参考而已. 我的代码是在Windows下运行的,因为需要用到windows.h这个库. 然后也做了一个简单的ai模式,这在没有障碍物的情况下前期还是蛮不错的,但是到了后期蛇变长了之后就会有bug了. 好了,直接上代码吧: 1)头文件和宏定义 #include<stdio.h> #include&

  • C语言贪吃蛇经典小游戏

    一.贪吃蛇小游戏简介: 用上下左右控制蛇的方向,寻找吃的东西,每吃一口就能得到一定的积分,而且蛇的身子会越吃越长,身子越长玩的难度就越大,不能碰墙,也不能咬到自己的身体,等到了一定的分数,就能过关. 二.函数框架 三.数据结构 typedef struct Snake { size_t x; //行 size_t y; //列 struct Snake* next; }Snake, *pSnake; 定义蛇的结构体,利用单链表来表示蛇,每个结点为蛇身体的一部分. 四.代码实现(vs2010  c

  • C语言手把手教你实现贪吃蛇AI(中)

    手把手教你实现贪吃蛇AI,具体内容如下 1. 目标 这一部分主要是讲解编写贪吃蛇AI所需要用到的算法基础. 2. 问题分析 贪吃蛇AI说白了就是寻找一条从蛇头到食物的一条最短路径,同时这条路径需要避开障碍物,这里仅有的障碍就是蛇身.而A star 算法就是专门针对这一个问题的.在A star 算法中需要用到排序算法,这里采用堆排序(当然其他排序也可以),如果对堆排序不熟悉的朋友,请移步到这里--堆排序,先看看堆排序的内容. 3. A*算法 A star(也称A*)搜寻算法俗称A星算法.这是一种在

  • 贪吃蛇C语言代码实现(难度可选)

    本文实例为大家分享了C语言实现贪吃蛇的具体代码,供大家参考,具体内容如下 /********************************************************* ********************贪吃蛇(难度可选)******************** **************制作者:Xu Lizi 日期:2012/12/31******** ********************部分函数有借鉴************************ ****

随机推荐