C语言实现贪吃蛇代码

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

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

#define U 1
#define D 2
#define L 3
#define R 4      //蛇的状态 U:上 D:下 L:左 R:右
typedef struct snake    //蛇身的一个节点
{
 int x;      //节点的x坐标
 int y;      //节点的y坐标
 struct snake *next;   //蛇身的下一个节点
 }snake;
 int score=0,add=10;    //总得分和每吃一次食物的得分
 int highscore=0;     //最高分
 int status,sleeptime=200;  //蛇前进状态,每次运行的时间间隔
 snake *head,*food;    //蛇头指针,食物指针
 snake *q;      //遍历蛇时用的指针
 int endgamestatus=0;    //游戏结束时的状态
 HANDLE hOut;      //控制台句柄
 void gotoxy(int x,int y);
 int color(int c);
 void printsnake();
 void wlcome();
 void createmap();
 void scoreandtips();
 void initsnake();
 void createfood();
 int biteself();
 void cantcrosswall();
 void speedup();
 void speeddown();
 void snakemove();
 void keyboardcontrol();
 void lostdraw();
 void endgame();
 void choose();
 void file_out();
 void file_in();
 void explation();
 main()
 {
 system("mode con cols=100 lines=30");
 printsnake();
 wlcome();
 file_out();
 keyboardcontrol();
 endgame();
 }
 void gotoxy(int x,int y)//设置光标位置
 {COORD c;
 c.X=x;
 c.Y=y;
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c); //定位光标的位置
 }
 int color(int c)//设置颜色
 {
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c);
 return 0;
 }
 void printsnake()//打印字符蛇
 {
 gotoxy(2,5);
 color(3);
 printf("姓名:张小艾");

 gotoxy(2,6);
 color(3);
 printf("学号:1910101099"); 

 gotoxy(35,1);
 color(6);
 printf("/^\\/^\\");

 gotoxy(34,2);
 printf("|_| o|");

 gotoxy(33,2);
 color(2);
 printf("_");

 gotoxy(25,3);
 color(12);
 printf("\\/");

 gotoxy(31,3);
 color(2);
 printf("/");

 gotoxy(37,3);
 color(6);
 printf("\\_/");

 gotoxy(41,3);
 color(10);
 printf(" \\");

 gotoxy(26,4);
 color(12);
 printf("\\____");

 gotoxy(32,4);
 printf("_________");

 gotoxy(31,4);
 color(2);
 printf("|");

 gotoxy(43,4);
 color(10);
 printf("\\");

 gotoxy(32,5);
 color(2);
 printf("\\_______");

 gotoxy(44,5);
 color(10);
 printf("\\");

 gotoxy(39,6);
 printf("| |    \\");

 gotoxy(38,7);
 printf("/ /    \\");

 gotoxy(37,8);
 printf("/ /    \\ \\");

 gotoxy(35,9);
 printf("/ /    \\ \\");

 gotoxy(34,10);
 printf(" / /     \\ \\");

 gotoxy(33,11);
 printf("/ /  _----_  \\ \\");

 gotoxy(32,12);
 printf("/ /   _-~ ~-_  | |");

 gotoxy(31,13);
 printf("(  (  _-~ _--_ ~-_  _/ |");

 gotoxy(32,14);
 printf("\\ ~-____-~ _-~ ~-_ ~-_-~ /");

 gotoxy(33,15);
 printf("~-_   _-~  ~-_  _-~");

 gotoxy(35,16);
 printf("~--____-~    ~-___-~");
 } 

 void wlcome()//欢迎界面
 {int n;
 int i,j=1;
 gotoxy(43,18);
 color(11);
 printf("贪吃蛇大作战");
 color(14);
 for(i=20;i<=26;i++)
 {
  for(j=27;j<=74;j++)
  {
  gotoxy(j,i);
  if(i==20||i==26)
  {
  printf("-");
 }
 else if(j==27||j==74)
 {
 printf("|");
 }
 }
 }
 color(12);
 gotoxy(35,22);
 printf("1.开始游戏");
 gotoxy(55,22);
 printf("2.游戏说明");
 gotoxy(35,24);
 printf("3.退出游戏");
 gotoxy(29,27);
 color(3);
 printf("请选择1 2 3\n");
 color(14);
 scanf("%d",&n);
 switch(n)
 {
 case 1:
 system("cls");//清屏
 createmap();
 initsnake();
 createfood();
 keyboardcontrol();
 break;
 case 2:
 explation();
 break;
 break;
 case 3:
  exit(0);
 break;
 }
 }
