贪吃蛇(C语言知识学习)

合集下载

c语言贪吃蛇代码的算法模块

c语言贪吃蛇代码的算法模块

c语言贪吃蛇代码的算法模块以下是一个简单的 C 语言贪吃蛇代码的算法模块:1. 食物生成:在游戏区域的随机位置生成食物。

```cint x = rand() % SCREEN_WIDTH;int y = rand() % SCREEN_HEIGHT;food.x = x;food.y = y;```2. 蛇的移动:根据蛇的当前方向移动蛇头。

```cswitch (snake.direction) {case UP:snake.y--;break;case DOWN:snake.y++;break;case LEFT:snake.x--;break;case RIGHT:snake.x++;break;}```3. 检查游戏结束条件:检查蛇是否吃到自己或撞到边界。

```cif (snake.x == food.x && snake.y == food.y) {// 吃到食物,蛇身增长addNode(&snake);generateFood(&food);} else {if (snake.x < 0 || snake.x >= SCREEN_WIDTH || snake.y < 0 || snake.y >= SCREEN_HEIGHT) {// 撞墙,游戏结束gameOver = true;} else {removeNode(&snake);}}```4. 控制蛇的移动速度:根据游戏难度控制蛇的移动速度。

```cif (difficulty == EASY) {// 较慢的速度sleep(100);} else if (difficulty == NORMAL) {// 正常的速度sleep(75);} else {// 较快的速度sleep(50);}```以上是一个简单的贪吃蛇游戏算法的核心部分。

你可以根据实际需求对代码进行修改和扩展,以实现更完整的贪吃蛇游戏功能。

C语言贪吃蛇 新手绝对看得懂 有注释

