c语言编写贪吃蛇修改后最新版
2015-06-07 18:14
435 查看
这学期课程设计用c语言编写了windows环境下的贪吃蛇,多次修改后形成了暂时性的最终版,功能有等级选择,游戏说明,排行榜等等,以下是截图和部分源代码。
使用到的头文件、变量和函数
需要用到的基本函数:
蛇的建立使用链表,蛇身移动和加长用到头插法:
食物坐标合法性判断:
蛇穿草地部分代码:
蓝色食物每10秒换位置:
运行程序:
使用到的头文件、变量和函数
#include <stdio.h> #include <windows.h> #include <conio.h> #include <stdlib.h> #include <string.h> #include <time.h> #define N 100 #define ESC 27 #define UP 72 #define DOWN 80 #define LEFT 75 #define RIGHT 77 #define ENTER 13 #define BRICK "■" enum direction//蛇头方向 { left, right, up, down }; typedef struct food//食物 { int x; int y; }Food; typedef struct Node//蛇身的节点 { int x; int y; }Sna; typedef struct SnakeBody//蛇的身体 { Sna snakenode; struct SnakeBody *next; }SnakeNode, *SnakeList; typedef struct SnakeData//蛇本身数据,体长和头的方向 { int snakelen; enum direction dir; }SnaData; int SPEECH=150;//速度 int len; //地图长 int wide; //地图宽 int map ; //地图数组 int map2 ;//真实地图数组 int Score=0;//分数 int mark=0;//判断要不要清除蛇尾节点 int stop=1;//游戏停止判断 int level=1;//等级 int HighScore[10][5];//排行榜分数 SnakeData Sdata;//记录蛇本身数据 SnakeNode *tail;//记录蛇尾节点 SnakeList S;//蛇 Food F;//健康的食物 Food B;//腐烂的食物 int q=1; //表示当前菜单指针所在位置 int p=1; //难度指针所在位置 int c; int start,end,ftime; int fx,fy; int temp; void color(unsigned short c); void gotoxy(int x,int y); void HideCursor(); void readmap(int level);//读取地图 void drawmap();//画地图 void Initfood(SnakeList S,Food *F,Food *B,int a);//建立食物 void DrawFood(Food *F,int a);//画食物 int JudgeFood(SnakeList S,Food *F,Food *B);//判断食物坐标合法性 void Initsnake(SnakeList *S);//初始化蛇 void Creatsnake(SnakeList S);//建立蛇 void InitNode(SnakeList S,int x,int y);//建立蛇节点 void Drawsnake(SnakeList S,Food *F,Food *B);//画蛇和判断蛇吃食物和判断蛇过草地 void movesnake(SnakeList S);//蛇的移动 void move(SnakeList S);//清理蛇尾节点 void keyboard();//获取键盘输入 void paly(SnakeList S,Food *F,Food *B);//玩游戏函数 unsigned char getkey(); void textout(int y,int x,int ch,char s[]); void DrawMenu();//画主界面 void drawtext();//画主菜单 void Choose();//主菜单各个选项的进入 void DrawInfo();//画游戏信息 void DrawHelp();//画帮助信息 void DrawHelp2();//画操作说明 void DrawBox1();//难度菜单的边框 void DrawBox2();//游戏信息的边框 void DrawBox3();//游戏结束信息的边框 void DrawLevel();//画难度选择界面 void DrawLevel2(); void StopMenu();//画游戏结束界面 void select(int c);//主菜单上下选择 void LevelChoose();//难度菜单上下选择 void LevelChoose2(); void readscore(int level);//读取一个排行榜数据 void ReadAllScore();//读取所有排行榜数据 void DrawScore(int level,int x);//画一个排行榜 void DrawRank();//画所有排行榜 void DrawRank2(); void JudgeScore(int level);//判断分数大小是否记录进排行榜
需要用到的基本函数:
void color(unsigned short c) {//颜色选择 HANDLE app=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(app,c); } void gotoxy(int x,int y)//光标跳转 { COORD cr; HANDLE app=GetStdHandle(STD_OUTPUT_HANDLE); cr.X=x; cr.Y=y; SetConsoleCursorPosition(app,cr); } void HideCursor()//隐藏光标 { CONSOLE_CURSOR_INFO cursor_info = {1, 0}; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info); }
蛇的建立使用链表,蛇身移动和加长用到头插法:
void InitNode(SnakeList S,int x,int y) {//蛇的节点创建 SnakeNode *q=(SnakeNode *)malloc(sizeof(SnakeNode)); SnakeNode *p=S; q->next=NULL; q->snakenode.x=x; q->snakenode.y=y; q->next=p->next; p->next=q; }
食物坐标合法性判断:
int JudgeFood(SnakeList S,Food *F,Food *B) {//判断食物位置是否合法,F为要建立的食物,B为已经建立的食物 SnakeNode *p=S->next; if(F->x%2 != 0) //使得食物坐标x一直为偶数,方便判断 return 0; if(F->x==B->x && F->y== B->y)//判断食物和已建立食物坐标是否一样 return 0; if(F->x < 8 || F->x > 90)//判断食物坐标是否在外墙上 return 0; if(F->y < 2 || F->y > 16) return 0; if(map2[F->y+1][F->x+1] == 1)//判断食物坐标是否在障碍物(内墙)上 return 0; while(p!=NULL)//判断食物坐标是否在蛇上 { if(F->x == p->snakenode.x && F->y == p->snakenode.y) { return 0; } p=p->next; } return 1; }
蛇穿草地部分代码:
if((level == 2 || level == 3 || level == 4 || level == 5) && (tail->snakenode.x == 92 || tail->snakenode.x == 4)) //如果蛇穿墙而过,在蛇尾过墙后重新输出该位置的墙体 { gotoxy(tail->snakenode.x,tail->snakenode.y); color(2); printf("▲"); } if((level == 3 || level == 4) && (tail->snakenode.y ==17 || tail->snakenode.y ==1)) { gotoxy(tail->snakenode.x,tail->snakenode.y); color(2); printf("▲"); }
蓝色食物每10秒换位置:
//每10秒蓝色Food变换一次位置 ftime=(end-start) /1000; if(ftime % 10 == 0 && map2[B->y][B->x] == 5 && ftime != temp) { gotoxy(B->x,B->y); printf(" "); map2[B->y][B->x]=0; Initfood(S,B,F,5); temp=ftime; }
运行程序:
相关文章推荐
- c++ --> 构造函数与析构函数
- C 链表
- 浅谈工作中使用过的几种C++界面库
- 初学c++之template <typename T>
- c++模板学习
- C++ primer 箭头操作符重载心得体会
- uefi的c++编程支持new和delete
- 用C++写uefi程序
- 一起talk C栗子吧(第十二回:C语言实例--单链表一)
- C++ 调用system()函数的多命令合并
- 关于C++函数思考2(C++函数返回引用和返回非引用的区别)
- C语言(1) HelloWord 与JAVA对比
- C++和JAVA的区别
- 面试考题之9.2:链表(C/C++版)
- 用C++实现多线程Mutex锁(Win32)
- C++11:override 与 final
- C/C++ 语言中的表达式求值
- C语言多线程下不同等级日志的实现
- c++ 访问者模式
- c++在string类源