C语言版贪吃蛇(详解)
C语言贪吃蛇程序设计说明书
C语言贪吃蛇程序设计说明书题目:贪吃蛇游戏学校: 系别: 专业班级: 姓名: 学号: 指导老师: 日期:一、设计题目:贪吃蛇是一款经典的休闲游戏,一条蛇在密闭的围墙内,随机出现一个食物,通过控制方向键操作小蛇不停的朝着食物前进,直到吃掉食物。
每吃一个食物,小蛇都会长长一截,随之难度增大;当小蛇头撞到墙或自己时,小蛇死亡。
二、功能设计:本游戏要求实现以下几个功能:(1) 用上、下、左、右键控制游戏区蛇的运动方向,使之吃食而使身体变长;(2) 用户可以调节蛇的运行速度来选择不同的难度;(3) 游戏分多个难度级别;(4) 用户可自选颜色;(5) 记录成绩前五名的游戏玩家;(6) 增加背景音乐;(7) 提高障碍物和游戏级别。
三、程序模块图:贪吃蛇游戏初画控设帮始图制置助模模模模化块块块块墙蛇食移食死变成等音体身物动物亡长绩级效2四、算法流程图:开始初始化界面和蛇身放置食物获取按键开始运动碰到边界是否否蛇吃到食是蛇长大蛇死亡是继续否结束3五、函数原型与功能 1.主函数:void main()启动程序,触动其他函数。
2.初始化:void init ()设置背景框大小、蛇体初始值,随机产生食物。
3.随机产生食物:void setfoodcrd()设置食物生成坐标,0表示食物被吃。
4.画食物:void showfood()用矩形框来画食物5.画蛇:void showsnake()根据蛇的坐标和节数,循环用矩形框来画蛇。
6.蛇移动:void snakemove() 根据按键,重设坐标7.改变蛇的方向:void changeskdir()响应用户的运动方向8.判断蛇是否死亡:void judgeslod判断蛇是否碰到自己或墙。
9.判断蛇是否吃到食物:void judgefood()判断是否吃到食物,吃食后变0,蛇增长一节。
10.结束游戏:void gameover()结束话语,并执行下一步。
六、基本代码#include<graphics.h> #include<conio.h>#include<stdio.h>#pragma comment(lib,"Winmm.lib")#include "MyTimer.h" #define SIZEMAX 100 /*蛇最大长度*/ #define SPEED 100 /*初始速度*/ #define len 20 /*蛇宽度*/#define lm 10 /*蛇每次移动距离*/ #define initlen 600 /*初始化窗口正方形的长度*/ #define Min_snakelen 2 /*蛇的最小长度*/typedef struct {int x,y;}DIR;int snakelen=Min_snakelen; /*蛇的长度*/4int isfood=1; /*食物状态*/ int isover=0; /*游戏状态*/int ispause=1; /*暂停状态*/int ismusic=1; /*音乐播放状态*/ char dir; /*记录蛇运动的方向*/ char c='d';DIR snake[500],food; /*定义蛇节点和食物的类型*/ int speed=SPEED;void drawmap() /*画地图函数*/ {IMAGE img;char str[10];loadimage(&img,"贪吃蛇.jpg"); /*游戏界面*/putimage(0,0,&img);loadimage(&img,"7.jpg"); /*侧栏提示*/putimage(600,0,&img);sprintf(str,"%d",snakelen);setfont(30,0,"宋体");setbkmode(TRANSPARENT);outtextxy(620,10,"操作说明:");setfont(20,0,"宋体");outtextxy(615,50,"awsd控制方向键");outtextxy(615,80,"p键暂停");outtextxy(615,110,"o键继续");outtextxy(615,200,"esc键退出");outtextxy(615,140,"l键暂停音乐");outtextxy(615,170,"k键继续播放");outtextxy(730,250,str);outtextxy(620,250,"蛇当前长度");}void init() /*初始化蛇函数*/ {int i;IMAGE img;snake[0].x=9*len+lm;snake[0].y=4*len+lm;loadimage(&img,"1.jpg");putimage(snake[0].x-lm,snake[0].y-lm,&img); for(i=1;i<snakelen;i++){snake[i].x=len*(9-i)+lm;snake[i].y=len*4+lm;5loadimage(&img, "2.jpg");putimage(snake[i].x-lm,snake[i].y-lm, &img); }}void showsnake() /*画蛇函数*/ {int i;IMAGE img;loadimage(&img, "1.jpg");putimage(snake[0].x-lm,snake[0].y-lm , &img);loadimage(&img, "2.jpg");for(i=1;i<snakelen;i++)putimage(snake[i].x-lm,snake[i].y-lm, &img); }void snakemove() /*画动蛇函数*/ {int i;int mx=snake[0].x;int my=snake[0].y;switch(dir){case 'a':mx-=len;break;case 'd':mx+=len;break;case 'w':my-=len;break;case 's':my+=len;break;default:break;}for(i=snakelen-1;i>=0;i--){snake[i+1].x=snake[i].x;snake[i+1].y=snake[i].y;}snake[0].x=mx;snake[0].y=my;showsnake();}int ceshiover() /*检测游戏结束函数*/ {int i;if(snake[0].x<0||snake[0].x>30*len-lm||snake[0].y<0||snake[0].y>30*len-lm)return 1;for(i=1;i<snakelen;i++)6{if(snake[0].x==snake[i].x&&snake[0].y==snake[i].y) return 1;}return 0;}int foodinsnake() /*检测食物是否在蛇上函数*/ {for(int i=0;i<snakelen;i++)if(food.x==snake[i].x&&food.y==snake[i].y)return 1;elsereturn 0;}void showfood() /*画食物函数*/{IMAGE img;do{food.x=(rand()%30)*len+lm;food.y=(rand()%30)*len+lm;}while(foodinsnake());loadimage(&img, "3.jpg");putimage(food.x-lm,food.y-lm , &img);isfood=0;}void kmusic(){if(ismusic==0)mciSendString("pause mymusic",NULL,0,NULL);if(ismusic==1)mciSendString("resume mymusic",NULL,0,NULL);}void playbkmusic() /*播放背景音乐函数*/{mciSendString("open 超级玛丽.mp3 alias mymusic", NULL, 0, NULL); mciSendString("play mymusic repeat", NULL, 0, NULL);}void playgame() /*玩游戏函数*/{c='d'; //蛇开始向右移动isover=0;7snakelen=Min_snakelen;dir='d';IMAGE img;MyTimer t; //定义精确延时对象int T=200; // 延长时间drawmap(); //画游戏地图init(); //画小蛇初始位置while(!isover){if(ispause){snakemove();FlushBatchDraw(); //批量绘图EndBatchDraw(); //结束批量绘图if(snake[0].x==food.x&&snake[0].y==food.y){ snakelen++;isfood=1;}if(isfood)showfood();if(snakelen<35)T=200-3*snakelen;t.Sleep(T);BeginBatchDraw(); // 开始批量绘图模式,防止闪烁问题drawmap();loadimage(&img, "3.jpg"); // 加载食物图片putimage(food.x-lm,food.y-lm , &img);};//按键控制if(kbhit())c=getch();switch(c){case 'a':if(dir!='d'){dir=c;}break;case 'd':if(dir!='a'){dir=c;}break;case 'w':if(dir!='s'){8dir=c;}break;case 's':if(dir!='w'){dir=c;}break;case 27: exit(0); break; //游戏退出case 'p': ispause=0;break; //p暂停case 'o': ispause=1;break; //o继续游戏case 'l': ismusic=0;break; //l暂停音乐case 'k': ismusic=1;break; //k继续播放default:break;}kmusic(); //音乐控制播放//判断游戏结束if(ceshiover())isover=1;//判断是否重新再来HWND wnd = GetHWnd(); //获取窗口句柄if(isover)if (MessageBox(wnd, "游戏结束。
贪吃蛇(C语言知识学习)
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include <windows.h>//蛇头移动方向#define UP 1#define DOWN 2#define LEFT 3#define RIGHT 4//死亡判定(怼墙或怼自己)#define KISSASS 1#define KISSWALL 2//坐标转化#define POINT(x,y) ((y)*80+(x)+1) //将(x,y)坐标转化为一个int类数值#define GETX(x) (((x)-1)%80)//将int类数值提取出原先的x#define GETY(y) (((y)-1)/80)//同理,提取出yHANDLE Console;void Position(int x, int y); //移动光标到(x,y)//Windows.hvoid DrawMap();//画墙void ShowText(char *text);//根据字符串的长短智能打印出包围字符串的笑脸void ResetSnake();//初始化贪吃蛇int RefreshSnake();//更新蛇的移动void CreatFood();//生成食物void Draw();//画出蛇身和食物void RefreshScreen();//屏幕刷新void GameOver(int Type);//游戏结束条件int Gaming();//代码跑起来char play = 0; ////值为1则继续游戏,值为0游戏退出char pause = 0; //值为1则暂停,值为0游戏继续char direction; //蛇头方向int snake[500]; //snake[0]为蛇头int body; //蛇身体长度int newbody;//吃完食物新长的蛇身int addHead,deleteT ail;//增加蛇头擦去蛇尾,使贪吃蛇动起来int food = 0; //食物void main(){CONSOLE_CURSOR_INFO CurrInfo = { sizeof(CONSOLE_CURSOR_INFO), 0 };Console = GetStdHandle(STD_OUTPUT_HANDLE);DrawMap();ShowText("Copyright reserve by 张博元");while(Gaming()){if (play)DrawMap();};return 0;}void Position(int x, int y) //移动光标到(x,y)//Windows.h{COORD coors = { x, y };SetConsoleCursorPosition(Console, coors);}void DrawMap() //画墙{int i;for (i = 3; i < 70; i = i + 12){Position(i, 0);printf("===我是墙===");}for (i = 0; i < 25; i = i + 1){Position(0, i);printf("|| ");}for (i = 3; i < 70; i = i + 12){Position(i, 24);printf("============");}for (i = 0; i < 25; i = i + 1){Position(76, i);printf("|| ");}}void ShowText(char *text) //根据字符串的长短智能打印出包围字符串的笑脸{int i;int strLength = strlen(text); //得到字符串长度Position(40 - (strLength / 2)-1, 11);printf("%c", 1);for (i = 0; i < strLength + 2; i++){printf("%c", 1);}printf("%c", 1);Position(40 - (strLength / 2)-1, 12);printf("%c ", 1);printf(text);printf(" %c", 1);Position(40 - (strLength / 2)-1, 13);printf("%c", 1);for (i = 0; i < strLength + 2; i++){printf("%c", 1);}printf("%c", 1);}void ResetSnake() //初始化贪吃蛇{int x, y;for (x = 39, y = 0; y < 2; y++){snake[y] = POINT(x, 7 - y);}body = 2; //设定蛇身初始长度为2newbody = 6;addHead = 0;deleteTail = 0;direction = LEFT;}int RefreshSnake() //更新蛇的移动//返回值为1游戏结束{int x, y;memcpy(snake + 1, snake, sizeof(int)*body); if (!newbody){deleteTail = snake[body];snake[body] = 0;}else{body++;newbody--;}x = GETX(snake[0]);y = GETY(snake[0]);switch (direction) //控制蛇头移动方向{case UP:y -= 1; //蛇头向上移动一格(对应坐标y-1)snake[0] = POINT(x, y);break;case DOWN:y += 1;snake[0] = POINT(x, y);break;case LEFT:x -= 1;snake[0] = POINT(x, y);break;case RIGHT:x += 1;snake[0] = POINT(x, y);break;}addHead = snake[0];if (x > 75 || x < 3 ||y > 23 || y < 1) //检测是否撞墙{GameOver(KISSWALL);return 1;}int i;for (i = 1; i < body; i++)if (snake[0] == snake[i]) //检测是否撞到自己身体{GameOver(KISSASS);return 1;}if (snake[0] == food){while (1) //食物的位置不与蛇身重合{food = (rand() % (75 * 23)) ;for (i = 0; snake[i]; i++)if (food == snake[i]) //检测是否吃到食物,吃到则reset食物food = 0;if (food) //如果food==0则重新建立一个食物坐标break;}CreatFood(); //吃了?再来一个!newbody = (rand() % 6) + 1; //吃完食物蛇身增长一节}return 0;}void CreatFood() //生成食物{if (GETX(food) > 75 || GETX(food) < 3 || GETY(food) > 23 || GETY(food) < 1) CreatFood;elsePosition(GETX(food), GETY(food));printf("%c",4);}void Draw() //画出蛇身和食物{system("cls");int i;for (i = 0; snake[i]; i++){Position(GETX(snake[i]), GETY(snake[i]));printf("%c",1);}CreatFood();}void RefreshScreen() //屏幕刷新{if (deleteT ail){Position(GETX(deleteTail), GETY(deleteTail));printf(" ");}if (addHead){Position(GETX(addHead), GETY(addHead));printf("%c",1);}addHead = deleteT ail = 0;}void GameOver(int Type) //游戏结束条件{switch (Type){case KISSASS://撞到自己身体ShowText("NOOB!当你以光速绕着一棵树奔跑就会发现自己在怼自己!");break;case KISSWALL://撞墙ShowText("NOOB!你有考虑过墙的感受吗→→");}food = 0;play = 0;memset(snake, 0, sizeof(int) * 500); //内存初始化}int Gaming() //执行int KeyboardInput;Sleep(60);//速度if (kbhit()){KeyboardInput = getch();if (KeyboardInput == 0 || KeyboardInput == 0xE0) {KeyboardInput = getch();switch (KeyboardInput) //方向控制{case 72:if (direction != DOWN)direction = UP;break;case 80:if (direction != UP)direction = DOWN;break;case 75:if (direction != RIGHT)direction = LEFT;break;case 77:if (direction != LEFT)direction = RIGHT;break;}}if (KeyboardInput == '\r') //暂停{if (!play){play = 1;if (pause){Draw();pause = 0;}}else{ShowText("不许暂停,继续怼!!");play = 0;pause = 1;}}else if (KeyboardInput == 0x1B) //退出return 0;}if (play){if (!food){srand(clock());food = (rand() % (75 * 23));ResetSnake();Draw();}else{if (!RefreshSnake()){RefreshScreen();}}}return 1;}// Allrights reserve by 博元。
C语言贪吃蛇 新手绝对看得懂 有注释
//tm_sec(表示秒)之类的是固定类型 不能换成其它的。
Count(1900+timeinfo->tm_year,1+timeinfo->tm_mon,timeinfo->tm_mday);
sum=sum+1;
//printf("%d",sum);
Select(sum);
}
}
}
/******************************************************************************************/
GotoXY(N+26,9);cout<<(" ║ A/a/4:往左移动 ║ ");
GotoXY(N+27,10);cout<<(" ║ ║ ");
else
sum=sum+day+a[11]+a[10]-27;
//printf("%d",sum);
Select(sum);
}
else//年份大于2014年时
{
int i;
for(i=1;i<=step-1;i++)
完整版C语言贪吃蛇设计思路和代码详解
完整版C语言贪吃蛇设计思路和代码详解到了本章,你已经学完了大部分C语言的基础知识,详细讲解贪吃蛇代码的条件就具备了。
本教程教你编写的贪吃蛇不依赖TC环境,不依赖任何第三方库,可以在VC 6.0、VS等常见IDE中编译通过,请看下图:更多效果图请查看:游戏初始化、游戏进行中、游戏结束。
请大家先把贪吃蛇的源码下载下来浏览一下,我们再具体分析,这样将会有更好的效果。
贪吃蛇源代码下载:提取密码:81qm贪吃蛇设计思路上图中的红色空心方框(?)表示边框,是贪吃蛇的边界,贪吃蛇不能碰到它,否则就“死掉”,游戏结束。
绿色实心方框(?)表示贪吃蛇的活动范围,贪吃蛇可以自由移动,食物(苹果)也会随机出现在这个区域。
我们不妨将贪吃蛇的活动范围称为“贪吃蛇地图”,而加上边框就称为“全局地图”。
我们需要记录地图中每一个节点的信息,包括:位置:也就是第几行几列;类型:这个节点出现的是贪吃蛇、食物、边框,还是什么都没有(绿色的背景)。
索引:也就是数组下标,稍后会说明是什么意思。
所以需要定义一个结构体二维数组:struct{char type;int index;}globalMap[MAXWIDTH][MAXHEIGHT];用一维下标和二维下标表示位置;用 type 表示类型,不同的类型用不同的数字代表;用 index 表示索引。
直观上讲,应该将 type 定义为int类型,不过int占用四个字节,而节点类型的取值范围非常有限,一个字节就足够了,所以为了节省内存才定义为char类型。
同时,再建立一个足够大的一维数组,让贪吃蛇在数组内活动:struct{int x;int y;} snakeMap[ (MAXWIDTH-2)*(MAXHEIGHT-2) ]x、y 表示行和列,也就是 globalMap 数组的两个下标。
globalMap 数组中的索引 index 就是 snakeMap 数组的下标。
globalMap 表示了所有节点的信息,而 snakeMap 只表示了贪吃蛇的活动区域。
贪吃蛇游戏(printf输出C语言版本)
贪吃蛇游戏(printf输出C语⾔版本)这⼀次我们应⽤printf输出实现⼀个经典的⼩游戏—贪吃蛇,主要难点是⼩蛇数据如何存储、如何实现转弯的效果、吃到⾷物后如何增加长度。
1 构造⼩蛇⾸先,在画⾯中显⽰⼀条静⽌的⼩蛇。
⼆维数组canvas[High][Width]的对应元素,值为0输出空格,-1输出边框#,1输出蛇头@,⼤于1的正数输出蛇⾝*。
startup()函数中初始化蛇头在画布中间位置(canvas[High/2][Width/2] = 1;),蛇头向左依次⽣成4个蛇⾝(for (i=1;i<=4;i++) canvas[High/2][Width/2-i] = i+1;),元素值分别为2、3、4、5。
1 #include <stdio.h>2 #include <stdlib.h>3 #include <conio.h>4 #include <windows.h>5//C语⾔⾃学⽹6#define High 20 // 游戏画⾯尺⼨7#define Width 3089// 全局变量10int canvas[High][Width] = {0}; // ⼆维数组存储游戏画布中对应的元素11// 0为空格,-1为边框#,1为蛇头@,⼤于1的正数为蛇⾝*1213void gotoxy(int x,int y) //光标移动到(x,y)位置14 {15 HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);16 COORD pos;17 pos.X = x;18 pos.Y = y;19 SetConsoleCursorPosition(handle,pos);20 }2122void startup() // 数据初始化23 {24int i,j;2526// 初始化边框27for (i=0;i<High;i++)28 {29 canvas[i][0] = -1;30 canvas[i][Width-1] = -1;31 }32for (j=0;j<Width;j++)33 {34 canvas[0][j] = -1;35 canvas[High-1][j] = -1;36 }3738// 初始化蛇头位置39 canvas[High/2][Width/2] = 1;40// 初始化蛇⾝,画布中元素值分别为2,3,4,5....41for (i=1;i<=4;i++)42 canvas[High/2][Width/2-i] = i+1;43 }4445void show() // 显⽰画⾯46 {47 gotoxy(0,0); // 光标移动到原点位置,以下重画清屏48int i,j;49for (i=0;i<High;i++)50 {51for (j=0;j<Width;j++)52 {53if (canvas[i][j]==0)54 printf(""); // 输出空格55else if (canvas[i][j]==-1)56 printf("#"); // 输出边框#57else if (canvas[i][j]==1)58 printf("@"); // 输出蛇头@59else if (canvas[i][j]>1)60 printf("*"); // 输出蛇⾝*61 }62 printf("\n");63 }64 }6566void updateWithoutInput() // 与⽤户输⼊⽆关的更新67 {68 }6970void updateWithInput() // 与⽤户输⼊有关的更新71 {72 }7374int main()75 {76 startup(); // 数据初始化77while (1) // 游戏循环执⾏78 {79 show(); // 显⽰画⾯80 updateWithoutInput(); // 与⽤户输⼊⽆关的更新81 updateWithInput(); // 与⽤户输⼊有关的更新82 }83return0;84 }2 ⼩蛇⾃动移动实现⼩蛇的移动是贪吃蛇游戏的难点,下图列出了⼩蛇分别向右、向上运动后,对应⼆维数组元素值的变化,从中我们可以得出实现思路。
C语言贪吃蛇全部程序及说明Word版
#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <string.h>#include <time.h>const int H = 8; //地图的高const int L = 16; //地图的长char GameMap[H][L]; //游戏地图int key; //按键保存int sum = 1, over = 0; //蛇的长度, 游戏结束(自吃或碰墙)int dx[4] = {0, 0, -1, 1}; //左、右、上、下的方向int dy[4] = {-1, 1, 0, 0};struct Snake //蛇的每个节点的数据类型{int x, y; //左边位置int now; //保存当前节点的方向, 0,1,2,3分别为左右上下}Snake[H*L];const char Shead = '@'; //蛇头const char Sbody = '#'; //蛇身const char Sfood = '*'; //食物const char Snode = '.'; //'.'在地图上标示为空void Initial(); //地图的初始化void Create_Food(); //在地图上随机产生食物void Show(); //刷新显示地图void Button(); //取出按键,并判断方向void Move(); //蛇的移动void Check_Border(); //检查蛇头是否越界void Check_Head(int x, int y); //检查蛇头移动后的位置情况int main(){Initial();Show();return 0;}void Initial() //地图的初始化{int i, j;int hx, hy;system("title 贪吃蛇"); //控制台的标题memset(GameMap, '.', sizeof(GameMap)); //初始化地图全部为空'.' system("cls");srand(time(0)); //随机种子hx = rand()%H; //产生蛇头hy = rand()%L;GameMap[hx][hy] = Shead;Snake[0].x = hx; Snake[0].y = hy;Snake[0].now = -1;Create_Food(); //随机产生食物for(i = 0; i < H; i++) //地图显示{for(j = 0; j < L; j++)printf("%c", GameMap[i][j]);printf("\n");}printf("\n小小C语言贪吃蛇\n");printf("按任意方向键开始游戏\n");getch(); //先接受一个按键,使蛇开始往该方向走Button(); //取出按键,并判断方向}void Create_Food() //在地图上随机产生食物{int fx, fy;while(1){fx = rand()%H;fy = rand()%L;if(GameMap[fx][fy] == '.') //不能出现在蛇所占有的位置{GameMap[fx][fy] = Sfood;break;}}}void Show() //刷新显示地图{int i, j;while(1){_sleep(500); //延迟半秒(1000为1s),即每半秒刷新一次地图Button(); //先判断按键在移动Move();if(over) //自吃或碰墙即游戏结束{printf("\n**游戏结束**\n");printf("你的得分:%d\n",sum=10*(sum-1));getchar();break;}system("cls"); //清空地图再显示刷新吼的地图for(i = 0; i < H; i++){for(j = 0; j < L; j++)printf("%c", GameMap[i][j]);printf("\n");}printf("\n小小C语言贪吃蛇\n");printf("按任意方向键开始游戏\n");}}void Button() //取出按键,并判断方向{if(kbhit() != 0) //检查当前是否有键盘输入,若有则返回一个非0值,否则返回0 {while(kbhit() != 0) //可能存在多个按键,要全部取完,以最后一个为主key = getch(); //将按键从控制台中取出并保存到key中switch(key){ //左case 75: Snake[0].now = 0;break;//右case 77: Snake[0].now = 1;break;//上case 72: Snake[0].now = 2;break;//下case 80: Snake[0].now = 3;break;}}}void Move() //蛇的移动{int i, x, y;int t = sum; //保存当前蛇的长度//记录当前蛇头的位置,并设置为空,蛇头先移动x = Snake[0].x; y = Snake[0].y; GameMap[x][y] = '.';Snake[0].x = Snake[0].x + dx[ Snake[0].now ];Snake[0].y = Snake[0].y + dy[ Snake[0].now ];Check_Border(); //蛇头是否越界Check_Head(x, y); //蛇头移动后的位置情况,参数为: 蛇头的开始位置if(sum == t) //未吃到食物即蛇身移动哦for(i = 1; i < sum; i++) //要从蛇尾节点向前移动哦,前一个节点作为参照{if(i == 1) //尾节点设置为空再移动GameMap[ Snake[i].x ][ Snake[i].y ] = '.';if(i == sum-1) //为蛇头后面的蛇身节点,特殊处理{Snake[i].x = x;Snake[i].y = y;Snake[i].now = Snake[0].now;}else //其他蛇身即走到前一个蛇身位置{Snake[i].x = Snake[i+1].x;Snake[i].y = Snake[i+1].y;Snake[i].now = Snake[i+1].now;}GameMap[ Snake[i].x ][ Snake[i].y ] = '#'; //移动后要置为'#'蛇身}}void Check_Border() //检查蛇头是否越界{if(Snake[0].x < 0 || Snake[0].x >= H|| Snake[0].y < 0 || Snake[0].y >= L)over = 1;}void Check_Head(int x, int y) //检查蛇头移动后的位置情况{if(GameMap[ Snake[0].x ][ Snake[0].y ] == '.') //为空GameMap[ Snake[0].x ][ Snake[0].y ] = '@';elseif(GameMap[ Snake[0].x ][ Snake[0].y ] == '*') //为食物{GameMap[ Snake[0].x ][ Snake[0].y ] = '@';Snake[sum].x = x; //新增加的蛇身为蛇头后面的那个Snake[sum].y = y;Snake[sum].now = Snake[0].now;GameMap[ Snake[sum].x ][ Snake[sum].y ] = '#';sum++;Create_Food(); //食物吃完了马上再产生一个食物}elseover = 1;}。
C语言项目案例之贪吃蛇
C语⾔项⽬案例之贪吃蛇项⽬案例:贪吃蛇下载链接:1. 初始化墙代码:// 初始化墙void init_wall(void){for (size_t y = 0; y <= HIGH; ++y){for (size_t x = 0; x <= WIDE; ++x){if (x == WIDE || y == HIGH) // 判断是否到墙{printf("=");}else{printf(" ");}}printf("\n");}}效果:2. 定义蛇和⾷物类型typedef struct{int x;int y;}FOOD; // ⾷物typedef struct{int x;int y;}BODY; // ⾝体typedef struct{int size; // ⾝体长度BODY body[WIDE*HIGH];}SNAKE; // 蛇3. 初始化蛇和⾷物// 定义⼀个蛇和⾷物SNAKE snake;FOOD food;// 初始化⾷物void init_food(void){food.x = rand() % WIDE; // 随机⽣成坐标food.y = rand() % HIGH;}// 初始化蛇void init_snake(void){snake.size = 2;// 将蛇头初始化到墙中间snake.body[0].x = WIDE / 2;snake.body[0].y = HIGH / 2;// 蛇⾝紧跟蛇头snake.body[1].x = WIDE / 2 - 1;snake.body[1].y = HIGH / 2;}4. 显⽰UI// 显⽰UIvoid showUI(void){// 显⽰⾷物// 存放光标位置COORD coord;coord.X = food.x;coord.Y = food.y;// 光标定位SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); putchar('$');// 显⽰蛇for (size_t i = 0; i < snake.size; ++i){// 设置光标coord.X = snake.body[i].x;coord.Y = snake.body[i].y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); if (i == 0)}else{putchar('#');}}}效果:最终代码// main.c#define _CRT_SECURE_NO_WARNINGS#include "./snakeGame.h"int main(void){// 取消光标CONSOLE_CURSOR_INFO cci;cci.bVisible = FALSE; // 取消光标cci.dwSize = sizeof(cci);SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cci); system("color 2");printf("欢迎来到贪吃蛇\n准备好了吗?按s/S开始,q/Q退出\n"); char ch = _getch();switch (ch){case 's':case 'S':system("color 0");system("cls");break;default:return 0;}init_wall();init_food();init_snake();showUI();playGame();return 0;}// snakeGame.c#include "./snakeGame.h"// 定义⼀个蛇和⾷物SNAKE snake;FOOD food;// ⽅向增量int dx = 0;int dy = 0;int lx, ly; // 尾节点// 初始化⾷物void init_food(void){food.x = rand() % WIDE; // 随机⽣成坐标food.y = rand() % HIGH;}// 初始化蛇void init_snake(void){snake.size = 2;snake.fraction = 0;// 将蛇头初始化到墙中间snake.body[0].x = WIDE / 2;snake.body[0].y = HIGH / 2;snake.body[1].x = WIDE / 2 - 1;snake.body[1].y = HIGH / 2;}// 初始化墙void init_wall(void){for (size_t y = 0; y <= HIGH; ++y){for (size_t x = 0; x <= WIDE; ++x){if (x == WIDE || y == HIGH) // 判断是否到墙{printf("=");}else{printf(" ");}}printf("\n");}printf("分数:0\n");}// 显⽰UIvoid showUI(void){// 显⽰⾷物// 存放光标位置COORD coord;coord.X = food.x;coord.Y = food.y;// 光标定位SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);putchar('$');// 显⽰蛇for (size_t i = 0; i < snake.size; ++i){// 设置光标coord.X = snake.body[i].x;coord.Y = snake.body[i].y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);if (i == 0){putchar('@');}else{putchar('#');}}// 处理尾节点coord.X = lx;coord.Y = ly;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);putchar(' ');coord.X = WIDE;coord.Y = HIGH;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);printf("\n分数:%d\n",snake.fraction);}void playGame(void){COORD _coord;system("color 7");char key = 'D';// 蛇不能撞墙while (snake.body[0].x >= 0 && snake.body[0].x <= WIDE && snake.body[0].y >= 0 && snake.body[0].y <= HIGH) {// 蛇不能撞⾃⼰for (size_t i = 1; i < snake.size; ++i){if (snake.body[0].x == snake.body[i].x && snake.body[0].y == snake.body[i].y){goto OVER;}}// 撞⾷物if (snake.body[0].x == food.x && snake.body[0].y == food.y){++snake.size;++snake.fraction;// 随机出现⾷物init_food();}// 控制蛇移动// 判断是否按下按键if (_kbhit()){key = _getch(); // 不需要敲回车,按下就⽴马确认}// 判断W A S D中哪个按键按下switch (key){case 'w':case 'W':dx = 0;dy = -1;break;case 'a':case 'A':dx = -1;dy = 0;break;case 's':case 'S':dx = 0;dy = 1;break;case 'd':dx = 1;dy = 0;break;case 'q':case 'Q':_coord.X = WIDE;_coord.Y = HIGH;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), _coord); putchar('\n');return;}// 蛇移动// 记录尾节点位置lx = snake.body[snake.size - 1].x;ly = snake.body[snake.size - 1].y;for (size_t i = snake.size - 1; i > 0; --i){snake.body[i].x = snake.body[i - 1].x;snake.body[i].y = snake.body[i - 1].y;}// 更新蛇头snake.body[0].x += dx;snake.body[0].y += dy;showUI();Sleep(500); // 延时}// 游戏结束OVER:system("color 4");_coord.X = 6;_coord.Y = HIGH + 1;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), _coord); printf("\n游戏结束");printf("按r/R重新开始,按q/Q退出\n");char _key;_key = _getch();switch (_key){case 'r':case 'R':system("cls");init_wall();init_food();init_snake();showUI();playGame();case 'Q':case 'q':default:system("color 7");return;}}// snakeGame.h#pragma once#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <Windows.h>#define WIDE 60 // 长#define HIGH 20 // ⾼typedef struct{int x;int y;}FOOD; // ⾷物typedef struct{int x;int y;}BODY; // ⾝体typedef struct{int size; // ⾝体长度int fraction; // 分数BODY body[WIDE*HIGH];}SNAKE; // 蛇void init_wall(void);void init_food(void);void init_snake(void);void showUI(void);void playGame(void);。
超简单贪吃蛇c语言代码编写
超简单贪吃蛇c语言代码编写贪吃蛇其实就是实现以下几步——1:蛇的运动(通过“画头擦尾”来达到蛇移动的视觉效果)2:生成食物3:蛇吃食物(实现“画头不擦尾”)4:游戏结束判断(也就是蛇除了食物,其余东西都不能碰)#include<stdio.h>#include<stdlib.h>#include<windows.h>#include<conio.h>#include<time.h>#define width 60#define hight 25#define SNAKESIZE 200//蛇身的最长长度int key=72;//初始化蛇的运动方向,向上int changeflag=1;//用来标识是否生成食物,1表示蛇还没吃到食物,0表示吃到食物int speed=0;//时间延迟struct {int len;//用来记录蛇身每个方块的坐标int x[SNAKESIZE];int y[SNAKESIZE];int speed;}snake;struct{int x;int y;}food;void gotoxy(int x,int y)//调用Windows的API函数,可以在控制台的指定位置直接操作,这里可暂时不用深究{COORD coord;coord.X = x;coord.Y = y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); }//■○void drawmap(){//打印图框for (int _y = 0; _y < hight; _y++){for (int x = 0; x < width; x+=2){if (x == 0 || _y == 0 || _y == hight - 1 || x == width - 2){gotoxy(x, _y);printf("■");}}}//打印蛇头snake.len=3;snake.x[0]=width/2;snake.y[0]=hight/2;gotoxy(snake.x[0],snake.y[0]);printf("■");//打印蛇身for(int i=1;i<snake.len;i++){snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1]+1;gotoxy(snake.x[i],snake.y[i]);printf("■");}//初始化食物的位置food.x=20;food.y=20;gotoxy(food.x,food.y);printf("○");}/**控制台按键所代表的数字*“↑”:72*“↓”:80*“←”:75*“→”:77*/void snake_move()//按键处理函数{int history_key=key;if (_kbhit()){fflush(stdin);key = _getch();key = _getch();}if(changeflag==1)//还没吃到食物,把尾巴擦掉{gotoxy(snake.x[snake.len-1],snake.y[snake.len-1]);printf(" ");}for(int i=snake.len-1;i>0;i--){snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1];}if(history_key==72&&key==80)key=72;if(history_key==80&&key==72)key=80;if(history_key==75&&key==77)key=75;if(history_key==77&&key==75)key=77;switch(key){case 72:snake.y[0]--;break;case 75:snake.x[0]-= 2;break;case 77:snake.x[0]+= 2;break;case 80:snake.y[0]++;break;}gotoxy(snake.x[0],snake.y[0]);printf("■");gotoxy(0,0);changeflag=1;}void creatfood(){if(snake.x[0] == food.x && snake.y[0] == food.y)//只有蛇吃到食物,才能生成新食物{changeflag=0;snake.len++;if(speed<=100)speed+=10;while(1){srand((unsigned int) time(NULL));food.x=rand()%(width-6)+2;//限定食物的x范围不超出围墙,但不能保证food.x 为偶数food.y=rand()%(hight-2)+1;for(int i=0;i<snake.len;i++){if(food.x==snake.x[i]&&food.y==snake.y[i])//如果产生的食物与蛇身重合则退出break;}if(food.x%2==0)break;//符合要求,退出循环}gotoxy(food.x,food.y);printf("○");}}bool Gameover(){//碰到围墙,OVERif(snake.x[0]==0||snake.x[0]==width-2)return false;if(snake.y[0]==0||snake.y[0]==hight-1) return false;//蛇身达到最长,被迫OVERif(snake.len==SNAKESIZE)return false;//头碰到蛇身,OVERfor(int i=1;i<snake.len;i++){if(snake.x[0]==snake.x[i]&&snake.y[0]==snake.y[i])return false;}return true;}int main(){system("mode con cols=60 lines=27");drawmap();while(Gameover()){snake_move();creatfood();Sleep(350-speed);//蛇的移动速度}return 0;}。
c语言贪吃蛇
c语言贪吃蛇本文实例为大家分享了C语言实现简单贪吃蛇游戏的具体代码,供大家参考,具体内容如下:用指针数组来表示蛇,p[0]表示蛇头控制方向:w,s,a,d-->上下左右 j,k-->加速、减速键盘控制需要用到线程代码:#include <stdio.h>#include <pthread.h>#include <stdlib.h>#include <time.h>#include <unistd.h>#define X 20#define Y 40char head='@';//蛇头的形状char body='O';//蛇身的形状char a[X][Y]={'O','O','O','@'};char *p[X*Y]={&a[0][3],&a[0][2],&a[0][1],&a[0][0]};//p[0]表示蛇头int n=3; //蛇身的长度(不带蛇头)int i,j;int f=1; //标志位:1.右;2.上;3.左;4.下;-1.退出int us=200000;//用于usleep,延时0.2秒void right(){*p[n]=0;for(i=n;i>0;i--){p[i]=p[i-1];}*p[0]=body;p[0]=p[0]+1;//蛇头向右移*p[0]=head;}void left(){*p[n]=0;for(i=n;i>0;i--) {p[i]=p[i-1];}*p[0]=body;p[0]=p[0]-1;*p[0]=head;}void down(){*p[n]=0;for(i=n;i>0;i--) {p[i]=p[i-1];}*p[0]=body;p[0]=p[0]+Y;*p[0]=head;}void up(){*p[n]=0;for(i=n;i>0;i--) {p[i]=p[i-1];}*p[0]=body;p[0]=p[0]-Y;*p[0]=head;}void show(){system("clear"); for(i=0;i<Y;i++) printf("-"); printf("\n");for(i=0;i<X;i++){for(j=0;j<Y;j++){if(a[i][j]==0)printf(" ");elseprintf("%c",a[i][j]);}printf("\n");}for(i=0;i<Y;i++)printf("-");printf("\nw,s,a,d->上下左右;j,k->加减速;ESC退出\n"); }int ran()//随机数生成*{srand(time(NULL));lb:i=rand()%X;j=rand()%Y;//随机位置的值为0,则产生*;否则继续找随机位置if(a[i][j]==0)a[i][j]='*';elsegoto lb;}void eat(){if(f==1)//右{if(*(p[0]+1)=='*'){n++;//长度增加p[n]=p[n-1];ran();//随机数生成*}}if(f==2)//上{if(*(p[0]-Y)=='*'){n++;//长度增加p[n]=p[n-1];ran();//随机数生成*}}if(f==3)//左{if(*(p[0]-1)=='*'){n++;//长度增加p[n]=p[n-1];ran();//随机数生成*}}if(f==4)//下{if(*(p[0]+Y)=='*'){n++;//长度增加p[n]=p[n-1];ran();//随机数生成*}}}void fail(){if(p[0]<&a[0][0]||p[0]>&a[X-1][Y-1])//蛇头不在矩阵内{printf("fail!\n");f=-1;}if(f==1)//右{for(i=n;i>0;i--){if((p[0]+1)==p[i])//右边是自己的身体{printf("fail!\n");f=-1;}}}if(f==2)//上{for(i=n;i>0;i--){if((p[0]-Y)==p[i])//上边是自己的身体{printf("fail!\n");f=-1;}}}if(f==3)//左{for(i=n;i>0;i--){if((p[0]-1)==p[i])//左边是自己的身体{printf("fail!\n");f=-1;}}}if(f==4)//下{for(i=n;i>0;i--){if((p[0]+Y)==p[i])//下边是自己的身体{printf("fail!\n");f=-1;}}}}void *key(void *arg)//控制方向:w,s,a,d-->上下左右{char k;while(1){k=getchar();if(k=='w')//上f=2;if(k=='s')//下f=4;if(k=='a')//左f=3;if(k=='d')//右f=1;if(k=='j')//加速us=us*4/5;if(k=='k')//减速us=us*5/4;if(k==27)//ESC{printf("退出!\n");f=-1;}usleep(100);}}int main(){system("stty -icanon");//关闭缓冲区,输入字符无需回车直接接受pthread_t pid;pthread_create(&pid , NULL , key , NULL);//创建线程,键盘控制ran();while(1){show(); //显示usleep(us);fail(); //判断是否会咬到自己eat(); //判断是否能吃到*if(f==1)//右right();if(f==2)//上up();if(f==3)//左left();if(f==4)//下down();if(f==-1)//退出{pthread_cancel(pid);//关闭线程return -1;}}return 0; }。
C语言实现贪吃蛇游戏(命令行)
C语⾔实现贪吃蛇游戏(命令⾏)这是⼀个纯C语⾔写的贪吃蛇游戏,供⼤家参考,具体内容如下#include<stdio.h>#include<stdlib.h>#include<windows.h>#include<time.h>#include<conio.h>#define SNAKE_LENGTH 100//定义蛇的最⼤长度#define SCREEN_WIDETH 80#define SCREEN_HEIGHT 30//定义每⼀节蛇的坐标struct coor{int x;int y;};//枚举⽅向enum CH {right = VK_RIGHT,left = VK_LEFT,up = VK_UP,down = VK_DOWN};//定义蛇的属性struct snake{int len;//当前蛇的长度struct coor coord[SNAKE_LENGTH];//每⼀节蛇的坐标enum CH CH;//定义蛇的⽅向int SPEED;int flag;//定义蛇的状态 1表⽰存活 0表⽰死亡}snake;//光标移动函数void gotoxy(int x, int y){COORD pos;pos.X = x;pos.Y = y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);}//初始化游戏界⾯void init_sence(){//初始化上下墙for (int i = 0; i < SCREEN_WIDETH; i += 2){gotoxy(i,0);printf("■");gotoxy(i, SCREEN_HEIGHT);printf("■");}//初始化左右墙for (int i = 0; i <=SCREEN_HEIGHT; i++){gotoxy(0, i);printf("■");gotoxy(SCREEN_WIDETH,i);printf("■");}//打印提⽰信息gotoxy(SCREEN_WIDETH + 5, 2);printf("\t\t贪吃蛇");gotoxy(SCREEN_WIDETH + 5, 6);printf("2018//12//1");gotoxy(SCREEN_WIDETH + 5, 8);printf("作者:⼩⾖芽");gotoxy(SCREEN_WIDETH + 5, 10);printf("F1:加速\tF2:减速");gotoxy(SCREEN_WIDETH + 5, 12);printf("CTRL:继续\t空格:暂停");gotoxy(SCREEN_WIDETH + 5, 14);printf("ESC:退出游戏");gotoxy(SCREEN_WIDETH + 5, 28);printf("建议:QQ:2862841130:::");}struct foodcoord {int x;int y;int flag;//定义⾷物的状态}food;//**这是c程序**#include"snake.h"//蛇的移动void move_snake();//画出蛇void draw_snake();//产⽣⾷物void creatfood();//判断蛇是否吃到⾷物void eatfood();//判断蛇是否死掉void SnakeState();int main(){//设置窗⼝⼤⼩system("mode con cols=110 lines=31");//设置标题SetConsoleTitleA("贪吃蛇");//初始化蛇begin:snake.CH = VK_RIGHT;//初始化⽅向snake.len = 5; //初始化长度snake.SPEED = 300;//初始化蛇的移动速度snake.coord[1].x = SCREEN_WIDETH / 2;//初始化蛇头的坐标 snake.coord[1].y = SCREEN_HEIGHT / 2;snake.coord[2].x = SCREEN_WIDETH / 2-2;//初始化蛇头的坐标 snake.coord[2].y = SCREEN_HEIGHT / 2;snake.coord[3].x = SCREEN_WIDETH / 2-4;//初始化蛇头的坐标 snake.coord[3].y = SCREEN_HEIGHT / 2;//初始化⾷物状态food.flag = 1;//1表⽰吃到⾷物 0表⽰没有吃到⾷物//初始化⾷物状态snake.flag = 1;//1活 0死init_sence();//初始化游戏界⾯while (1){draw_snake();//画蛇Sleep(snake.SPEED);//蛇的移动速度move_snake();//移动蛇if(food.flag)creatfood();//产⽣⾷物eatfood();//判断是否吃到⾷物SnakeState();//判断蛇是否死亡if (!snake.flag)break;}system("cls");gotoxy(SCREEN_WIDETH/2, SCREEN_HEIGHT/2-4);printf(" GAME OVER");gotoxy(SCREEN_WIDETH / 2-6, SCREEN_HEIGHT / 2+2);printf("你的得分是:\t\t\t%d ",snake.len-1);gotoxy(SCREEN_WIDETH / 2-6, SCREEN_HEIGHT / 2+4);printf("我不服再来:\t\t\tCTRL ");gotoxy(SCREEN_WIDETH / 2-6, SCREEN_HEIGHT / 2+6);printf("算了垃圾游戏毁我青春:\t\tESC");while (1){if (GetAsyncKeyState(VK_CONTROL)){system("cls");goto begin;}else if (GetAsyncKeyState(VK_ESCAPE))return 0;}}//蛇的移动void move_snake(){//判断是否有按键操作if (GetAsyncKeyState(up)){if(snake.CH!=down)snake.CH = up;}else if (GetAsyncKeyState(down)){if (snake.CH != up)snake.CH = down;}else if (GetAsyncKeyState(right)){if (snake.CH != left)snake.CH = right;}else if (GetAsyncKeyState(left)){if (snake.CH != right)snake.CH = left;}else if (GetAsyncKeyState(VK_F1)){if(snake.SPEED>=100)snake.SPEED -= 50;}else if (GetAsyncKeyState(VK_F2)){if (snake.SPEED <= 3000)snake.SPEED += 100;}//根据检测到的⽅向改变蛇头的位置switch (snake.CH){case right:snake.coord[1].x += 2; break;case left:snake.coord[1].x -= 2; break;case up:snake.coord[1].y -= 1; break;case down:snake.coord[1].y += 1; break;}}//画出蛇void draw_snake(){//画出蛇头gotoxy(snake.coord[1].x, snake.coord[1].y);printf("□");//画出蛇⾝,直接⼀个for循环实现for (int i = 2; i <= snake.len; i++){gotoxy(snake.coord[i].x, snake.coord[i].y);printf("□");}//擦掉尾巴gotoxy(snake.coord[snake.len].x, snake.coord[snake.len].y); printf(" ");//遍历每⼀节蛇for (int i = snake.len; i >1; i--){snake.coord[i].x = snake.coord[i - 1].x;snake.coord[i].y = snake.coord[i - 1].y;}gotoxy(0, 0);printf("■");gotoxy(85, 25);printf("得分:%d ", snake.len-1);}//产⽣⾷物void creatfood(){//随机种⼦⽣成srand((unsigned)time(NULL));if(food.flag)while (1){food.x = rand() % 80;food.y = rand() % 30;if (food.x % 2 == 0 && food.x >= 2 && food.x <= 78 && food.y > 1 && food.y < 30){int flag = 0;//判断产⽣的⾷物可不可能在蛇的⾝体上for (int i = 1; i <= snake.len; i++){if (snake.coord[i].x == food.x&&snake.coord[i].y == food.y){flag = 1;break;}}if (flag)continue;//绘制⾷物else{gotoxy(food.x, food.y);printf("⊙");food.flag = 0;break;}}}food.flag = 0;}//判断蛇是否吃到⾷物void eatfood(){//只需要判断蛇头是否与⾷物重合if (food.x == snake.coord[1].x&&food.y == snake.coord[1].y){snake.len+=1;food.flag = 1;}}//判断蛇是否死掉void SnakeState(){if (snake.coord[1].x < 2 || snake.coord[1].x>78 || snake.coord[1].y < 1 || snake.coord[1].y>29) snake.flag = 0;for (int i = 2; i <= snake.len; i++){if (snake.coord[1].x == snake.coord[i].x&&snake.coord[1].y == snake.coord[i].y)snake.flag = 0;}}更多有趣的经典⼩游戏实现专题,分享给⼤家:以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
c语言贪吃蛇详细步骤
第二个参数:距离句柄(0,0)的相对位置, 要设置rd.x,rd.y的值,是COORD类型
种种子的函数和用法
种种子:srand((unsigned int)time()NULL) 利用时间差作为种种子的频率 包含头文件<time.h>
8.判断是否再产生食物
方法
判断蛇是否死亡和食物是否被吃掉就可以了 (判断食物是否被吃掉——只需判断蛇头的 坐标是否和食物的坐标重合就可以了)
9.蛇吃食物后变长
5.蛇的移动
步骤 1.销毁当前蛇 2.确定好蛇移动的方向,东西方向移动列+2 (方块占两个字符),南北方向移动行+1 3.找出蛇移动后的坐标 4.重新画蛇
销毁蛇的方法
找出当前蛇位置的坐标,用strncpy函数将数 组里面对应的坐标的方块换成空格 (注意: 一个方块等于两个空格)
6.判断蛇是否死亡
C语言贪吃蛇步骤和方法
1.显示界面
1. 把背景框画出来
2. 按自己的风格设计(追求代码的灵活性)
显示界面的实现方法
方法 1:把数组所有元素初始化为0,把边界 的元素初始化为1,把方块画到元素值为1 的边界上 方法 2 :直接定义一个字符数组,把背景框 画出来(推荐(printf输出比较少,解决闪 烁问题))
3.停止音乐播放
选择一个标记做为停止的信号(按键消息 (可以使用_getch函数,接收当前你按键盘 上的键的信息)) 停止播放音乐的函数:playsound (NULL,NULL,NULL)
4. 设置蛇的位置,长度和方向把蛇 画出来
C语言Easyx实现贪吃蛇详解
C语⾔Easyx实现贪吃蛇详解⽬录⼀、头⽂件包含⼆、创建蛇与⾷物的结构体三、游戏的初始化四、游戏的绘画事件五、蛇的移动事件六、输⼊⽅向******这个⽅⾯没什么好解释的⼤家看代码应该可以看懂。
七、⽣成⾷物⼋、吃⾷物九、游戏失败的判定⼗、main函数总结:⼀、头⽂件包含#include<stdio.h>#include<graphics.h> //图形处理需要包含的库⽂件#include<mmsystem.h> //windows多媒体接⼝#include<conio.h> //读取键盘输⼊#include<time.h> //随机数种⼦#include<stdlib.h> //内存分配包含完头⽂件后进⾏⼀些预处理操作:#pragma comment(lib,"winmm.lib")//多媒体接⼝#define NUM 200;#define SIZE 10enum Ch{ up=72,down=80,left=75,right=77} ;⼆、创建蛇与⾷物的结构体直接上代码:struct pos 蛇⾝坐标{int x;int y;};struct snake{int n; 初始化蛇⾝长度Ch ch; 蛇前进的⽅向pos szb[3265]; 蛇的坐标数组};struct food{int x;int y;bool iseat; 判断⾷物是否被吃};创建⼀个蛇与⾷物snake s;food f;三、游戏的初始化void gameinit(){srand((unsigned int)time(NULL));//随机数种⼦,⽤于随机⽣成⾷物s.n = 2; //蛇的初始长度,可以⾃⼰设定s.ch = right;//蛇的初始⽅向;s.szb[0].x=100;s.szb[0].y=100;s.szb[1].y = 100;//蛇的初始位置坐标f.iseat = true;}四、游戏的绘画事件cleardevice(); //每次绘画都要进⾏⼀次清屏setfillcolor(RED); //蛇头颜⾊fillrectangle(s.szb[0].x, s.szb[0].y,s.szb[0].x + SIZE, s.szb[0].y + SIZE);//SIZE在预处理是已经定义表⽰每个蛇⾝的⼤⼩for (int i = 0; i < s.n; i++) {rectangle(s.szb[i].x, s.szb[i].y,s.szb[i].x + SIZE, s.szb[i].y + SIZE);} //⽣成矩形蛇setfillcolor(GREEN);//⾷物颜⾊fillroundrect(f.x, f.y, f.x + SIZE, f.y + SIZE,5,5);//⽣成圆形⾷物五、蛇的移动事件void snakemove(){for (int i = s.n - 1; i > 0; i--){s.szb[i].x = s.szb[i - 1].x;s.szb[i].y = s.szb[i - 1].y; //通过数组的变换来实现蛇的移动}switch (s.ch)//ch枚举类型在预处理时已经定义{case up:s.szb[0].y -= SIZE;//由于在窗⼝坐标系中y⽅向是向下的所以向上移动需要减去⼀个sizebreak;case down:s.szb[0].y += SIZE;break;case left:s.szb[0].x -= SIZE;break;case right:s.szb[0].x += SIZE;break;}}六、输⼊⽅向******这个⽅⾯没什么好解释的⼤家看代码应该可以看懂。
C语言 贪吃蛇游戏
#define LEFT 0x4b00/*向左键*/ #define RIGHT 0x4d00/*向右键*/ #define DOWN 0x5000/*向下键*/ #define UP 0x4800/*向上键*/ #define ESC 0x011b/*〈ESC〉退出键*/ #define N 100/*贪吃蛇的最大长度*/
setfillstyle(1,12);/*用淡红色填充砖的中间部分*/ bar(x+2,y+2,x+sizx-2,y+sizy-2); }
这个函数可以让用户按下任意键而不需要回车键就可以接收到用户的输入。可以用来作为 “press anykey to continue”的实现。
实现过程
(1)预处理模块 在本游戏系统中需要引用一些头文件,以便程序更好的运行。引用头文件需要使用#include命令,
下面即是要引用的文件和引用代码,实现代码如下:
表19.2 cmd参数的设置值
参数值
含义
cmd = 0
cmd = 1
cmd = 2
当cmd是0,bioskey()返回下一个在键盘键入的值(它将等待到按下一个键)。 它返回一个16位的二进制数,包括两个不同的值。当按下一个普通键时,它的低8 位数存放该字符的ASCII码,高8位存放该键的扫描码;对于特殊键(如方向键、 F1~F12等等),低8位为0,高8位字节存放该键的扫描码
声明结构体,food是表示食物基本信息的结构体,snake是定义贪吃蛇基本信息的结构体,代码如下:
struct FOOD int x; /*食物的横坐标*/
贪吃蛇C程序及流程图和模块设计说明
#define N 200#include <graphics.h>#include <stdlib.h>#include <dos.h>#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800#define ESC 0x011bint i,key;int score=0;/*得分*/int gamespeed=50000;/*游戏速度自己调整*/ struct Food{int x;/*食物的横坐标*/int y;/*食物的纵坐标*/int yes;/*判断是否要出现食物的变量*/}food;/*食物的结构体*/struct Snake{int x[N];int y[N];int node;/*蛇的节数*/int direction;/*蛇移动方向*/int life;/* 蛇的生命,0活着,1死亡*/}snake;void Init(void);/*图形驱动*/void Close(void);/*图形结束*/void DrawK(void);/*开始画面*/void GameOver(void);/*结束游戏*/void GamePlay(void);/*玩游戏具体过程*/ void PrScore(void);/*输出成绩*//*主函数*/void main(void){Init();/*图形驱动*/DrawK();/*开始画面*/GamePlay();/*玩游戏具体过程*/Close();/*图形结束*/}/*图形驱动*/void Init(void){int gd=DETECT,gm;initgraph(&gd,&gm,"c:\\tc");cleardevice();}/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/ void DrawK(void){/*setbkcolor(LIGHTGREEN);*/setcolor(11);setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/for(i=50;i<=600;i+=10)/*画围墙*/{rectangle(i,40,i+10,49); /*上边*/rectangle(i,451,i+10,460);/*下边*/}for(i=40;i<=450;i+=10){rectangle(50,i,59,i+10); /*左边*/rectangle(601,i,610,i+10);/*右边*/}}/*玩游戏具体过程*//*第一部分初始设定*/void GamePlay(void){randomize();/*随机数发生器*/food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/snake.life=0;/*活着*/snake.direction=1;/*方向往右*/snake.x[0]=100;snake.y[0]=100;/*蛇头*/snake.x[1]=110;snake.y[1]=100;snake.node=2;/*节数*/PrScore();/*输出得分*/while(1)/*可以重复玩游戏,压ESC键结束*/{while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/{if(food.yes==1)/*需要出现新食物*/{food.x=rand()%400+60;food.y=rand()%350+60;while(food.x%10!=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/ food.x++;while(food.y%10!=0)/*食物整个坐标大小需要符合10*10的大小否则社无法迟到*/ food.y++;food.yes=0;/*画面上有食物了*/}if(food.yes==0)/*画面上有食物了就要显示*/{setcolor(GREEN); /*设置食物颜色*/rectangle(food.x,food.y,food.x+10,food.y-10);}for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/{snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1];} /*以蛇头的移动开始让整个身子移动,后一位补上前一位的位置坐标*//*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/switch(snake.direction){case 1:snake.x[0]+=10;break;case 2: snake.x[0]-=10;break;case 3: snake.y[0]-=10;break;case 4: snake.y[0]+=10;break;}/*第二部分:死亡设定模块*/for(i=3;i<snake.node;i++)/*死亡条件一:从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/{if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0]){GameOver();/*显示失败*/snake.life=1;break;}}if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||snake.y[0]>455)/*死亡条件二:蛇是否撞到墙壁*/{GameOver();/*本次游戏结束*/snake.life=1; /*蛇死*/}if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/break;/*第三部分:食物设定模块*/if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/{setcolor(0);/*把画面上的食物东西去掉*/rectangle(food.x,food.y,food.x+10,food.y-10);snake.x[snake.node]=-20;snake.y[snake.node]=-20;/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/snake.node++;/*蛇的身体长一节*/food.yes=1;/*画面上需要出现新的食物*/score+=10;PrScore();/*输出新得分*/}/*第四部分:死亡后返回初始设定(或是退出开始新游戏)*/setcolor(4);/*画出蛇*/for(i=0;i<snake.node;i++)rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10);delay(gamespeed);setcolor(0);/*用黑色去除蛇的的最后一节*/rectangle(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);} /*endwhile(!kbhit)*/if(snake.life==1)/*如果蛇死就跳出循环*/break;key=bioskey(0);/*接收按键*/if(key==ESC)/*按ESC键退出*/break;/*判断是否往相反的方向移动(向相反方向移动会死亡)第三类死亡条件*/ elseif(key==UP&&snake.direction!=4)snake.direction=3;elseif(key==RIGHT&&snake.direction!=2)snake.direction=1;elseif(key==LEFT&&snake.direction!=1)snake.direction=2;elseif(key==DOWN&&snake.direction!=3)snake.direction=4;}/*endwhile(1)*/}/*第五部分:游戏结束*/void GameOver(void){cleardevice();PrScore();setcolor(RED);settextstyle(0,0,4);outtextxy(200,200,"GAME OVER"); getch();}/*第六部分:输出成绩*/void PrScore(void){char str[10];setfillstyle(SOLID_FILL,YELLOW); bar(50,15,220,35);setcolor(6);settextstyle(0,0,2);sprintf(str,"score:%d",score); outtextxy(55,20,str);}/*第七部分:结束图形*/void Close(void){getch();closegraph();}本系统分为:初始化即图形驱动函数init()模块、图形界面设计Drawk()模块、游戏GamePlay()模块、输出成绩PrScore()模块、退出游戏Close模块、在游戏模块中通过3个控制语句判断游戏中的蛇是否死亡(3中死亡方式),不出现死亡在游戏结束时候打出成绩,如果出现死亡则跳出循环并打出成绩并进行初始化设定,如果不玩游戏按ESC则退出游戏。
贪吃蛇(C语言)
贪吃蛇(C语言)#include#include#include#include#include//蛇头移动方向#define UP 1#define DOWN 2#define LEFT 3#define RIGHT 4〃死亡判定(葱墙或葱自己)#define KISSASS 1#define KISSWALL 2//坐标转化#define POINT(x,y) ((y)*80+(x)+1)// 将(x,y)坐标转化为一个int 类数值#define GETX(x) (((x)-1)%80)// 将int 类数值提取出原先的x#define GETY(y) (((y)-1)/80)// 同理,提取出yHANDLE Console;void Position(int x, int y); // 移动光标到(x,y) //Windows.hvoid DrawMap();// 画墙void ShowText(char *text);//根据字符串的长短智能打印出包围字符串的笑脸void ResetSnake();// 初始化贪吃蛇int RefreshSnake();// 更新蛇的移动void CreatFood();// 生成食物void Draw();//画出蛇身和食物void RefreshScreen();// 屏幕刷新void GameOver(int Type);// 游戏结束条件int Gaming();//代码跑起来char play = 0; ////值为1则继续游戏,值为0游戏退出char pause = 0; //值为1则暂停,值为0游戏继续char direction; // 蛇头方向int snake[500]; //snake[0]为蛇头int body; //蛇身体长度int newbody;//吃完食物新长的蛇身int addHead,deleteTail;//增加蛇头擦去蛇尾,使贪吃蛇动起来int food = 0; // 食物void main()(CONSOLE_CURSOR_INFO CurrInfo = { sizeof(CONSOLE_CURSOR_INFO), 0 };Console = GetStdHandle(STD_OUTPUT_HANDLE);DrawMap();ShowT ext("Copyright reserve by 博元");while(Gaming()){if (play)DrawMap();};return 0;}void Position(int x, int y)// 移动光标到(x,y) //Windows.h{COORD coors = { x, y };SetConsoleCursorPosition(Console, coors);}void DrawMap() // 画墙{int i;for (i = 3; i < 70; i = i + 12){Position(i, 0);printf("===我是墙===");}for (i = 0; i < 25; i = i + 1){Position(0, i);printf("|| ");}for (i = 3; i < 70; i = i + 12){Position(i, 24);printf("============");}for (i = 0; i < 25; i = i + 1){Position(76, i); printf("|| ");void ShowText(char *text) //根据字符串的长短智能打印出包围字符串的笑脸(int i;int strLength = strlen(text); // 得到字符串长度Position(40 - (strLength / 2)-1, 11);printf("%c”, 1);for (i = 0; i < strLength + 2; i++)(printf("%c", 1);}printf("%c", 1);Position(40 - (strLength / 2)-1, 12);printf("%c ", 1);printf(text);printf(" %c", 1);Position(40 - (strLength / 2)-1, 13);printf("%c", 1);for (i = 0; i < strLength + 2; i++)(printf("%c", 1);}printf("%c", 1);}void ResetSnake() //初始化贪吃蛇(int x, y;for (x = 39, y = 0; y < 2; y++)(snake[y] = POINT(x, 7 - y);}body = 2; //设定蛇身初始长度为2newbody = 6;addHead = 0;deleteTail = 0;direction = LEFT;}int RefreshSnake() 〃更新蛇的移动〃返回值为1游戏结束( int x, y;memcpy(snake + 1, snake, sizeof(int)*body);if (!newbody){deleteTail = snake[body];snake[body] = 0;}else{body++;newbody--;}x = GETX(snake[0]);y = GETY(snake[0]);switch (direction) //控制蛇头移动方向{case UP:y -= 1; //蛇头向上移动一格(对应坐标y-1 ) snake[0] = POINT(x, y);break;case DOWN:y += 1;snake[0] = POINT(x, y); break;case LEFT:x -= 1;snake[0] = POINT(x, y); break;case RIGHT:x += 1;snake[0] = POINT(x, y); break;}addHead = snake[0];if (x > 75 || x < 3 ||y > 23 || y < 1) // 检测是否撞墙(GameOver(KISSWALL);return 1;}int i;for (i = 1; i < body; i++)if (snake[0] == snake[i]) // 检测是否撞到自己身体(GameOver(KISSASS);return 1;}if (snake[0] == food)(while (1) //食物的位置不与蛇身重合(food = (rand() % (75 * 23));for (i = 0; snake[i]; i++)if (food == snake[i])// 检测是否吃到食物,吃到则reset食物food = 0;if (food) 〃如果food==0 则重新建立一个食物坐标break;}CreatFood(); // 吃了?再来一个!newbody = (rand() % 6) + 1; // 吃完食物蛇身增长一节}return 0;}void CreatFood() // 生成食物(if (GETX(food) > 75 || GETX(food) < 3 || GETY(food) > 23 || GETY(food) < 1) CreatFood;elsePosition(GETX(food), GETY(food));printf("%c”,4);}void Draw() //画出蛇身和食物(system("cls");int i;for (i = 0; snake[i]; i++)(Position(GETX(snake[i]), GETY(snake[i])); printf("%c”,1);}CreatFood();}void RefreshScreen() // 屏幕刷新(if (deleteTail)(Position(GETX(deleteTail), GETY(deleteTail)); printf("");}if (addHead)(Position(GETX(addHead), GETY(addHead)); printf("%c",1);}addHead = deleteTail = 0;}void GameOver(int Type) // 游戏结束条件(switch (Type)(case KISSASS://? 至ij 自己身体ShowT ext("NOOB !当你以光速绕着一棵树奔跑就会发现自己在葱自己!");break;case KISSWALL://撞墙ShowT ext("NOOB !你有考虑过墙的感受吗");}food = 0;play = 0;memset(snake, 0, sizeof(int) * 500); // 存初始化} int Gaming() // 执行int Keyboardinput;Sleep(60);// 速度if (kbhit())(Keyboardinput = getch();if (Keyboardi nput == 0 || Keyboardinput == 0xE0) (Keyboardinput = getch();switch (Keyboardi nput) // 方向控制(case 72:if (direction != DOWN) direction = UP;break;case 80:if (direction != UP)direction = DOWN;break;case 75:if (direction != RiGHT)direction = LEFT;break;case 77:if (direction != LEFT)direction = RiGHT;break;}}if (Keyboardi nput == '\r') // 暂停(if (!play)(play = 1;if (pause)(Draw();pause = 0;}}else(ShowT ext("不许暂停,继续葱!!");play = 0;pause =1;}}else if (KeyboardI nput == 0x1B) // 退出return 0; } if (play)(if (!food)(srand(clock());food = (rand() % (75 * 23)); ResetSnake();Draw();}else(if (!RefreshSnake())(RefreshScreen();}}}。
纯C语言编写贪吃蛇(附源码,无EasyX、MFC)
纯C语⾔编写贪吃蛇(附源码,⽆EasyX、MFC)⼤⼀下学期,我所选的C语⾔⼯程实践是写⼀个贪吃蛇游戏。
那⼏天真的挺肝的,完成本专业的答辩之后就没怎么动过这程序了。
那时候写的贪吃蛇,还有⼀个栈溢出的问题没有解决,是因为当时所学知识有限,还没想到较好的解决⽅法。
现在⼤⼆上学期,在上了好⼏节数据结构之后,对栈有了⼀定的了解,随着对栈的学习,我想出了解决我写的贪吃蛇栈溢出的办法。
其实是前两天刚刚有这个想法,刚刚才测试并实现了,办法可⾏。
现在我加⼊了计算机学院的创新开放实验室,打算做的⼀个项⽬是微信⼩程序。
以后想记录⼀下我的开发过程和⼀些经历,⼜刚刚完善好贪吃蛇的代码,就简单记录⼀下吧。
因为代码⽐较长,先把参考资料写⼀下,想⾃⼰⼿写⼀遍的建议先看参考资料,再看这⾥的代码参考资料源代码/*预处理*/#include <windows.h>#include <stdio.h>#include <conio.h>#include <string.h>#include <time.h>/*宏定义*/#define YES 1#define NO 0//蛇的移动⽅向#define U 1 //上#define D 2 //下#define L 3 //左#define R 4 //右#define RESPEED 250 //蛇的移动速度/*定义节点*/typedef struct SNAKE{int x;int y;struct SNAKE* next;}snake;/*全局变量*/snake* head, * food; //蛇头指针,⾷物指针snake* q; //遍历蛇的时候⽤到的指针/*【以下为所有函数的声明】*/void HideCursor(void); //隐藏光标void color(short int num); //颜⾊函数void StartWindow(void); //开始界⾯int gotoxy(int x, int y); //定位光标位置void creatMap(void); //创建地图void notice(int* score, int* highscore, int* Time, int* LongTime); //提⽰void initsnake(void); //初始化蛇⾝int biteself(unsigned long* sleeptime); //判断是否咬到了⾃⼰int createfood(void); //随机出现⾷物void endgame(int* score, int* highscore, int* endgamestatus, int* Time, int* LongTime); //结束游戏void pause(int* PauseBegin, int* PauseEnd); //暂停游戏void gamecontrol(unsigned long* sleeptime, int* count, int* score, int* highscore, int* status, int* endgamestatus,int* Time, int* LongTime, int* TimeBegin, int* TimeEnd, int* TimePause, int* PauseBegin, int* PauseEnd); //控制游戏(包含蛇不能穿墙)void snakemove(unsigned long* sleeptime, int* count, int* score, int* status, int* endgamestatus); //蛇移动void gamestart(int* score, int* highscore, int* endgamestatus, int* Time, int* LongTime, int* TimeBegin); //游戏初始化void gamecontinue(unsigned long* sleeptime, int* count, int* score, int* highscore, int* status, int* endgamestatus,int* Time, int* LongTime, int* TimeBegin, int* TimeEnd, int* TimePause, int* PauseBegin, int* PauseEnd); //再来⼀局void stop(unsigned long* sleeptime); //蛇停⽌移动void start(unsigned long* sleeptime); //蛇恢复移动void reset(int* count, int* score, int* Time, int* TimeBegin, int* TimeEnd, int* TimePause, int* PauseBegin, int* PauseEnd); //重置多项数据void updatescore(int* score, int* highscore, int* Time, int* LongTime); //更新多项数据int main(void){unsigned long sleeptime = RESPEED;int score = 0, highscore = 0, count = 0; //count是记录吃到⾷物的次数int status, endgamestatus = 0; //游戏结束情况,0未开始游戏前退出,1撞到墙,2咬到⾃⼰,3主动退出游戏,4通关HideCursor();gamestart(&score, &highscore, &endgamestatus, &Time, &LongTime, &TimeBegin);gamecontrol(&sleeptime, &count, &score, &highscore, &status, &endgamestatus, &Time, &LongTime, &TimeBegin, &TimeEnd, &TimePause, &Pa useBegin, &PauseEnd);endgame(&score, &highscore, &endgamestatus, &Time, &LongTime);gamecontinue(&sleeptime, &count, &score, &highscore, &status, &endgamestatus, &Time, &LongTime, &TimeBegin, &TimeEnd, &TimePause, &P auseBegin, &PauseEnd);return 0;}void HideCursor(void) //隐藏光标{CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);}void color(short int num){HANDLE hConsole = GetStdHandle((STD_OUTPUT_HANDLE));SetConsoleTextAttribute(hConsole, num);}void StartWindow(void){short int i;system("mode con cols=120 lines=30"); //设置窗⼝⼤⼩printf("温馨提⽰:请使⽤键盘操作(⿏标点击可能会导致程序出错)\n");printf("╔═══════════════════════════════════════════════════╗ \n");for (i = 0; i < 26; i++){printf("║ ║ \n");}printf("╚═══════════════════════════════════════════════════╝ \n");gotoxy(23, 2);color(3);printf("贪吃蛇");for (i = 15; ; i--){gotoxy(18, 4);color(i);printf("按任意键加载程序");Sleep(600);if (i == 1){i = 15;}if (kbhit()) //判断是否按键,等待输⼊按键为0,按键为1{break;}}gotoxy(10, 4);printf("1.开始游戏 2.退出游戏");getch();}int gotoxy(int x, int y){HANDLE handle; //定义句柄变量handle,创建⼀个句柄COORD pos; //定义结构体coord (坐标系coord)pos.X = x; //横坐标xpos.Y = y; //纵坐标yhandle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台输出句柄(值为-11)SetConsoleCursorPosition(handle, pos); //移动光标return YES;}void creatMap(void){int i;//地图⼤⼩:长24×宽20printf("■");gotoxy(i, 27);printf("■");}for (i = 7; i < 28; i++) //打印左右边框{gotoxy(2, i);printf("■");gotoxy(50, i);printf("■");}}void notice(int* score, int* highscore, int* Time, int* LongTime){system("title 2018051170 Project:贪吃蛇");gotoxy(4, 4);color(15);printf("得分:%3d 最⾼分:%3d ⽣存:%4ds 最久⽣存:%4ds", *score, *highscore, *Time, *LongTime); gotoxy(60, 7);printf("Author: 2018051170 Project: 贪吃蛇");gotoxy(60, 9);printf("游戏说明:");gotoxy(60, 10);printf("不能穿墙,不能咬到⾃⼰");gotoxy(60, 11);printf("↑↓←→控制蛇的移动");gotoxy(60, 12);printf("ESC:退出游戏空格:暂停游戏");}void initsnake(void){int i;snake* tail;tail = (snake*)malloc(sizeof(snake)); //从蛇尾开始,插头法,以x,y设定开始的位置tail->x = 26;tail->y = 14;tail->next = NULL;for (i = 1; i < 3; i++){head = (snake*)malloc(sizeof(snake));head->next = tail;head->x = 26 - 2 * i;head->y = 14;tail = head;}while (tail != NULL) //从头到为,输出蛇⾝{gotoxy(tail->x, tail->y);if (i == 3){color(2);printf("●");i++;}else if (tail != NULL){color(2);printf("■");}tail = tail->next;}}int biteself(unsigned long* sleeptime){snake* self;self = head->next;while (self != NULL){if (self->x == head->x && self->y == head->y)self = self->next;}return NO;}int createfood(void){snake* food_1;food_1 = (snake*)malloc(sizeof(snake));srand((unsigned)time(NULL)); //产⽣⼀个随机数while ((food_1->x % 2) != 0) //保证其为偶数,使得⾷物能与蛇头对其{food_1->x = rand() % 50; //保证其在墙壁⾥X1 < X < X2if (food_1->x <= 4){food_1->x = food_1->x + 4;}}food_1->y = rand() % 27; //保证其在墙壁⾥Y1 < Y < Y2if (food_1->y < 7){food_1->y = food_1->y + 7;}q = head;while (q != NULL) //判断蛇⾝是否与⾷物重合{if (q->x == food_1->x && q->y == food_1->y){free(food_1);return 1;}if (q->next == NULL){break;}q = q->next;}gotoxy(food_1->x, food_1->y);food = food_1;color(3);printf("★");return 0;}void endgame(int* score, int* highscore, int* endgamestatus, int* Time, int* LongTime) {color(15);gotoxy(60, 14);if (*endgamestatus == 0){printf("您退出了游戏。
用C实现经典的贪吃蛇游戏
用C实现经典的贪吃蛇游戏经典贪吃蛇游戏的C语言实现贪吃蛇是一款经典的游戏,它具有简单的规则和上瘾的玩法。
本文将介绍如何使用C语言实现经典的贪吃蛇游戏。
一、游戏规则简介在贪吃蛇游戏中,玩家操控一条蛇,通过操纵蛇的移动方向来吃掉食物。
随着蛇吃到食物的数量增加,蛇的身体也会逐渐变长。
玩家需要注意的是,蛇的头部不能碰到自己的身体或游戏边界,否则游戏结束。
二、游戏实现思路要实现贪吃蛇游戏,我们需要解决以下几个主要问题:1. 游戏画面的绘制:使用C语言的图形库,如graphics.h或SDL,来绘制游戏画面。
2. 蛇的移动:通过键盘控制蛇的移动方向,确定蛇每次移动的位置。
3. 食物的生成:在游戏区域中随机生成食物,供蛇吃掉。
4. 身体碰撞检测:判断蛇的头部是否碰到自身的身体或游戏边界,如果是,则游戏结束。
三、游戏实现步骤以下是实现贪吃蛇游戏的简要步骤:1. 初始化游戏:设置游戏窗口大小、颜色和其他必要的初始化操作。
在游戏区域中生成一条初始长度为3的蛇,设置蛇的初始位置和移动方向。
2. 绘制游戏画面:使用图形库提供的函数,在游戏窗口中绘制蛇的身体和食物。
3. 键盘控制移动:使用键盘监听函数,当玩家按下方向键时,改变蛇的移动方向。
4. 蛇的移动:根据蛇的当前位置和移动方向,更新蛇头的位置,并将蛇头加入蛇的身体中,同时删除蛇的尾部,实现蛇的移动。
5. 食物的生成:在游戏区域中随机生成食物,初始位置不能与蛇的位置重叠。
6. 身体碰撞检测:判断蛇的头部是否碰到自身的身体或游戏边界,如果是,则游戏结束。
7. 游戏结束:显示游戏得分和结束信息,释放资源。
四、代码实现示例(部分代码)```c#include <stdio.h>#include <conio.h>#include <stdlib.h>#include <time.h>#include <Windows.h>#include <stdbool.h>// 定义游戏窗口大小和蛇身颜色#define WIDTH 80#define HEIGHT 25#define SNAKE_COLOR 15// 定义蛇的结构体typedef struct _node {int x; // 蛇身坐标xint y; // 蛇身坐标ystruct _node* next; // 指向下一个节点的指针} node;node* head; // 蛇头指针node* tail; // 蛇尾指针int direction; // 蛇的移动方向int score; // 游戏得分// 初始化蛇void initSnake() {// 创建蛇头节点head = (node*)malloc(sizeof(node)); head->x = WIDTH / 2;head->y = HEIGHT / 2;head->next = NULL;// 设置初始移动方向direction = 'w';}// 绘制游戏画面void draw() {// 清空屏幕system("cls");// 绘制蛇身node* p = head;while (p) {gotoxy(p->x, p->y);printf("■");p = p->next;}// 绘制食物// 绘制游戏信息gotoxy(0, HEIGHT + 1);printf("Score: %d", score);}// 键盘控制移动void control() {char ch;if (_kbhit()) {ch = _getch();if (ch == 'w' || ch == 's' || ch == 'a' || ch == 'd') { direction = ch;}}}// 蛇的移动void move() {// 根据移动方向改变蛇头位置// 更新蛇身位置// 判断是否吃到食物 // 判断是否撞墙或自身}int main() {// 初始化游戏// 游戏循环while (true) {// 绘制游戏画面// 键盘控制移动// 蛇的移动// 判断游戏是否结束 }// 游戏结束return 0;}```以上是使用C语言实现经典贪吃蛇游戏的简要介绍。
C语言实现贪吃蛇小游戏
C语⾔实现贪吃蛇⼩游戏本⽂实例为⼤家分享了C语⾔实现贪吃蛇⼩游戏的具体代码,供⼤家参考,具体内容如下⼀、程序实现的原理:1、构造蛇⾝:定义⼀个坐标数组,存放的是蛇的每⼀节蛇⾝所在的坐标位置。
这样就将移动蛇⾝的操作转换为移动数组的操作,将吃⾷物增加蛇⾝体长度的操作转换为在数组后⾯追加元素的操作。
2、移动效果:每次移动时,将每⼀节蛇⾝(蛇头除外)依次往前移动⼀节,然后擦去蛇的最后⼀节,最后确定蛇头的⽅向,再绘制⼀个蛇头。
这样就会显⽰⼀个移动效果。
3、⾝体增加效果:每次移动时候,判断蛇头是否碰到了⾷物,如果碰到了⾷物,则吃掉它,并且只进⾏前移蛇⾝和增加蛇头的操作,不进⾏擦除蛇尾的操作(可以⽤⼀个标记变量判断是否吃掉了⾷物,然后在擦除蛇尾那⾥判断是否需要擦除蛇尾),这就会显⽰蛇⾝体增加的效果。
⼆、预备知识1、控制台窗⼝控制台窗⼝每⼀个位置都有它的坐标,且坐标系如下图所⽰(随箭头⽅向坐标逐渐增⼤)2、通过代码将光标移动到控制台指定位置这⾥⽤到了c语⾔windows编程中句柄的概念,不知道的可以百度。
实在不会也没关系,可以当做⼀个函数模板来使⽤,⽆需做太多了解。
#include <stdio.h>#include <Windows.h>//将光标移动到控制台的(x,y)坐标点处void gotoxy(int x, int y){COORD coord;coord.X = x;coord.Y = y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);}int main(){gotoxy(50,15);//将光标移动到控制台的(50,15)处printf("Hello World\n");system("pause");return 0;}从运⾏结果可以看到,程序在指定位置输出了待输出的内容。
C 贪吃蛇总结
C 贪吃蛇总结引言贪吃蛇是一款经典的电子游戏,也是许多初学者编程的练手项目。
本文将总结使用 C 语言编写贪吃蛇游戏的过程和经验,并探讨一些可能的改进和优化方案。
游戏规则贪吃蛇游戏的基本规则如下: - 蛇由一条连续的方块组成,初始时长度较短。
- 蛇头可以通过键盘控制上、下、左、右的方向移动。
- 蛇头移动时身体的每个方块都会向前移动,形成蛇的移动效果。
- 如果蛇头碰到边界或者自己的身体,游戏结束。
- 在地图上会随机出现食物,蛇吃到食物时长度会增加。
主要功能实现在 C 语言中实现贪吃蛇游戏,我们需要考虑一些主要功能实现:绘制地图通过使用 ASCII 字符来绘制游戏地图,可以使用二维字符数组代表地图的各个位置。
地图可以用‘#’ 表示边界,空格字符表示空位,’O’表示蛇身体,’@’ 表示食物。
控制蛇的移动为了实现蛇的移动,我们需要记录蛇的当前位置和方向。
可以使用一个链表来表示蛇的身体,每个节点包含位置和指向下一个节点的指针。
蛇的移动可以通过在链表头部添加一个新节点,同时在尾部删除一个节点来实现。
处理用户输入通过监听键盘输入,可以实现控制蛇的移动方向。
例如,按下‘W’ 可以控制蛇向上移动,按下‘S’ 可以控制蛇向下移动,以此类推。
食物的生成和判断在地图上随机生成食物,并且需要判断蛇是否吃到食物。
如果蛇吃到食物,需要处理蛇的长度增加和生成新的食物。
游戏结束的判断在每次蛇移动后,需要判断是否游戏结束。
如果蛇头碰到边界或者蛇身体,则游戏结束。
实现过程中的挑战和经验编写贪吃蛇游戏时,可能会遇到一些挑战和问题。
以下是一些经验教训和解决方案:•统一使用时间间隔控制蛇的移动速度,以避免在不同系统上游戏速度不一致的问题。
•使用一个额外的数组来存储地图的状态,可以提高游戏性能。
•蛇的移动需要考虑边界和碰撞检测,务必确保边界和碰撞判定的准确性。
•合理设计游戏难度,包括蛇的速度和食物生成频率,以保持游戏的可玩性。
可能的改进和优化方案尽管本文提供了基本的贪吃蛇游戏实现方案,但仍然有许多改进和优化的空间。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
GotoRood(fd->x, fd->y);
printf("*");
}
void CollisionTest(SNAKE *head)
{
if (head->x == START_X) /*一头撞在左墙上.....*/
head->x = START_X + SCREEN_WIDTH; /*嗯...那从右边出来吧*/
head->y = START_Y + SCREEN_LENGTH;
else if (head->y == START_Y + SCREEN_LENGTH + 1) /*下面也不能放过...*/
head->y = START_Y + 1;
}
int Eated(SNAKE *head, FOOD *fd) /*....有木有吃到食物*/
{
if ((*d == left || *d == right) && *d != up)
*d = down;
}
else if (ch == 75)
{
if ((*d == up || *d == down) && *d != right)
else if (head->x == START_X + SCREEN_WIDTH + 1) /*..换个方向接着撞....*/
head->x = START_X + 1;
else if (head->y == START_Y) /*...再向上撞...*/
}
GotoRood(START_X + 20, START_Y - 1);
printf("CopyRight@11计科 万齐飞");
GotoRood(0,START_Y + 2);
printf("游戏说明:\n\n↑设置等级\n\n按〖回车〗开始\n\n↑↓←→\n控制方向\n");
while (++i < 3)
{
p2 = p1;
p1 = (SNAKE *)malloc(sizeof(SNAKE));
p1->x = START_X + SCREEN_WIDTH / 2;
p1->y = START_Y + 8 + i;
p1->end = NULL;
for (;p != NULL ;p = p->next)
if (fd->x == p->x && fd->y == p->y)
{
clash = 1;
break;
}
if (clash == 0)
grade = ++grade % 10;
if (grade == 0)
grade = 1;
GotoRood(START_X, START_Y - 1);
printf("Grade: %d", grade);
}
else if (rank == 13)
while (p != NULL)
{
GotoRood(p->x, p->y);
printf(" ");
p = p->next;
}
}
void Move(int *d) //移动方向。。。 上下左右 上:72 下:80 左:75 右:77
{
char ch;
for (i = 0; i < SCREEN_WIDTH + 2; i++)
printf("-");
for (j = 1; j <= SCREEN_LENGTH; j++)
{
GotoRood(START_X,START_Y + j);
printf("|");
int direct = up; /* 初始方向为向上 */
time_t grade = 2; /* 初始等级为2 */
FOOD *fd;
SNAKE *head, *ptemp, *pnew; /*最少3个蛇身 + 1个蛇头的时候才会挂。 感觉用C++改成类来做会好一些。。*/
{
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cci;
GetConsoleCursorInfo(hOut, &cci);
cci.bVisible = FALSE;
SetConsoleCursorInfo(hOut, &cci);
*d = left;
}
else if (ch == 77)
{
if ((*d == up || *d == down) && *d != left)
*d = right;
}
}
}
void IniScreen(SNAKE *head) /*初始化屏幕*/
while(_kbhit())
{
ch = getch();
if (ch == 72)
{
if ((*d == left || *d == right) && *d != down)
*d = up;
}
else if (ch == 80)
printf("Score: %-3d", score);
IniScreen(head);
CreatFood(fd, head);
while(rank = getch()) /*接受按键...↑设置等级【空格】开始游戏*/
{
if (rank == 72)
{
{
SNAKE *p = head;
while (p != NULL)
{
GotoRood(p->x, p->y);
printf("#");
p = p-பைடு நூலகம்next;
}
}
void RemoveSnk(SNAKE *head) /*清除函数*/
{
SNAKE *p = head;
break;
}
while (1)
{
RemoveSnk(head);
}
// sleep()代替delay sleep(500)表示延迟500ms
int Random(int n) /*随机生成食物的位置*/
{
srand(time(NULL));
return (rand() % n);
}
void BuildSnk(SNAKE *head) /*构造蛇身*/
/*--------------孵化蛇-------------------*/
head->x = START_X + SCREEN_WIDTH / 2;
head->y = START_Y + 8;
head->pre = NULL;
p1 = head;
i = 0;
p2->next = p1;
p1->pre = p2; /////////////////
}
p1->next = NULL;
head->end = p1;
BuildBody(head);
}
void CreatFood(FOOD *fd, SNAKE *snk) /*做吃的,记得增加一个功能就是让食物不与蛇体冲突*/
{
SNAKE *p = snk;
int clash = 0; /*标记食物位置是否和蛇发生冲突*/
while(1)
{
clash = 0;
fd->x = START_X + 1 + Random(SCREEN_WIDTH); /* x控制在边宽内 */
fd->y = START_Y + 1 + Random(SCREEN_LENGTH); /* y控制在变长内 */
printf("-");
for (j = 1; j <= SCREEN_LENGTH; j++)
{
GotoRood(START_X + SCREEN_WIDTH + 1, START_Y + j);
printf("|");
}
GotoRood(START_X, START_Y + SCREEN_LENGTH + 1);
#define START_X 16 /*屏幕起始X坐标*/
#define START_Y 2 /*屏幕起始y坐标*/
enum direc{up, down, left, right}; /*蛇的运动方向*/
typedef struct snake{ /*蛇身结构体*/
{
if (head->x == fd->x && head->y == fd->y)
return 1;