C语言贪吃蛇     新手绝对看得懂  有注释
timeinfo-&gt;tm_mday,timeinfo-&gt;tm_hour,timeinfo-&gt;tm_min,timeinfo-&gt;tm_sec);
//tm_sec(表示秒)之类的是固定类型 不能换成其它的。
Count(1900+timeinfo-&gt;tm_year,1+timeinfo-&gt;tm_mon,timeinfo-&gt;tm_mday);
sum=sum+1;
//printf(&quot;%d&quot;,sum);
Select(sum);
}
}
}
/******************************************************************************************/
GotoXY(N+26,9);cout&lt;&lt;(&quot; ║ A/a/4:往左移动 ║ &quot;);
GotoXY(N+27,10);cout&lt;&lt;(&quot; ║ ║ &quot;);
else
sum=sum+day+a[11]+a[10]-27;
//printf(&quot;%d&quot;,sum);
Select(sum);
}
else//年份大于2014年时
{
int i;
for(i=1;i&lt;=step-1;i++)

完整版C语言贪吃蛇设计思路和代码详解

完整版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 只表示了贪吃蛇的活动区域。

C语言贪吃蛇全部程序及说明Word版

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语言项目案例之贪吃蛇

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语言代码编写

超简单贪吃蛇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语言源代码学习阅读学习了源代码,并做了简单的注释和修改,里面只用了链表数据结构,非常适合C语言入门者学习阅读。

程序可在VS2013下编译运行。

1 #include<stdio.h>2 #include<time.h>3 #include<windows.h>4 #include<stdlib.h>56#define U 17#define D 28#define L 39#define R 4 //蛇的状态,U:上;D:下;L:左 R:右1011 typedef struct SNAKE //蛇身的一个节点12 {13int x;14int y;15struct SNAKE *next;16 }snake;1718//全局变量//19int score = 0, add = 10;//总得分与每次吃食物得分。

20int status, sleeptime = 200;//每次运行的时间间隔21 snake *head, *food;//蛇头指针,食物指针22 snake *q;//遍历蛇的时候用到的指针23int endGamestatus = 0; //游戏结束的情况,1:撞到墙;2:咬到自己;3:主动退出游戏。

2425//声明全部函数//26void Pos();27void creatMap();28void initSnake();29int biteSelf();30void createFood();31void cantCrossWall();32void snakeMove();33void pause();34void runGame();35void initGame();36void endGame();37void gameStart();3839void Pos(int x, int y)//设置光标位置40 {41 COORD pos;42 HANDLE hOutput;43 pos.X = x;44 pos.Y = y;45 hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//返回标准的输入、输出或错误的设备的句柄,也就是获得输入、输出/错误的屏幕缓冲区的句柄46 SetConsoleCursorPosition(hOutput, pos);47 }4849void creatMap()//创建地图50 {51int i;52for (i = 0; i<58; i += 2)//打印上下边框53 {54 Pos(i, 0);55 printf("■");//一个方块占两个位置56 Pos(i, 26);57 printf("■");58 }59for (i = 1; i<26; i++)//打印左右边框60 {61 Pos(0, i);62 printf("■");63 Pos(56, i);64 printf("■");65 }66 }6768void initSnake()//初始化蛇身69 {70 snake *tail;71int i;72 tail = (snake*)malloc(sizeof(snake));//从蛇尾开始,头插法,以x,y设定开始的位置//73 tail->x = 24;74 tail->y = 5;75 tail->next = NULL;76for (i = 1; i <= 4; i++)//初始长度为477 {78 head = (snake*)malloc(sizeof(snake));79 head->next = tail;80 head->x = 24 + 2 * i;81 head->y = 5;82 tail = head;83 }84while (tail != NULL)//从头到为,输出蛇身85 {86 Pos(tail->x, tail->y);87 printf("■");88 tail = tail->next;89 }90 }91//??92int biteSelf()//判断是否咬到了自己93 {94 snake *self;95 self = head->next;96while (self != NULL)97 {98if (self->x == head->x && self->y == head->y)99 {100return1;101 }102 self = self->next;103 }104return0;105 }106107void createFood()//随机出现食物108 {109 snake *food_1;110 srand((unsigned)time(NULL));//为了防止每次产生的随机数相同,种子设置为time111 food_1 = (snake*)malloc(sizeof(snake));112while ((food_1->x % 2) != 0) //保证其为偶数,使得食物能与蛇头对其113 {114 food_1->x = rand() % 52 + 2;115 }116 food_1->y = rand() % 24 + 1;117 q = head;118while (q->next == NULL)119 {120if (q->x == food_1->x && q->y == food_1->y) //判断蛇身是否与食物重合121 {122free(food_1);123 createFood();124 }125 q = q->next;126 }127 Pos(food_1->x, food_1->y);128 food = food_1;129 printf("■");130 }131132void cantCrossWall()//不能穿墙133 {134if (head->x == 0 || head->x == 56 || head->y == 0 || head->y == 26)135 {136 endGamestatus = 1;137 endGame();138 }139 }140141void snakeMove()//蛇前进,上U,下D,左L,右R142 {143 snake * nexthead;144 cantCrossWall();145146 nexthead = (snake*)malloc(sizeof(snake));147if (status == U)148 {149 nexthead->x = head->x;150 nexthead->y = head->y - 1;151if (nexthead->x == food->x && nexthead->y == food->y)//如果下一个有食物//152 {153 nexthead->next = head;154 head = nexthead;155 q = head;156while (q != NULL)157 {158 Pos(q->x, q->y);159 printf("■");160 q = q->next;161 }162 score = score + add;163 createFood();164 }165else//如果没有食物//166 {167 nexthead->next = head;168 head = nexthead;169 q = head;170while (q->next->next != NULL)171 {172 Pos(q->x, q->y);173 printf("■");174 q = q->next;175 }176 Pos(q->next->x, q->next->y);177 printf("");178free(q->next);179 q->next = NULL;180 }181 }182if (status == D)183 {184 nexthead->x = head->x;185 nexthead->y = head->y + 1;186if (nexthead->x == food->x && nexthead->y == food->y) //有食物187 {188 nexthead->next = head;189 head = nexthead;190 q = head;191while (q != NULL)192 {193 Pos(q->x, q->y);194 printf("■");195 q = q->next;196 }197 score = score + add;198 createFood();199 }200else//没有食物201 {202 nexthead->next = head;203 head = nexthead;204 q = head;205while (q->next->next != NULL)206 {207 Pos(q->x, q->y);208 printf("■");209 q = q->next;210 }211 Pos(q->next->x, q->next->y);212 printf("");213free(q->next);214 q->next = NULL;215 }216 }217if (status == L)218 {219 nexthead->x = head->x - 2;220 nexthead->y = head->y;221if (nexthead->x == food->x && nexthead->y == food->y)//有食物222 {223 nexthead->next = head;224 head = nexthead;225 q = head;226while (q != NULL)227 {228 Pos(q->x, q->y);229 printf("■");230 q = q->next;231 }232 score = score + add;233 createFood();234 }235else//没有食物236 {237 nexthead->next = head;238 head = nexthead;239 q = head;240while (q->next->next != NULL)241 {242 Pos(q->x, q->y);243 printf("■");244 q = q->next;245 }246 Pos(q->next->x, q->next->y);247 printf("");248free(q->next);249 q->next = NULL;250 }251 }252if (status == R)253 {254 nexthead->x = head->x + 2;255 nexthead->y = head->y;256if (nexthead->x == food->x && nexthead->y == food->y)//有食物257 {258 nexthead->next = head;259 head = nexthead;260 q = head;261while (q != NULL)262 {263 Pos(q->x, q->y);264 printf("■");265 q = q->next;266 }267 score = score + add;268 createFood();269 }270else//没有食物271 {272 nexthead->next = head;273 head = nexthead;274 q = head;275while (q->next->next != NULL)276 {277 Pos(q->x, q->y);278 printf("■");279 q = q->next;280 }281 Pos(q->next->x, q->next->y);282 printf("");283free(q->next);284 q->next = NULL;285 }286 }287if (biteSelf() == 1) //判断是否会咬到自己288 {289 endGamestatus = 2;290 endGame();291 }292 }293294void pause()//暂停295 {296while (1)297 {298 Sleep(300);299if (GetAsyncKeyState(VK_SPACE))300 {301break;302 }303304 }305 }306307void runGame()//控制游戏308 {309310 Pos(64, 15);311 printf("不能穿墙,不能咬到自己\n");312 Pos(64, 16);313 printf("用↑.↓.←.→分别控制蛇的移动.");314 Pos(64, 17);315 printf("F1 为加速,F2 为减速\n");316 Pos(64, 18);317 printf("ESC :退出游戏.space:暂停游戏.");318 Pos(64, 20);319 printf("C语言研究中心 ");320 status = R;321while (1)322 {323 Pos(64, 10);324 printf("得分:%d ", score);325 Pos(64, 11);326 printf("每个食物得分:%d分", add);327if (GetAsyncKeyState(VK_UP) && status != D)328 {329 status = U;330 }331else if (GetAsyncKeyState(VK_DOWN) && status != U) 332 {333 status = D;334 }335else if (GetAsyncKeyState(VK_LEFT) && status != R) 336 {337 status = L;338 }339else if (GetAsyncKeyState(VK_RIGHT) && status != L) 340 {341 status = R;342 }343else if (GetAsyncKeyState(VK_SPACE))344 {345 pause();346 }347else if (GetAsyncKeyState(VK_ESCAPE))348 {349 endGamestatus = 3;350break;351 }352else if (GetAsyncKeyState(VK_F1))353 {354if (sleeptime >= 50)355 {356 sleeptime = sleeptime - 30;357 add = add + 2;358if (sleeptime == 320)359 {360 add = 2;//防止减到1之后再加回来有错361 }362 }363 }364else if (GetAsyncKeyState(VK_F2))365 {366if (sleeptime<350)367 {368 sleeptime = sleeptime + 30;369 add = add - 2;370if (sleeptime == 350)371 {372 add = 1; //保证最低分为1373 }374 }375 }376 Sleep(sleeptime);377 snakeMove();378 }379 }380381void initGame()//开始界面382 {383 Pos(40, 12);384385 system("title C语言研究中心 ");386 printf("欢迎来到贪食蛇游戏!");387 Pos(40, 25);388 printf(" C语言研究中心 .\n"); 389 system("pause");390 system("cls");391 Pos(25, 12);392 printf("用↑.↓.←.→分别控制蛇的移动, F1 为加速,2 为减速\n");393 Pos(25, 13);394 printf("加速将能得到更高的分数。

c语言贪吃蛇

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; }。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#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 博元。

相关文档
最新文档