void createmap()//创建地图
{
 int i,j;
 for(i=0;i<58;i+=2)
 {
 gotoxy(i,0);
 color(5);
  printf("□");
  gotoxy(i,26);
 printf("□");
 }
 for(i=0;i<26;i++)
 {
 gotoxy(0,i);
  printf("□");
  gotoxy(56,i);
 printf("□");
 }
 for(i=2;i<56;i+=2)
 {
 for(j=1;j<26;j++)
 {
 gotoxy(i,j);
  color(3);
  printf("■\n\n");
 }

 }
}
 void scoreandtips()//游戏界面右侧的得分和小提示
 {
 file_out();
 gotoxy(64,4);
 color(11);
 printf("*最高纪录*: %d",highscore);
 gotoxy(64,8);
 color(14);
 printf("得分: %d ",score);
 color(13);
 gotoxy(73,11);
 printf("小提示");
 gotoxy(60,13);
 color(6);
 printf("+---------------------+");
 gotoxy(60,25);
 printf("+---------------------+");
 color(3);
 gotoxy(64,14);
 printf("每个食物得分:%d分",add);
 gotoxy(64,16);
 printf("不能穿墙,不能咬到自己");
 gotoxy(64,18);
 printf("用↑↓←→分别控制蛇的移动");
 gotoxy(64,20);
 printf("F1为加速,F2为减速");
 gotoxy(64,22);
 printf("space: 暂停游戏");
 gotoxy(64,24);
 printf("ESC:退出游戏");
}
void file_out()//打开文件记录最高分
{
 FILE *fp;
 fp=fopen("save.txt","a+");
 fscanf(fp,"%d",&highscore);
 fclose(fp);
 }
 void initsnake()
 {
 snake *tail;
 int i;
 tail=(snake*)malloc(sizeof(snake));
 tail->x=24;
 tail->y=5;
 tail->next=NULL;
 for(i=1;i<=4;i++)
 {
 head=(snake*)malloc(sizeof(snake));
 head->next=tail;
 head->x=24+2*i;
 head->y=5;
 tail=head;
 }
 while(tail!=NULL)
 {gotoxy(tail->x,tail->y);
 color(14);
 printf("★");     //蛇身由★组成
 tail=tail->next;
 }
}
void createfood()//随机出现食物
{
 snake *food_1;
 srand((unsigned)time(NULL));
 food_1=(snake*)malloc(sizeof(snake));
 while((food_1->x%2!=0))
 {
  food_1->x=rand()%52+2;
 }
 food_1->y=rand()%24+1;
 q=head;
 while(q->next==NULL)
 {
  if(q->x==food_1->x&&q->y==food_1->y)
  {
  free(food_1);
  createfood();
 }
 q=q->next;
 }
 gotoxy(food_1->x,food_1->y);
 food=food_1;
 color(12);
 printf("@");
}
int biteself()
{
 snake *self;    //定义self为蛇身上除蛇头以外的节点
 self=head->next;
 while(self!=NULL)
 {
 if(self->x==head->x&&self->y==head->y)
 {
 return 1;
 }
 self=self->next;
 }
 return 0;
 } 

 void cantcrosswall()
{
 if(head->x==0||head->x==56||head->y==0||head->y==26)
 {
 endgamestatus=1;
 endgame();
 }
 }
 void speedup()//加速
{
 if(sleeptime>=50)
 {
 sleeptime=sleeptime-10;
 add=add+2;
 }
}

