#include<stdio.h>
#include<windows.h>
#include<time.h>
#include<stdlib.h>
#include<conio.h>
#define N 21
FILE *fp;
int S;
void  boundary(void);//开始界面
void end(void);  //结束 void gotoxy(int x,int y)//位置函数
{COORD pos;pos.X=x;pos.Y=y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}void color(int a)//颜色函数{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);}void init(int food[2])//初始化函数(初始化围墙、显示信息、苹果){system("cls");int i,j;//初始化围墙int wall[N+2][N+2]={{0}};//初始化围墙的二维数组 for(i=1;i<=N;i++){for(j=1;j<=N;j++)wall[i][j]=1;}color(10);for(i=0;i<N+2;i++)//畵围墙 {for(j=0;j<N+2;j++){if(wall[i][j])printf(" ");else printf("#") ;}printf("\n") ;}gotoxy(N+3,3);//显示信息color(14);printf("\t\t按a,b,c,d改变方向\n");gotoxy(N+3,1);color(14);printf("\t\t按任意键暂停,按1返回,按2退出\n");gotoxy(N+5,3);color(14);printf("score:\n");food[0]=rand()%N+1;//随机出现食物 food[1]=rand()%N+1;gotoxy(food[0],food[1]);color(12);printf("*\n");
}void play()//具体玩的过程
{system("cls");int i,j;int** snake=NULL;//定义蛇的二维指针  int food[2];//食物的数组,food[0]代表横坐标,food[1]代表纵坐标 int score=0;//为得分 int tail[2];//此数组为了记录蛇的头的坐标 int node=3;//蛇的节数 char ch='p';srand((unsigned)time(NULL));//随机数发生器的初始化函数 init(food); snake=(int**)realloc(snake,sizeof(int*)*node);//改变snake所指内存区域的大小为node长度 for(i=0;i<node;i++)snake[i]=(int*)malloc(sizeof(int)*2);for(i=0;i<node;i++)//初始化蛇的长度 {snake[i][0]=N/2;snake[i][1]=N/2+i;gotoxy(snake[i][0],snake[i][1]);color(14);printf("*\n");}while(1)//进入消息循环{gotoxy(5,0);color(10);printf("#");gotoxy(0,5);color(10);printf("#");gotoxy(0,7);color(10);printf("#");gotoxy(0,9);color(10);printf("#");tail[0]=snake[node-1][0];//将蛇的后一节坐标赋给tail数组 tail[1]=snake[node-1][1];gotoxy(tail[0],tail[1]);color(0);printf(" ");for(i=node-1;i>0;i--)//蛇想前移动的关键算法,后一节的占据前一节的地址坐标 {snake[i][0]=snake[i-1][0];snake[i][1]=snake[i-1][1];gotoxy(snake[i][0],snake[i][1]);color(14);printf("*\n");}if(kbhit())//捕捉输入信息 {gotoxy(0,N+2);ch=getche();}switch(ch){case 'w':snake[0][1]--;break;case 's':snake[0][1]++;break;case 'a':snake[0][0]--;break;case 'd':snake[0][0]++;break;case '1':boundary() ;break;case '2':end();break;default: break;}gotoxy(snake[0][0],snake[0][1]);color(14);printf("*\n");Sleep(abs(200-0.5*score));//使随着分数的增长蛇的移动速度越来越快 if(snake[0][0]==food[0]&&snake[0][1]==food[1])//吃掉食物后蛇分数加1,蛇长加1{score++;//分数增加 S=score;node++;//节数增加 snake=(int**)realloc(snake,sizeof(int*)*node);snake[node-1]=(int*)malloc(sizeof(int)*2);food[0]=rand()%N+1;//产生随机数且要在围墙内部 food[1]=rand()%N+1;gotoxy(food[0],food[1]);color(12);printf("*\n");gotoxy(N+12,3);color(14);printf("%d\n",score);//输出得分 }if(snake[0][1]==0||snake[0][1]==N+1||snake[0][0]==0||snake[0][0]==N+1)//撞到围墙后失败{gotoxy(N/2,N/2);color(30);printf("GAME  OVER!!!\n");for(i=0;i<node;i++)free(snake[i]);Sleep(INFINITE);exit(0);}}//从蛇的第四节开始判断是否撞到自己,因为蛇头为两节,第三节不可能拐过来  for (i=3; i<node; i++)  {  for(j=0;j<node;j++){if (snake[i][0]==snake[j][0] && snake[i][1]==snake[j][1])     {  gotoxy(N/2,N/2);color(30);printf("GAME  OVER!!!\n");for(i=0;i<node;i++)free(snake[i]);Sleep(INFINITE);exit(0);;  }  }}  }void end()//结束函数
{       system("cls");system("cls");printf("EXIT!!!\n");}void grade()//成绩记录函数
{system("cls");int i=0; char s;if( (fp=fopen("f:\\贪吃蛇\\贪吃蛇.txt","ar") )==NULL)//打开文件 {printf("\nCannot open file!\n");exit(0);}if(i<S)i=S;color(14);fwrite(&i,sizeof(i),1,fp);fclose(fp);printf("最高的分为:%d\n\n",i); printf("\t按1返回\n\n");printf("\t按2退出\n\n");s=getche();switch(s){case '1':boundary();break;case '2': end();break;}} void  boundary()//开始界面
{system("cls");char s;color(14);printf("\t\t欢迎来玩!!\n\n");printf("\t\t1:开始\n\n");printf("\t\t2:查看成绩\n\n");printf("\t\t3:退出\n\n");printf("\t\t请选择:");s=getche();switch(s){case '1': play();break;case '2': grade();break;case '3': end();break;}}int main()
{boundary();getchar();return 0;
}

Windows下的gotoxy 函数相关推荐

  1. UNIX_C 环境下实现输入一个字符,不用回车直接输入功能(类型windows下_getch(void)函数)

    UNIX_C 环境下实现输入一个字符,不用回车直接输入功能(类型windows下_getch(void)函数) /*int getch ( void ); 输入流获取一个信号当键盘输入一个字符时,不用 ...

  2. Windows下使用GetOpt函数使用

    GetOpt库下载 GetOpt.h是一个GNU标准库的头文件,它包含一些从命令行上提取参数的工具用于基于文本C/C++应用程序.因为getopt.h不是ANSI C标准库的一部分,getopt必须编 ...

  3. windows下的_mkdir函数

    创建目录函数_mkdir(path),返回0表示成功,-1失败 只能创建一级目录,即path倒数第二级必须是已经存在,否则创建不成功. 举个例子. 现在D盘下为空,什么都没有 path="d ...

  4. windows下mysql 自定义函数 之http 实操

    有没有遇到这种场景呢,当使用mysql做复杂字符串处理的时候总感觉mysql内置的函数不够用呢.比如做字符串切割,解析xml等.而这个时候你恰恰对编写mysql函数或者存储过程缺乏一定的经验积累.而你 ...

  5. windows下实现socketpair函数

    前言 socketpair是Linux下的函数,其主要作用是创建一对套节字来进行进程间通信,其与匿名管道(PIPE)的作用相似,这两个套节字均可读可写. 具体介绍见本博客另一篇文章: https:// ...

  6. Windows下创建进程简介

    正在执行的应用程序称为进程,进程不仅仅是指令和数据,它还有状态.状态是保存在处理器寄存器中的一组值,如当前执行指令的地址.保存在内存中的值,以及唯一定义进程在任一时刻任务的所有其他值.进程与应用程序的 ...

  7. windows下python使用fllow扩展持续读取文件的bug

    文章目录 一.前言 二.读取fllow源码 1.fllow读取文件代码 2.跟踪new_file_check 函数 3.python的stat函数 4.分析出错代码 三.windows下对比inode ...

  8. 在windows下运行Felzenszwalb的Deformable Part Model(DPM)源码voc-release3.1来训练自己的模型

    我的环境 DPM源码版本:voc-release3.1 VOC开发包版本:VOC2007_devkit_08-Jun 使用的训练数据集:VOC2007                         ...

  9. linux c++开发_Linux/Windows下进行C/C++开发的差异

    1. 平台差异简介 Windows 和Unix是当前两大主流操作系统平台,基于C/C++的开发人员经常会面临这两个平台之间的移植的问题.Unix作为一个开发式的系统,其下有出现了很 多个分支,包括Su ...

最新文章

  1. C++中try/catch/throw的使用
  2. LINUX下的tty,console与串口
  3. keras从入门到放弃(十四)模型的保存
  4. 阿里巴巴 连接池 druid 的使用、maven依赖
  5. SystemUI之状态栏notification icon加载流程
  6. Linux下查看CPU信息、机器型号等硬件信息
  7. 图书封面的故事之——“巴别塔”选自《七周七语言:理解多种编程范型》
  8. 转载:如何规范地编写一个MATLAB函数文件
  9. oracle 执行顺序 select查询优化
  10. Java 线程 fork join 是什么 怎么用
  11. infoq mysql索引_MySQL 索引优化指南
  12. linux 队列缓冲,linux驱动的等待队列(阻塞操作)和轮询(poll),缓冲区笔记
  13. 13异步多线程(三)Parallel,线程安全
  14. 5、使用bean的scop属性来配置bean的作用域
  15. 基本类型为空导致线上空指针异常问题 java.lang.NullPointerException: cannot unbox null value
  16. 物联网开源工具Unik:用Unikernel提高连接安全性
  17. 浅谈屏幕拍摄泄密跟踪的检测技术
  18. 生产者和消费者问题-----管程法
  19. Mybatis08:使用注解开发
  20. ES学习系列02-创建索引

热门文章

  1. 2021-7-9 学习记录:前端动画制作钟表
  2. C语言:离散数学8.1.5 笛卡尔积
  3. 提前做好网络安全分析,运维真轻松(一)
  4. 升级Git版本到最新的方法
  5. Idea同时打开多个窗口
  6. 工作流相关讲解 转载
  7. handle java
  8. 十一课堂|通过小游戏学习Ethereum DApps编程(1)
  9. 常见状态码(200、403、404、500)
  10. Tomcat重启脚本