贪吃蛇(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; }。

C语言贪吃蛇

C语言贪吃蛇
printf("│ │ │\n");
printf("│ │ │\n");
{
food();
exist_food=1;
}
if(x[0]==xi&&y[0]==yi)
{
exist_food=0;
score[3]++;
case 27:
return false;
}
if(x[0]>60)
x[0]=2;
if(x[0]<2)
x[0]=60;
if(y[0]<1)
printf("│ │ │\n");
printf(" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n");
void InitSnake()
{
x[0]=20;
y[0]=10;
score[3]=0;
len=1;
exist_food=0;
}
void food() // 生成食物 x坐标为偶数
{
int i;
fag=0;
srand((unsigned)time( NULL ));
break;
case 'a': // 纵坐标之间的距离大约是横坐标之间的距离的两倍
x[0]-=2;
break;
case 'd':
x[0]+=2;
break;
SetConsoleCursorInfo(hOut,&cci);

贪吃蛇编程的知识点总结

贪吃蛇编程的知识点总结

贪吃蛇编程的知识点总结1. 游戏界面的绘制在贪吃蛇游戏中,需要将游戏界面绘制出来,可以使用常见的游戏开发库,比如pygame 进行绘制。

需要考虑的知识点有窗口创建、绘制蛇、食物、边界和其他的游戏元素。

2. 蛇的移动和控制蛇的移动需要根据玩家的控制进行更新,比如按下上下左右键盘控制蛇的方向。

在实现过程中需要考虑蛇头的移动、蛇身体的增长和移动以及蛇头和蛇身体的碰撞检测等知识点。

3. 食物的生成和吃掉游戏中需要随机生成食物,并且当蛇头吃到食物时需要让食物消失并且蛇的身体增长。

食物的生成和消失需要考虑到随机数的生成以及碰撞检测等知识点。

4. 游戏逻辑的实现在游戏逻辑的实现中,需要考虑到蛇头撞到边界、蛇头撞到自己的身体、得分的计算以及游戏重新开始等逻辑处理的知识点。

5. UI界面的美化为了增加游戏的娱乐性和可玩性,可以对游戏界面进行美化,比如增加背景音乐、游戏结束的动画效果等知识点。

6. 优化和性能调优在开发过程中需要考虑到性能的问题,比如蛇的移动速度、食物的生成速度、碰撞检测的效率等知识点。

7. 存档和排行榜为了提升游戏的可玩性,可以考虑添加存档和排行榜功能,需要考虑到文件操作、数据存储和读取、数据排序等知识点。

8. 多平台支持为了让更多的玩家可以进行游戏,可以考虑将游戏适配到多个平台,比如PC端、移动端等知识点。

9. 多人游戏功能在一些派生的贪吃蛇游戏中,增加了多人游戏的功能。

这时需要考虑到网络通信、玩家控制、多个蛇的移动、碰撞检测和游戏逻辑的处理等知识点。

总的来说,开发贪吃蛇游戏所涉及到的知识点包括游戏界面的绘制、蛇的移动和控制、食物的生成和吃掉、游戏逻辑的实现、UI界面的美化、优化和性能调优、存档和排行榜、多平台支持、多人游戏功能等多个方面。

通过开发贪吃蛇游戏,可以锻炼程序员的编程能力和逻辑思维能力,是一个很好的编程练习项目。

用C实现经典的贪吃蛇游戏

用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语言源代码学习leetcode刷题: 002 Add Two NumbersYou are given two linked lists representing two non-negative numbers. The digits...操作系统的段机制与页机制8086的分段寻址,是指一个物理地址由段地址(segment selector)与偏移量(offset)两部分组成,长度各是16比特。

其中段地址左移4位(即乘以...计算机网络概论应用层:HTTP(超文本传输协议)、FTP(文件传输协议)、SMTP(简单 Mail 协议)、TELNET(远程登录)、SSH(安全外壳)贪吃蛇代码来咯[剑指offer] 从尾到头打印链表一种方法是利用栈来实现;另外一种方法是利用三个指针把链表反转,关键是 r 指针保存断开的节点。

前途光明的机器学习将走向何方?这里有 5 个关于它的未来预测机器学习目前是IT 领域最热门的话题之一,这是因为它在看似无限的应用场景中都能发挥自身的作用。

从检测欺诈网站到自动驾驶汽车,再到识别你的“金牌会员”身份以进行...Spark2.x学习笔记:18、Spark Streaming程序解读《Spark2.x学习笔记》18、Spark Streaming程序解读18.1 Spark Streaming原理Spark Streaming将流式计...设计模式——策略模式一个商场中,针对不同的消费者,进行不同的消费打折促销,普通消费者打9.8折,VIP用户打8折,SVIP用户打7.5折,针对打折这件事,存在三种情况需要考虑,针对...程序猿12个人艰不拆的真相十年生死两茫茫,写程序,到天亮。

千行代码,Bug 何处藏。

纵使上线又怎样,朝令改,夕断肠。

领导每天新想法,天天改,日日忙。

相顾无言,惟有泪千行。

每...Linux CFS调度器之pick_next_task_fair选择下一个被调度的进程--Linux进程的管理与调度(二十八)每个调度器类sched_class都必须提供一个pick_next_task函数用以在就绪队列中选择一个最优的进程来等待调度, 而我们的CFS调度器类中, 选择...。

C语言学习知识贪吃蛇自动行走

C语言学习知识贪吃蛇自动行走

#include<stdio.h>#include<stdlib.h>#include<windows.h>#include<conio.h>#include <time.h>//定位函数void GotoXY(short y,short x){HANDLE app=GetStdHandle(STD_OUTPUT_HANDLE);COORD t;t.Y=y;t.X=x*2;SetConsoleCursorPosition(app,t);}#define CHANG 30#define KUAN 30#define LONG 100 //蛇的最大长度int Y=(CHANG+2)/2;int X=(KUAN+8)/2; //头的初始坐标int Y1=(CHANG+2)/2-1;int X1=(KUAN+8)/2-4; //头在数组中的初始位置int main(){int i,j,k=0,n=0;int judge=1; //judge--判断是否可执行del,0可,1不可int score=0; //score--分数int randjudge=0; //食物置放条件的判断int rulejudge=0;char c=0,c1;int youxi[CHANG][KUAN]={0}; //外围边框初始化int del[2]={Y,X}; //定位到删除的位置char snlong[LONG]={0}; //snack long简写,蛇的长度,记录消除坐标clock_t time;int timedif;int speed=500;int speedjudge;printf("\t\t\t\t 贪吃蛇\n");// 外围框架for(i=0;i<CHANG;i++){printf("\t");for(j=0;j<KUAN;j++)if(i==0||j==0||KUAN-j==1||CHANG-i==1){youxi[i][j]=1;printf("■");if(KUAN-j==1)printf("\n ");}else printf(" ");}GotoXY(6,0); //操作和退出说明printf("方向:\n 5\n123\n");printf("\n退出:\nESC\n\n");printf("加速:7\n");printf("减速:4\n");GotoXY(Y,X); //初始头的位置printf("■");youxi[Y1][X1]=1;while(c!=27){if(randjudge==0) //满足食物置放条件{do{i=rand()%(CHANG-2)+2;j=rand()%(KUAN-2)+5;}while(youxi[i-1][j-4]!=0);GotoXY(i,j); //食物置放printf("■");youxi[i-1][j-4]=2;}randjudge=1; // 重置随机食物置放的条件srand(clock()); // 运用随机数种子,使置放更随机//if-3个elseif上下左右if(c=='5')//上{if(youxi[Y1-1][X1]==1){rulejudge=1;break;}else if(youxi[Y1-1][X1]!=2) //判断是否吃到,没吃到则达到尾端消除条件judge=0;else //吃到则满足随机放置食物条件{randjudge=0;score++;}snlong[k++]=c; //用于消除的坐标存储youxi[--Y1][X1]=1; //行进的位置置1,用于阻断头的穿插重复GotoXY(--Y,X); //行进显示printf("■");}else if(c=='2')//下{if(youxi[Y1+1][X1]==1){rulejudge=1;break;}else if(youxi[Y1+1][X1]!=2)judge=0;else{randjudge=0;score++;}snlong[k++]=c;youxi[++Y1][X1]=1;GotoXY(++Y,X);printf("■");else if(c=='1')//左{if(youxi[Y1][X1-1]==1){rulejudge=1;break;}else if(youxi[Y1][X1-1]!=2)judge=0;else{randjudge=0;score++;}snlong[k++]=c;youxi[Y1][--X1]=1;GotoXY(Y,--X);printf("■");else if(c=='3')//右{if(youxi[Y1][X1+1]==1){rulejudge=1;break;}else if(youxi[Y1][X1+1]!=2)judge=0;else{randjudge=0;score++;}snlong[k++]=c;youxi[Y1][++X1]=1;GotoXY(Y,++X);printf("■");//记录消除坐标的数组的循环使用if(k>=LONG)k=0;//if{} 消除区if(judge==0){if(n>=LONG)n=0;switch(snlong[n]){case '5':youxi[del[0]-1][del[1]-4]=0;GotoXY(del[0]--,del[1]+1);printf("\b ");break;case '2':youxi[del[0]-1][del[1]-4]=0;GotoXY(del[0]++,del[1]+1);printf("\b ");break;case '1':youxi[del[0]-1][del[1]-4]=0;GotoXY(del[0],del[1]--);printf(" ");break;case '3':youxi[del[0]-1][del[1]-4]=0;GotoXY(del[0],++del[1]);printf("\b ");break;}n++;}//重置消除入口的条件judge=1;//显示位置和分数GotoXY(0,0);printf("位置:\n%2d %2d\n",Y1,X1); printf("分数:\n%d\n",score);//超出长度if(score>=LONG-1)break;//方向输入time=clock();timedif=1;while(timedif){if(kbhit())c=getch();if(clock()-time>=speed)timedif=0;,.}//变速区if(c!='4'&&c!='7')c1=c;switch(c){case '7':speed-=speed>100?100:0;c=c1;break;case '4':speed+=speed<1000?100:0;c=c1;break;}}system("cls");if(rulejudge==1)printf("你输了,分数是:%d",score);else printf("游戏结束, 你的分数是:%d",score);printf("\n请按任意键退出");getch();}。

c语言贪吃蛇详解3.让蛇动起来

c语言贪吃蛇详解3.让蛇动起来

c语⾔贪吃蛇详解3.让蛇动起来c语⾔贪吃蛇详解3.让蛇动起来前⼏天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写⼀下题解。

我将分⼏步来教⼤家写⼀个贪吃蛇⼩游戏。

由于⼤家c语⾔未学完,这个教程只涉及数组和函数等知识点。

上次我已经教⼤家画出蛇了,现在我就教⼤家让蛇动起来。

为了让⼤家更好理解,蛇的移动就⽤最简单的办法,这⾥就不⽤链表,顺序队列什么的了。

蛇的移动就是头往前移动,然后后⾯的⾝体移动到前⼀节⾝体原来的位置上。

就像这样: int i;for(i=sLength-1;i<1;i--) //从尾巴开始,每⼀个点的位置等于它前⾯⼀个点的位置{s[i][0]=s[i-1][0];s[i][1]=s[i-1][1];}那蛇头怎么办呢?为了确定蛇头的位置,我们定义⼀个变量原来存储蛇现在的⽅向。

int direction; //蛇的⽅向我们可以通过direction的值来标记现在蛇的⽅向。

⽐如0代表上,1代表下。

为了⽅便,我们定义⼀些常量//定义direction的每个值代表的⽅向#define UP 0#define DOWN 1#define LEFT 2#define RIGHT 3这样,我们就可以这样写switch(direction){case UP:s[0][0]--;break;case DOWN:s[0][0]++;break;case LEFT:s[0][1]--;break;case RIGHT:s[0][1]++;break;}写好的move函数如下void move(){int i;for(i=sLength-1;i>0;i--) //从尾巴开始,每⼀个点的位置等于它前⾯⼀个点的位置{s[i][0]=s[i-1][0];s[i][1]=s[i-1][1];}switch(direction){case UP:s[0][0]--;break;case DOWN:s[0][0]++;break;case LEFT:s[0][1]--;break;case RIGHT:s[0][1]++;break;}}然后move写好了,我们还要写个循环,这样就可以让蛇⼀直动了。

贪吃蛇-C语言

贪吃蛇-C语言

实验报告实验课程名称:贪吃蛇年12月15日目录目录 (1)一、需求分析 (2)1.1设计目的 (2)1.2设计内容 (2)二、概要设计 (3)三、详细设计 (3)四、测试分析 (11)五、用户使用说明 (14)六、总结 (14)6.1、需求分析方面 (14)6.2、数据结构 (14)6.3、遇到的问题 (14)7、附录(程序源代码) (15)一、需求分析1.1设计目的贪吃蛇是简单的益智类小游戏,选择这个题目是为了将我们所学的人工智能课程的知识加以运用,,它的实现对于以前的我们而言都是很神秘的。

我们希望通过自己所学的知识把它剖析开来,真真正正地了解它的本质和精髓。

同时更进一步地掌握c++以及数据结构的理论知识与实际应用,熟悉基本的游戏软件开发过程。

根据分析后的贪吃蛇结构设计出相应的游戏流程,主要内容包括:游戏开始,定义活动范围,随机出现食物,方向控制,游戏结束,分数以及难度的显示。

1.2设计内容1.通过输入地图长度、宽度,划出snake活动的区域,同时选择游戏难度,游戏难度通过移动速度来决定。

2.食物的随机生成3. 用键盘上的W ASD键对snake的活动方向进行控制。

蛇身方向的处理,控制蛇头的移动,定一个双向链表,用来保管每次移动完以后,每一节蛇身的位置,下一次的时候,每一个蛇身读取前一个蛇身的坐标,就可以实现蛇的整体移动。

移动完以后,新的坐标被保管进数组,如此一直循环下去。

选择的数据结构:双向链表、队列、广度优先搜索4.撞墙和撞到本身,撞墙判断蛇头坐标是否到边界。

撞到本身,做一个循环判断蛇头的坐标是否和其他蛇身相等。

流程图如下:二、概要设计功能块各函数列表:bool Auto::bfs(int sx,int sy,int ex,int ey) //广度优先搜索函数,用于搜索路径void snake::add_head(int xx,int yy)//增加蛇头结点void snake::del_tail() //删除蛇尾结点void Map::initMap() //初始化地图void Map::outputMap() //打印出游戏当前的状态void move::get_food() //随机生成食物int move::movesnake() //移动蛇身bool move::turn_dir(char op) //snake移动方向控制bool game() //开始游戏,设置地图,并选择游戏模式void welcome() //进入游戏结构体细分功能:struct point{int x,y,step; //储存搜索状态int path[900];};struct snake_node{int x; //蛇头结点横坐标int y; //蛇头结点纵坐标int rank; //第几个蛇结点};三、详细设计//广度优先搜索函数bool Auto::bfs(int sx,int sy,int ex,int ey) //BFS在选择自动后,调用该函数搜索{point in,out;int i,j,step,x,y,way,len;int d[4][2]={-1,0,1,0,0,-1,0,1};int g[8][4]={0,1,2,3,0,3,1,2,3,2,0,1,1,2,0,3,1,3,0,2,2,1,3,0,2,0,3,1,3,1,0,2};memset(vis,0,sizeof(vis));memset(path,0,sizeof(path));list<snake::snake_node>::iterator it=s.l.begin();for(;it!=s.l.end();it++){x=it->x;y=it->y;vis[x][y]=it->rank;}in.x=sx;in.y=sy;in.step=0;len=s.l.size();while(!q.empty()) q.pop();q.push(in);while(!q.empty()){out=q.front();q.pop();if(out.x==ex && out.y==ey){for(j=0;j<out.step;j++) path[j]=out.path[j];return true;}step=out.step+1;way=rand()%8;for(i=0;i<4;i++){x=out.x+d[g[way][i]][0];y=out.y+d[g[way][i]][1];if(f.map[x][y]=='#') continue;if(!vis[x][y] || vis[out.x][out.y]-vis[x][y]>=len ) {vis[x][y]=vis[out.x][out.y]+1;in.x=x;in.y=y;in.step=step;for(j=0;j<out.step;j++) in.path[j]=out.path[j]; in.path[out.step]=g[way][i]+1;q.push(in);}}}return false;}//增加蛇头函数void snake::add_head(int xx,int yy){snake_node temp;temp.x=xx;temp.y=yy;if(l.size()==0) temp.rank=1;else temp.rank=l.begin()->rank+1;l.push_front(temp);//以下用于改变蛇头图标和第二个蛇结点图标if(m.dir==up) f.map[xx][yy]=30;else if(m.dir==down) f.map[xx][yy]=31;else if(m.dir==lef) f.map[xx][yy]=17;else f.map[xx][yy]=16;if(l.size()>1){list<snake_node>::iterator it;it=l.begin();it++;xx=it->x;yy=it->y;f.map[xx][yy]=body;}}//删除蛇尾结点函数void snake::del_tail(){int xx,yy;list<snake_node>::iterator it;it=l.end();it--;xx=it->x;yy=it->y;f.map[xx][yy]=' '; //将蛇尾变为' 'l.erase(it);}//初始化地图函数void Map::initMap(){for(int i=0;i<map_len;i++){for(int j=0;j<map_wide;j++){if(i==0 || i==map_len-1 || j==0 || j==map_wide-1)map[i][j]='#';else map[i][j]=' ';}}}//打印函数void Map::outputMap(){for(int i=0;i<map_len;i++){for(int j=0;j<map_wide;j++)printf("%c",map[i][j]);if(i==(map_len>>1)-2)printf("\t当前得分: %d",m.num);if(i==(map_len>>1)) printf("\t当前难度: %d",m.lv);if(i==(map_len>>1)+2)printf("\t 最高分: %d",Best_score);puts("");}}//随机生成食物函数void move::get_food(){struct empty_gard{int x,y;}temp[900];int tnum=0;for(int i=1,len=map_len-1;i<len;i++) //把空格找出来for(int j=1,wide=map_wide-1;j<=wide;j++)if(f.map[i][j]==' '){temp[tnum].x=i;temp[tnum++].y=j;}int g=rand()%tnum; //随机选一个点变成食物srand((unsigned int) time(NULL));food_x=temp[g].x;food_y=temp[g].y;f.map[food_x][food_y]=food;}//移动蛇身函数,播放音乐int move::movesnake(){int x=s.l.begin()->x;int y=s.l.begin()->y;if(dir==up) x--; //根据方向移动蛇if(dir==down) x++;if(dir==lef) y--;if(dir==rig) y++;if(f.map[x][y]!=' ' && f.map[x][y]!=food){f.outputMap();PlaySound(TEXT("death.wav"), NULL, SND_ASYNC | SND_NODEFAULT); //播放音乐的puts("\n\n\t\tGAME OVER!!\n\n");puts("\n\n\Play Again??? YES press Y ; NO press OtherKey\n\n");if(m.num>Best_score) Best_score=m.num;char op;op=getch();if(op=='Y' || op=='y') return 1;else return 0;}else if(f.map[x][y]==food){PlaySound(TEXT("eat.wav"), NULL, SND_ASYNC | SND_NODEFAULT);s.add_head(x,y);num++;get_food();if(num && num%3==0 && lv>most_difficult) //每吃3个食物难度+1{lv--;}}else{s.add_head(x,y);s.del_tail();}return 2; //返回2表示没game over 继续游戏}//控制移动方向函数bool move::turn_dir(char op){if((op=='w' || op=='W' || op==1) && dir!=down){dir=up;return true;}if((op=='s' || op=='S' || op==2) && dir!=up){dir=down;return true;}if((op=='a' || op=='A' || op==3) && dir!=rig){dir=lef;return true;}if((op=='d' || op=='D' || op==4) && dir!=lef){dir=rig;return true;}return false;}//开始游戏函数bool game(){int temp;cout<<"输入地图长度(10~30):"<<endl;while(true){cin>>map_len;if(10<=map_len && map_len<=30) break;cout<<"Input Again"<<endl;}cout<<"输入地图宽度(10~30):"<<endl;while(true){cin>>map_wide;if(10<=map_wide && map_wide<=30) break;cout<<"Input Again"<<endl;}while(true){cout<<"选择游戏难度(Lv."<<most_difficult<<"~20 等级越低,难度越大):"<<endl;cin>>m.lv;m.num=(20-m.lv)*3;if(most_difficult<=m.lv && m.lv<=20) break;cout<<"Input Again"<<endl;}puts("\t自动??? YES press Y\t\tNO press OtherKey\n");f.initMap();int mid_x=map_len>>1; //下面几句用来初始化游戏加入两个蛇结点和第一个食物int mid_y=map_wide>>1;s.add_head(mid_x,mid_y);s.add_head(mid_x,mid_y+1);m.get_food();f.outputMap();puts("\t用W S A D 控制蛇的前进方向,难度会随着分数变得困难。

C语言学习:三天写好贪吃蛇小游戏

C语言学习:三天写好贪吃蛇小游戏

C语言学习:三天写好贪吃蛇小游戏们知道C语言学好之后,学习C++、java、python等是非常快的。

其中C++开发游戏还是强的啊。

C语言和C++就大同小异了,所以你想开发一个像王者荣耀一样的游戏,C语言得学好了啊。

都是废话,今天给大家讲利用C语言写一个贪吃蛇游戏,只要你跟着我的思路走,贪吃蛇游戏你完全可以掌握的游刃有余,好吧!说明一下:1.贪吃蛇游戏分三次讲完,每次都不容错过,都是干货。

2.贪吃蛇游戏你应该会玩吧,我小时候老爱玩了,这个游戏用C 语言来写是比较简单的,意思说你只需要懂一些基本知识就可以明白,不需要指针,不需要复杂的图形库,代码也只有两百多行,对于游戏项目来说算少的啦。

3.就是C语言知识我也写了很多文章了,大家可以查看我以前的文章,好吧。

相同问题我的思路或许比你的好喔。

贪吃蛇游戏依赖TC环境,不依赖任何第三方库,可以在VC 6.0、VS、C-Free等常见IDE中编译通过。

设计贪吃蛇游戏的主要目的是让大家夯实C语言基础,训练编程思维,培养解决问题的思路,领略多姿多彩的C语言。

小编给大家推荐一个学习氛围超好的地方,C/C++交流企鹅裙:【三四一,六三六,七二七】适合在校大学生,小白,想转行,想通过这个找工作的加入。

裙里有大量学习资料,有大神解答交流问题,每晚都有免费的直播课程主要框架:今天主要讲大概的程序设计框架,以后我们学其他的系统等也是这个思路,先有一个完整的框架,这样我们每做一件事都心中有数。

1.改变界面的颜色。

2.键盘监听。

3.获取随机数。

4.输出贪吃蛇背景地图。

5.让贪吃蛇移动起来。

6.随机生成食物。

7.记录我们的游戏得分。

8.我们还需要记录坐标。

就是我想到的一些关键点,这些都是我们接下来这两天需要解决的问题。

如果到现在你觉得很无聊,我们接下来看一下我已经写好的C语言小程序的效果图吧,是时候展现真正的技术了!贪吃蛇效果图,我们最终的成果初始化界面我的战绩,可以吧!还可以的呀这是我提前写好的程序,还是挺好看的,贪吃蛇是不是让你想起了当年在诺基亚手机上的游戏了,都老了呀。

C 贪吃蛇总结

C  贪吃蛇总结

C 贪吃蛇总结引言贪吃蛇是一款经典的电子游戏,也是许多初学者编程的练手项目。

本文将总结使用 C 语言编写贪吃蛇游戏的过程和经验,并探讨一些可能的改进和优化方案。

游戏规则贪吃蛇游戏的基本规则如下: - 蛇由一条连续的方块组成,初始时长度较短。

- 蛇头可以通过键盘控制上、下、左、右的方向移动。

- 蛇头移动时身体的每个方块都会向前移动,形成蛇的移动效果。

- 如果蛇头碰到边界或者自己的身体,游戏结束。

- 在地图上会随机出现食物,蛇吃到食物时长度会增加。

主要功能实现在 C 语言中实现贪吃蛇游戏,我们需要考虑一些主要功能实现:绘制地图通过使用 ASCII 字符来绘制游戏地图,可以使用二维字符数组代表地图的各个位置。

地图可以用‘#’ 表示边界,空格字符表示空位,’O’表示蛇身体,’@’ 表示食物。

控制蛇的移动为了实现蛇的移动,我们需要记录蛇的当前位置和方向。

可以使用一个链表来表示蛇的身体,每个节点包含位置和指向下一个节点的指针。

蛇的移动可以通过在链表头部添加一个新节点,同时在尾部删除一个节点来实现。

处理用户输入通过监听键盘输入,可以实现控制蛇的移动方向。

例如,按下‘W’ 可以控制蛇向上移动,按下‘S’ 可以控制蛇向下移动,以此类推。

食物的生成和判断在地图上随机生成食物,并且需要判断蛇是否吃到食物。

如果蛇吃到食物,需要处理蛇的长度增加和生成新的食物。

游戏结束的判断在每次蛇移动后,需要判断是否游戏结束。

如果蛇头碰到边界或者蛇身体,则游戏结束。

实现过程中的挑战和经验编写贪吃蛇游戏时,可能会遇到一些挑战和问题。

以下是一些经验教训和解决方案:•统一使用时间间隔控制蛇的移动速度,以避免在不同系统上游戏速度不一致的问题。

•使用一个额外的数组来存储地图的状态,可以提高游戏性能。

•蛇的移动需要考虑边界和碰撞检测,务必确保边界和碰撞判定的准确性。

•合理设计游戏难度,包括蛇的速度和食物生成频率,以保持游戏的可玩性。

可能的改进和优化方案尽管本文提供了基本的贪吃蛇游戏实现方案,但仍然有许多改进和优化的空间。

C语言贪吃蛇实验报告

C语言贪吃蛇实验报告

C语言贪吃蛇实验报告实验报告:C语言贪吃蛇游戏的实现一、引言贪吃蛇是一款非常经典的游戏,它的规则简单而有趣,对于初学者来说,实现一个贪吃蛇游戏是一个很好的练习项目。

本实验报告将介绍如何使用C语言实现一个简单的贪吃蛇游戏。

二、实验内容1.界面设计贪吃蛇游戏的界面包括游戏区域和游戏信息区。

游戏区域是以二维数组表示的地图,贪吃蛇和食物在地图上移动。

游戏信息区可以显示得分、游戏状态等信息。

2.贪吃蛇的移动贪吃蛇的移动是贪吃蛇游戏的核心部分。

贪吃蛇每次移动时,头部朝着移动的方向前进一格,身体部分跟随头部的移动。

如果吃到食物,贪吃蛇的长度会增加。

3.游戏结束判定游戏结束有两种情况:贪吃蛇撞到地图边界或者撞到自己的身体。

游戏结束后,可以显示得分信息。

三、实验过程1.设计游戏界面使用C语言的“#include <conio.h>”头文件中的一些函数,可以控制台下的光标位置,从而实现贪吃蛇游戏的界面设计。

2.实现贪吃蛇的移动首先定义了一个结构体Snake来表示贪吃蛇,结构体中包含了贪吃蛇的长度、坐标等信息。

使用动态数组保存贪吃蛇的身体坐标,每次移动时改变贪吃蛇头部的坐标,并更新贪吃蛇的位置。

3.生成食物使用rand函数生成一个随机数作为食物的坐标,在游戏区域内随机生成。

每次贪吃蛇吃到食物时,贪吃蛇的长度加1,并生成新的食物。

4.游戏结束判定在每次贪吃蛇移动时,判断贪吃蛇的头部是否撞到地图边界或者撞到自己的身体,如果是则游戏结束。

四、实验结果经过代码的实现和调试,成功完成了C语言贪吃蛇游戏的编写。

在控制台下可以看到一个游戏界面,贪吃蛇可以按照指定的方向移动,并且能够吃到食物,蛇的长度会随之增加。

当贪吃蛇撞到边界或者自己的身体时,游戏会结束,并显示得分信息。

五、实验总结通过本次实验,我深入了解了贪吃蛇游戏的实现原理,掌握了C语言的数组、结构体等基本知识,并通过实践加深了对这些知识的理解。

在实验过程中,我遇到了一些问题,比如如何设计游戏界面、如何控制贪吃蛇的移动、如何生成食物等等。

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

相关文档
最新文档