void speeddown()//减速
{
 if(sleeptime<350)
 {
 sleeptime=sleeptime+30;
 add=add-2;
 if(sleeptime==350)
 {
 add=1;
 }
 }
}

 void snakemove()//控制方向
{
 snake *nexthead;
 cantcrosswall();
 nexthead=(snake*)malloc(sizeof(snake));
 if(status==U)//上
 {
 nexthead->x=head->x;   //向上前进时,x不变,y-1
 nexthead->y=head->y-1;
 nexthead->next=head;
 head=nexthead;
 q=head;
 //如果下一个位置上有食物,下一个位置的坐标和食物坐标相同
 if(nexthead->x==food->x&&nexthead->y==food->y)
 {
 while(q!=NULL)
 {
 gotoxy(q->x,q->y);
 color(14);
 printf("★");
 q=q->next;
 }
 score=score+add;
 speedup();
 createfood();
 }
 else
 {
 while(q->next->next!=NULL)//如果没有遇见食物
  {
   gotoxy(q->x,q->y);
 color(14);
 printf("★");
 q=q->next;
  }
 //经过上面的循环 ,q指向蛇尾,蛇尾的下一步就是蛇走过去的位置
  gotoxy(q->next->x,q->next->y);
  color(3);
  printf("■");//恢复走过的位置
  free(q->next);
  q->next=NULL;
 } 

 }
 if(status==D)
 {
  nexthead->x=head->x;   //向下前进时,x不变,y+1
 nexthead->y=head->y+1;
 nexthead->next=head;
 head=nexthead;
 q=head;
 //如果下一个位置上有食物,下一个位置的坐标和食物坐标相同
 if(nexthead->x==food->x&&nexthead->y==food->y)
 {
 while(q!=NULL)
 {
 gotoxy(q->x,q->y);
 color(14);
 printf("★");
 q=q->next;
 }
 score=score+add;
 speedup();
 createfood();
 }
 else
 {
 while(q->next->next!=NULL)//如果没有遇见食物
  {
   gotoxy(q->x,q->y);
 color(14);
 printf("★");
 q=q->next;
  }
 //经过上面的循环 ,q指向蛇尾,蛇尾的下一步就是蛇走过去的位置
  gotoxy(q->next->x,q->next->y);
  color(3);
  printf("■");//恢复走过的位置
  free(q->next);
  q->next=NULL;
 }
 }
 if(status==L)//左
 {
  nexthead->x=head->x-2;   //向左前进时,x不变,y+1
 nexthead->y=head->y;
 nexthead->next=head;
 head=nexthead;
 q=head;
 //如果下一个位置上有食物,下一个位置的坐标和食物坐标相同
 if(nexthead->x==food->x&&nexthead->y==food->y)
 {
 while(q!=NULL)
 {
 gotoxy(q->x,q->y);  //食物变成蛇身上的一部分
 color(14);
 printf("★");
 q=q->next;
 }
 score=score+add;
 speedup();
 createfood();
 }
 else
 {
 while(q->next->next!=NULL)//如果没有遇见食物
  {
   gotoxy(q->x,q->y);
 color(14);
 printf("★");
 q=q->next;
  }
 //经过上面的循环 ,q指向蛇尾,蛇尾的下一步就是蛇走过去的位置
  gotoxy(q->next->x,q->next->y);
  color(3);
  printf("■");//恢复走过的位置
  free(q->next);
  q->next=NULL;
 }
 }
 if(status==R)
 {
  nexthead->x=head->x+2;   //向上前进时,x不变,y-1
 nexthead->y=head->y;
 nexthead->next=head;
 head=nexthead;
 q=head;
 //如果下一个位置上有食物,下一个位置的坐标和食物坐标相同
 if(nexthead->x==food->x&&nexthead->y==food->y)
 {
 while(q!=NULL)
 {
 gotoxy(q->x,q->y);
 color(14);
 printf("★");
 q=q->next;
 }
 score=score+add;
 speedup();
 createfood();
 }
 else
 {
 while(q->next->next!=NULL)//如果没有遇见食物
  {
   gotoxy(q->x,q->y);
 color(14);
 printf("★");
 q=q->next;
  }
 //经过上面的循环 ,q指向蛇尾,蛇尾的下一步就是蛇走过去的位置
  gotoxy(q->next->x,q->next->y);
  color(3);
  printf("■");//恢复走过的位置
  free(q->next);
  q->next=NULL;
 }
}
 if(biteself()==1)
 {
 endgamestatus=2;
 endgame();
 }
}
void keyboardcontrol()
{
 status=R;
 while(1)
 {
 scoreandtips();
 //GetAsyncKeyState函数用来判断函数调用指定虚拟键的状态
 if(GetAsyncKeyState(VK_UP)&&status!=D)
 {
 status=U;
 }
 else if(GetAsyncKeyState(VK_DOWN)&&status!=U)
 {
 status=D;
 }
 else if(GetAsyncKeyState(VK_LEFT)&&status!=R)
 {
 status=L;
 }
 else if(GetAsyncKeyState(VK_RIGHT)&&status!=L)
 {
 status=R;
 }
 if(GetAsyncKeyState(VK_SPACE))
 {
  while(1)
   {
 //调用sleep函数,令进程停止,直到达到其中设定的参数时间
  Sleep(300);
  if(GetAsyncKeyState(VK_SPACE))
  {
   break;
 }
 }
 }
 else if(GetAsyncKeyState(VK_ESCAPE))
 {
   endgamestatus=3;
   break;
 }
 else if(GetAsyncKeyState(VK_F1))
 {
   speedup();
 }
 else if(GetAsyncKeyState(VK_F2))
 {
   if(sleeptime<350)
   {
   sleeptime=sleeptime+30;
   add=add-2;
   if(sleeptime==350)
   {
   add=1;
 }
   }
 }
 Sleep(sleeptime);
 snakemove();
 }
}

void lostdraw()
{
 system("cls");
 int i,j;
 gotoxy(17,5);
 color(11);
 printf("+------------------------");

 gotoxy(35,5);
 color(14);
 printf("o00o");

 gotoxy(39,5);
 color(11);
 printf("----------");

 gotoxy(48,5);
 color(14);
 printf("---");

 gotoxy(51,5);
 color(11);
 printf("----------");

 gotoxy(61,5);
 color(14);
 printf("o00o");

 gotoxy(65,5);
 color(11);
 printf("-----------------+");

 for(i=6;i<=19;i++)
 {
 gotoxy(17,i);
  printf("|");
  gotoxy(82,i);
  printf("|");
 }
 gotoxy(17,20);
 printf("+----------------------------------");

 gotoxy(52,20);
 color(11);
 printf("-----------------------------+");
 } 

 void endgame()
 {
 system("cls");
 if(endgamestatus==1)
 {
 lostdraw();
 gotoxy(35,9);
 color(12);
 printf("对不起,您撞到墙了。游戏结束!");
 }
 else if(endgamestatus==2)
 {
 lostdraw();
 gotoxy(35,9);
 color(12);
 printf("对不起,您咬到自己了。游戏结束!");
 }
 else if(endgamestatus==3)
 {
 lostdraw();
 gotoxy(40,9);
 color(12);
 printf("您结束了游戏。");
 }
 gotoxy(43,12);
 color(13);
 printf("您的得分是 %d",score);
 if(score>=highscore)
 {
  color(10);
  gotoxy(33,16);
  printf("创新纪录啦!你真棒!!!");
 file_in();
  }
 choose();
 }
 void file_in()//将最高分存储到文件中
 {
 FILE *fp;
 fp=fopen("save.txt","w+");//以读写的方式建立文件
 fprintf(fp,"%d",score);
 fclose(fp);
 }
 void choose()
 {
 int n;
 gotoxy(25,23);
 color(12);
 printf("重玩一局-------1");
 gotoxy(52,23);
 printf("不玩了,退出-------2");
 gotoxy(46,25);
 color(11);
 printf("选择:");
 scanf("%d",&n);
 switch(n)
 {
 case 1:
  system("cls");
  score=0;
  sleeptime=200;
  add=10;
  printsnake();
  wlcome();
  break;
 case 2:
  exit(0);
  break;
 default:
  gotoxy(35,27);
  color(12);
  printf("您输入有误,请重新输入");
  system("pause >nul");//按任意键
 endgame();
 choose();
 break;
 }
 }
 void explation()
 {
 int i,j=1;
 system("cls");
 color(13);
 gotoxy(44,3);
 printf("游戏说明");
 color(2);
 for(i=6;i<=22;i++)
 {
 for(j=20;j<=75;j++)
 {
 gotoxy(j,i);
 if(i==6||i==22)printf("=");
 else if(j==20||j==75)printf("||");
 }
 }
 color(3);
 gotoxy(30,8);
 printf("1、不能穿墙,不能咬到自己");
 color(3);
 gotoxy(30,8);
 printf("1、不能穿墙,不能咬到自己");
 color(10);
 gotoxy(30,11);
 printf("2、用↑↓←→分别控制蛇的移动");
 color(14);
 gotoxy(30,14);
 printf("3、F1为加速,F2为减速");
 color(11);
 gotoxy(30,17);
 printf("4、按空格键暂停游戏,再按空格键继续");
 color(4);
 gotoxy(30,20);
 printf("5、ESC:退出游戏,space:暂停游戏");
 getch();//按任意键返回主界面
 system("cls");
 printsnake();
 wlcome(); 

}

更多有趣的经典小游戏实现专题,分享给大家:

C++经典小游戏汇总

python经典小游戏汇总

python俄罗斯方块游戏集合

JavaScript经典游戏 玩不停

java经典小游戏汇总

javascript经典小游戏汇总

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

(0)

相关推荐

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

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

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

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

  • 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

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

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

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

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

  • C语言实现贪吃蛇游戏

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

  • 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语言手把手教你实现贪吃蛇AI(下)

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

  • 基于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语言代码实现(难度可选)

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

随机推荐