【从入门到入土系列】C语言制作小游戏-贪吃蛇:Copy+运行即可另附注释
系列文章
本系列持续更新中,欢迎您的访问!
系列简介
本系列由唐文疏撰写,负责记录博主的学习生涯中的一点一滴。独乐乐不如众乐乐,故此分享给大家。欢迎大家一起讨论、学习和批评指点。
博主只是一个普普通通的13岁初中生,精力不足,年龄尚小,仍有缺陷,请谅解!
也希望大家不吝啬自己的评论,对博主进行指点教育,万分感谢。期待我们的明天会更好!
系列目录
- 【从入门到入土系列】C语言制作小游戏-贪吃蛇:Copy+运行即可另附注释
更多敬请期待
本文目录
- 系列文章
- 系列简介
- 系列目录
- 前言
- 一、贪吃蛇是什么?
- 1. 名词释义
- 2. 贪吃蛇阉割版
- 3. 游戏规则
- 二、源程序
- 1. 预定义
- 2. 全局变量
- 3. 函数拆讲(含注释)
- gotoxy()函数
- color()函数
- welcometogame()函数
- createMap()函数
- scoreandtips()函数
- initsnake()函数
- createfood()函数
- biteself()函数和cantcrosswall()函数
- speedup()函数和speeddown()函数
- snakemove()函数
- keyboardControl()函数
- explation()函数
- endgame()函数
- choose()函数
- Lostdraw()函数
- 4. 完整代码(Copy+运行)
- 总结
- 程序展示
前言
贪吃蛇游戏:用键盘上下左右控制蛇的方向,寻找吃的东西,每吃一口就能得到一定的积分,而且蛇的身子会越吃越长,身子越长玩的难度就越大,不能碰墙,不能咬到自己的身体,更不能咬自己的尾巴,等到了一定的分数,就能过关,然后继续玩下一关。
这个游戏大家从小玩到大,非常受广大玩家的喜爱,那么自己怎么才能进行制作呢?
提示:以下是本篇文章正文内容,为大家带来【贪吃蛇阉割版】,下面C语言案例可供参考
一、贪吃蛇是什么?
1. 名词释义
贪吃蛇游戏是一款休闲益智类游戏,有PC和手机等多平台版本。既简单又耐玩。该游戏通过控制蛇头方向吃蛋,从而使得蛇变得越来越长。
贪吃蛇游戏最初为单机模式,后续又陆续推出团战模式、赏金模式、挑战模式等多种玩法。
2. 贪吃蛇阉割版
由于市面上的贪吃蛇更新迭代太快,很多新功能、新玩法博主无法实现,只因尚未学习到那里。
所以这里的贪吃蛇游戏功能较少,于是称为阉割版。
3. 游戏规则
- 不能穿墙,不能咬到自己
- 用↑.↓.←.→分别控制蛇的移动
- F1 为加速,F2 为减速
- 按空格键暂停游戏,再按空格键继续
- ESC :退出游戏.space:暂停游戏
二、源程序
提示:函数拆讲中的代码会附有注释,但是完整程序中不会有注释
1. 预定义
#define U 1
#define D 2
#define L 3
#define R 4
蛇的状态,U:上 ;D:下;L:左 R:右
2. 全局变量
typedef struct snake /* 蛇身的一个节点 */
{int x;int y;struct snake *next;
}snake;
int score = 0, add = 10; /* 总得分与每次吃食物得分 */
int status, sleeptime = 200; /* 蛇前进状态,每次运行的时间间隔 */
snake *head, *food; /* 蛇头指针,食物指针 */
snake *q; /* 遍历蛇的时候用到的指针 */
int endgamestatus = 0; /* 游戏结束的情况,1:撞到墙;2:咬到自己;3:主动退出游戏。 */
HANDLE hOut; /* 控制台句柄 */
3. 函数拆讲(含注释)
gotoxy()函数
void gotoxy( int x, int y )
{COORD c;c.X = x;c.Y = y;SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), c );
}
作用:设置光标位置
color()函数
int color( int c )
{SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), c ); /* 更改文字颜色 */return(0);
}
作用:用来更改文字颜色
welcometogame()函数
void welcometogame()
{int n;gotoxy( 43, 10 );color( 11 );printf( "贪 吃 蛇 大 作 战" );color( 12 );gotoxy( 25, 22 );printf( "1.开始游戏" );gotoxy( 45, 22 );printf( "2.游戏说明" );gotoxy( 65, 22 );printf( "3.退出游戏" );gotoxy( 40, 27 );color( 3 );printf( "请选择 1 2 3:" );color( 14 );scanf( "%d", &n ); /* 输入选项 */switch ( n ){case 1:system( "cls" );createMap(); /* 创建地图 */initsnake(); /* 初始化蛇身 */createfood(); /* 创建食物 */keyboardControl(); /*按键控制 */break;case 2:explation(); /* 游戏说明函数 */break;case 3:exit( 0 ); /* 退出游戏 */break;default:color( 12 );gotoxy( 40, 28 );printf( "请输入1—3之间的数!" );_getch(); /* 输入任意键 */system( "cls" ); /* 清屏 */welcometogame();}
}
作用:开始界面(具体注释在代码后面)
createMap()函数
void createMap()
{int i, j;for ( i = 0; i < 58; i += 2 ) /* 打印上下边框 */{gotoxy( i, 0 );color( 5 );printf( "□" );gotoxy( i, 26 );printf( "□" );}for ( i = 1; i < 26; i++ ) /* 打印左右边框 */{gotoxy( 0, i );printf( "□" );gotoxy( 56, i );printf( "□" );}for ( i = 2; i < 56; i += 2 ) /* 打印中间网格 */{for ( j = 1; j < 26; j++ ){gotoxy( i, j );color( 3 );printf( "■" );}}
}
作用:创建地图
scoreandtips()函数
void scoreandtips()
{gotoxy( 64, 8 );color( 14 );printf( "得分:%d ", score );gotoxy( 64, 14 );printf( "每个食物得分:%d分", add );gotoxy( 64, 16 );printf( "不能穿墙,不能咬到自己" );gotoxy( 64, 18 );printf( "用↑ ↓ ← →分别控制蛇的移动" );gotoxy( 64, 20 );printf( "F1 为加速,F2 为减速" );gotoxy( 64, 22 );printf( "space:暂停游戏" );gotoxy( 64, 24 );printf( "ESC :退出游戏" );
}
作用:创建游戏地图右侧的得分栏
initsnake()函数
void initsnake()
{snake *tail;int i;tail = (snake *) malloc( sizeof(snake) ); /* 从蛇尾开始,头插法,以x,y设定开始的位置 */tail->x = 24; /* 蛇的初始位置(24,5) */tail->y = 5;tail->next = NULL;for ( i = 1; i <= 4; i++ ) /* 设置蛇身,长度为5 */{head = (snake *) malloc( sizeof(snake) ); /* 初始化蛇头 */head->next = tail; /* 蛇头的下一位为蛇尾 */head->x = 24 + 2 * i; /* 设置蛇头位置 */head->y = 5;tail = head; /* 蛇头变成蛇尾,然后重复循环 */}while ( tail != NULL ) /* 从头到尾,输出蛇身 */{gotoxy( tail->x, tail->y );color( 14 );printf( "★" ); /* 输出蛇身,蛇身使用★组成 */tail = tail->next; /* 蛇头输出完毕,输出蛇头的下一位,一直输出到蛇尾 */}
}
作用:初始化蛇身
createfood()函数
void createfood()
{snake *food_1;srand( (unsigned) time( NULL ) ); /* 初始化随机数 */food_1 = (snake *) malloc( sizeof(snake) ); /* 初始化food_1 */while ( (food_1->x % 2) != 0 ) /* 保证其为偶数,使得食物能与蛇头对其,然后食物会出现在网格线上 */{food_1->x = rand() % 52 + 2; /* 食物随机出现 */}food_1->y = rand() % 24 + 1;q = head;while ( q->next == NULL ){if ( q->x == food_1->x && q->y == food_1->y ) /* 判断蛇身是否与食物重合 */{free( food_1 ); /* 如果蛇身和食物重合,那么释放食物指针 */createfood(); /* 重新创建食物 */}q = q->next;}gotoxy( food_1->x, food_1->y );food = food_1;color( 12 );printf( "●" ); /* 输出食物 */
}
作用:随机出现食物
biteself()函数和cantcrosswall()函数
/*** 判断是否咬到了自己*/
int biteself()
{snake *self; /* 定义self为蛇身上的一个节点 */self = head->next; /* self是蛇头之外的蛇身上的节点 */while ( self != NULL ){if ( self->x == head->x && self->y == head->y ) /* 如果self和蛇身上的节点重合 */{return(1); /* 返回1 */}self = self->next;}return(0);
}/*** 设置蛇撞墙的情况*/
void cantcrosswall()
{if ( head->x == 0 || head->x == 56 || head->y == 0 || head->y == 26 ) /* 如果蛇头碰到了墙壁 */{endgamestatus = 1; /* 返回第一种情况 */endgame(); /* 出现游戏结束界面 */}
}
作用:判断玩家是否出现失误,如果有则结束游戏
speedup()函数和speeddown()函数
/*** 加速,蛇吃到食物会自动提速,并且按F1会加速*/
void speedup()
{if ( sleeptime >= 50 ){sleeptime = sleeptime - 10;add = add + 2;}
}/*** 加速,按F2会减速*/
void speeddown()
{if ( sleeptime < 350 ) /* 如果时间间隔小于350 */{sleeptime = sleeptime + 30; /* 时间间隔加上30 */add = add - 2; /* 每吃一次食物的得分减2 */}
}
作用:控制蛇的速度
snakemove()函数
void snakemove() /* 蛇前进,上U,下D,左L,右R */
{snake * nexthead;cantcrosswall();nexthead = (snake *) malloc( sizeof(snake) ); /* 为下一步开辟空间 */if ( status == U ){nexthead->x = head->x; /* 向上前进时,x坐标不动,y坐标-1 */nexthead->y = head->y - 1;nexthead->next = head;head = nexthead;q = head; /* 指针q指向蛇头 */if ( nexthead->x == food->x && nexthead->y == food->y ) /* 如果下一个有食物 下一个位置的坐标和食物的坐标相同 */{while ( q != NULL ){gotoxy( q->x, q->y );color( 14 );printf( "★" ); /* 原来食物的位置,从●换成★ */q = q->next; /* 指针q指向的蛇身的下一位也执行循环里的操作 */}score = score + add; /* 吃了一个食物,在总分上加上食物的分 */speedup();createfood(); /* 创建食物 */}else {while ( q->next->next != NULL ) /* 如果没遇到食物 */{gotoxy( q->x, q->y );color( 14 );printf( "★" ); /* 蛇正常往前走,输出当前位置的蛇身 */q = q->next; /* 继续输出整个蛇身 */}gotoxy( q->next->x, q->next->y ); /* 经过上面的循环,q指向蛇尾,蛇尾的下一位,就是蛇走过去的位置 */color( 3 );printf( "■" );free( q->next ); /* 进行输出■之后,释放指向下一位的指针 */q->next = NULL; /* 指针下一位指向空 */}}if ( status == D ){nexthead->x = head->x; /* 向下前进时,x坐标不动,y坐标+1 */nexthead->y = head->y + 1;nexthead->next = head;head = nexthead;q = head;if ( nexthead->x == food->x && nexthead->y == food->y ) /*有食物 */{while ( q != NULL ){gotoxy( q->x, q->y );color( 14 );printf( "★" );q = q->next;}score = score + add;speedup();createfood();}else { /* 没有食物 */while ( q->next->next != NULL ){gotoxy( q->x, q->y );color( 14 );printf( "★" );q = q->next;}gotoxy( q->next->x, q->next->y );color( 3 );printf( "■" );free( q->next );q->next = NULL;}}if ( status == L ){nexthead->x = head->x - 2; /* 向左前进时,x坐标向左移动-2,y坐标不动 */nexthead->y = head->y;nexthead->next = head;head = nexthead;q = head;if ( nexthead->x == food->x && nexthead->y == food->y ) /*有食物 */{while ( q != NULL ){gotoxy( q->x, q->y );color( 14 );printf( "★" );q = q->next;}score = score + add;speedup();createfood();}else { /* 没有食物 */while ( q->next->next != NULL ){gotoxy( q->x, q->y );color( 14 );printf( "★" );q = q->next;}gotoxy( q->next->x, q->next->y );color( 3 );printf( "■" );free( q->next );q->next = NULL;}}if ( status == R ){nexthead->x = head->x + 2; /* 向右前进时,x坐标向右移动+2,y坐标不动 */nexthead->y = head->y;nexthead->next = head;head = nexthead;q = head;if ( nexthead->x == food->x && nexthead->y == food->y ) /*有食物 */{while ( q != NULL ){gotoxy( q->x, q->y );color( 14 );printf( "★" );q = q->next;}score = score + add;speedup();createfood();}else { /* 没有食物 */while ( q->next->next != NULL ){gotoxy( q->x, q->y );color( 14 );printf( "★" );q = q->next;}gotoxy( q->next->x, q->next->y );color( 3 );printf( "■" );free( q->next );q->next = NULL;}}if ( biteself() == 1 ) /* 判断是否会咬到自己 */{endgamestatus = 2;endgame();}
}
作用:控制方向
keyboardControl()函数
void keyboardControl()
{status = R; /* 初始蛇向右移动 */while ( 1 ){scoreandtips();if ( GetAsyncKeyState( VK_UP ) && status != D ) /* GetAsyncKeyState函数用来判断函数调用时指定虚拟键的状态 */{status = U; /* 如果蛇不是向下前进的时候,按上键,执行向上前进操作 */}else if ( GetAsyncKeyState( VK_DOWN ) && status != U ) /* 如果蛇不是向上前进的时候,按下键,执行向下前进操作 */{status = D;}else if ( GetAsyncKeyState( VK_LEFT ) && status != R ) /* 如果蛇不是向右前进的时候,按左键,执行向左前进 */{status = L;}else if ( GetAsyncKeyState( VK_RIGHT ) && status != L ) /* 如果蛇不是向左前进的时候,按右键,执行向右前进 */{status = R;}if ( GetAsyncKeyState( VK_SPACE ) ) /*按暂停键,执行pause暂停函数 */{while ( 1 ){Sleep( 300 ); /* sleep()函数,头文件#include <unistd.h> 另进程暂停,知道达到里面设定的参数的时间。 */if ( GetAsyncKeyState( VK_SPACE ) ) /*按空格键暂停 */{break;}}}else if ( GetAsyncKeyState( VK_ESCAPE ) ){endgamestatus = 3; /*按esc键,直接到结束界面 */break;}else if ( GetAsyncKeyState( VK_F1 ) ) /*按F1键,加速 */{speedup();}else if ( GetAsyncKeyState( VK_F2 ) ) /*按F2键,减速 */{speeddown();}Sleep( sleeptime );snakemove();}
}
作用:键盘按键控制游戏
explation()函数
void explation()
{/* int i,j = 1; */system( "cls" );/** color(13);* gotoxy(44,3);* printf("游戏说明");* color(2);* for (i = 6; i <= 22; i++) //输出上下边框===* {* for (j = 20; j <= 75; j++) //输出左右边框||* {* gotoxy(j, i);* if (i == 6 || i == 22) printf("=");* else if (j == 20 || j == 75) printf("||");* }* }*/color( 3 );gotoxy( 30, 8 );printf( "1. 不能穿墙,不能咬到自己" );color( 10 );gotoxy( 30, 11 );printf( "2. 用↑.↓.←.→分别控制蛇的移动" );color( 14 );gotoxy( 30, 14 );printf( "3. F1 为加速,F2 为减速" );color( 11 );gotoxy( 30, 17 );printf( "4. 按空格键暂停游戏,再按空格键继续" );color( 4 );gotoxy( 30, 20 );printf( "5. ESC :退出游戏.space:暂停游戏" );_getch(); /*按任意键返回主界面 */system( "cls" );welcometogame();
}
作用:游戏说明界面
endgame()函数
void endgame()
{system( "cls" );if ( endgamestatus == 1 ){/* Lostdraw(); */gotoxy( 43, 9 );color( 12 );printf( "GAME OVER !" );}else if ( endgamestatus == 2 ){/* Lostdraw(); */gotoxy( 43, 9 );color( 12 );printf( "GAME OVER !" );}else if ( endgamestatus == 3 ){/* Lostdraw(); */gotoxy( 40, 9 );color( 12 );printf( "已结束游戏。" );}gotoxy( 43, 12 );color( 13 );printf( "你的得分是 %d", score );choose();
}
作用:结束游戏
choose()函数
void choose()
{int n;gotoxy( 25, 23 );color( 12 );printf( "Continue ------ 1" );gotoxy( 52, 23 );printf( "Exit ------ 2" );gotoxy( 45, 25 );color( 11 );printf( "选择: " );scanf( "%d", &n );switch ( n ){case 1:system( "cls" ); /* 清屏 */score = 0; /* 分数归零 */sleeptime = 200; /* 设定初始速度 */add = 10; /* 使add设定为初值,吃一个食物得分10,然后累加 */welcometogame();break;case 2:exit( 0 ); /* 退出游戏 */break;default:gotoxy( 35, 27 );color( 12 );printf( " 输入有误 重新输入 !" );system( "pause >nul" );endgame();choose();break;}
}
作用:边框下面的分支选项
Lostdraw()函数
void Lostdraw()
{system( "cls" );int i;gotoxy( 45, 2 );color( 6 );printf( "\\\\\\|///" );gotoxy( 43, 3 );printf( "\\\\" );gotoxy( 47, 3 );color( 15 );printf( ".-.-" );gotoxy( 54, 3 );color( 6 );printf( "//" );gotoxy( 44, 4 );color( 14 );printf( "(" );gotoxy( 47, 4 );color( 15 );printf( ".@.@" );gotoxy( 54, 4 );color( 14 );printf( ")" );gotoxy( 17, 5 );color( 11 );printf( "+------------------------" );gotoxy( 35, 5 );color( 14 );printf( "oOOo" );gotoxy( 39, 5 );color( 11 );printf( "----------" );gotoxy( 48, 5 );color( 14 );printf( "(_)" );gotoxy( 51, 5 );color( 11 );printf( "----------" );gotoxy( 61, 5 );color( 14 );printf( "oOOo" );gotoxy( 65, 5 );color( 11 );printf( "-----------------+" );for ( i = 6; i <= 19; i++ ) /* 竖边框 */{gotoxy( 17, i );printf( "|" );gotoxy( 82, i );printf( "|" );}gotoxy( 17, 20 );printf( "+---------------------------------" );gotoxy( 52, 20 );color( 14 );printf( "☆☆☆〃" );gotoxy( 60, 20 );color( 11 );printf( "----------------------+" );
}
作用:失败界面
4. 完整代码(Copy+运行)
完整实现代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <time.h>
#include <windows.h>
#include <stdlib.h>
#include <conio.h> #define U 1
#define D 2
#define L 3
#define R 4 typedef struct snake
{int x;int y;struct snake *next;
}snake;
int score = 0, add = 10;
int status, sleeptime = 200;
snake *head, *food;
snake *q;
int endgamestatus = 0;
HANDLE hOut;
void gotoxy( int x, int y ); /* 设置光标位置 */int color( int c ); /* 更改文字颜色 */void welcometogame(); /* 开始界面 */void createMap(); /* 绘制地图 */void scoreandtips(); /* 游戏界面右侧的得分和小提示 */void initsnake(); /* 初始化蛇身,画蛇身 */void createfood(); /* 创建并随机出现食物 */int biteself(); /* 判断是否咬到了自己 */void cantcrosswall(); /* 设置蛇撞墙的情况 */void speedup(); /* 加速 */void speeddown(); /* 减速 */void snakemove(); /* 控制蛇前进方向 */void keyboardControl(); /* 控制键盘按键 */void Lostdraw(); /* 游戏结束界面 */void endgame(); /* 游戏结束 */void choose(); /* 游戏失败之后的选择 */void explation(); /* 游戏说明 */void gotoxy( int x, int y )
{COORD c;c.X = x;c.Y = y;SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), c );
}int color( int c )
{SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), c );return(0);
}void welcometogame()
{int n;gotoxy( 43, 10 );color( 11 );printf( "贪 吃 蛇 大 作 战" );color( 12 );gotoxy( 25, 22 );printf( "1.开始游戏" );gotoxy( 45, 22 );printf( "2.游戏说明" );gotoxy( 65, 22 );printf( "3.退出游戏" );gotoxy( 40, 27 );color( 3 );printf( "请选择 1 2 3:" );color( 14 );scanf( "%d", &n ); switch ( n ){case 1:system( "cls" );createMap(); initsnake(); createfood(); keyboardControl(); break;case 2:explation(); break;case 3:exit( 0 ); break;default:color( 12 );gotoxy( 40, 28 );printf( "请输入1—3之间的数!" );_getch(); system( "cls" ); welcometogame();}
}void createMap()
{int i, j;for ( i = 0; i < 58; i += 2 ){gotoxy( i, 0 );color( 5 );printf( "□" );gotoxy( i, 26 );printf( "□" );}for ( i = 1; i < 26; i++ ) {gotoxy( 0, i );printf( "□" );gotoxy( 56, i );printf( "□" );}for ( i = 2; i < 56; i += 2 ) {for ( j = 1; j < 26; j++ ){gotoxy( i, j );color( 3 );printf( "■" );}}
}void scoreandtips()
{gotoxy( 64, 8 );color( 14 );printf( "得分:%d ", score );gotoxy( 64, 14 );printf( "每个食物得分:%d分", add );gotoxy( 64, 16 );printf( "不能穿墙,不能咬到自己" );gotoxy( 64, 18 );printf( "用↑ ↓ ← →分别控制蛇的移动" );gotoxy( 64, 20 );printf( "F1 为加速,F2 为减速" );gotoxy( 64, 22 );printf( "space:暂停游戏" );gotoxy( 64, 24 );printf( "ESC :退出游戏" );
}void initsnake()
{snake *tail;int i;tail = (snake *) malloc( sizeof(snake) ); tail->x = 24; tail->y = 5;tail->next = NULL;for ( i = 1; i <= 4; i++ ) {head = (snake *) malloc( sizeof(snake) ); head->next = tail; head->x = 24 + 2 * i; head->y = 5;tail = head; }while ( tail != NULL ) {gotoxy( tail->x, tail->y );color( 14 );printf( "★" ); tail = tail->next; }
}void createfood()
{snake *food_1;srand( (unsigned) time( NULL ) ); food_1 = (snake *) malloc( sizeof(snake) ); while ( (food_1->x % 2) != 0 ) {food_1->x = rand() % 52 + 2; }food_1->y = rand() % 24 + 1;q = head;while ( q->next == NULL ){if ( q->x == food_1->x && q->y == food_1->y ) {free( food_1 ); createfood(); }q = q->next;}gotoxy( food_1->x, food_1->y );food = food_1;color( 12 );printf( "●" );
}int biteself()
{snake *self; self = head->next; while ( self != NULL ){if ( self->x == head->x && self->y == head->y ){return(1); }self = self->next;}return(0);
}void cantcrosswall()
{if ( head->x == 0 || head->x == 56 || head->y == 0 || head->y == 26 ) {endgamestatus = 1; endgame(); }
}void speedup()
{if ( sleeptime >= 50 ){sleeptime = sleeptime - 10;add = add + 2;}
}void speeddown()
{if ( sleeptime < 350 ) {sleeptime = sleeptime + 30; add = add - 2; }
}void snakemove()
{snake * nexthead;cantcrosswall();nexthead = (snake *) malloc( sizeof(snake) ); if ( status == U ){nexthead->x = head->x; nexthead->y = head->y - 1;nexthead->next = head;head = nexthead;q = head; if ( nexthead->x == food->x && nexthead->y == food->y ) {while ( q != NULL ){gotoxy( q->x, q->y );color( 14 );printf( "★" ); q = q->next; }score = score + add; speedup();createfood(); }else {while ( q->next->next != NULL ) {gotoxy( q->x, q->y );color( 14 );printf( "★" ); q = q->next; }gotoxy( q->next->x, q->next->y ); color( 3 );printf( "■" );free( q->next ); q->next = NULL; }}if ( status == D ){nexthead->x = head->x; nexthead->y = head->y + 1;nexthead->next = head;head = nexthead;q = head;if ( nexthead->x == food->x && nexthead->y == food->y ) {while ( q != NULL ){gotoxy( q->x, q->y );color( 14 );printf( "★" );q = q->next;}score = score + add;speedup();createfood();}else {while ( q->next->next != NULL ){gotoxy( q->x, q->y );color( 14 );printf( "★" );q = q->next;}gotoxy( q->next->x, q->next->y );color( 3 );printf( "■" );free( q->next );q->next = NULL;}}if ( status == L ){nexthead->x = head->x - 2; nexthead->y = head->y;nexthead->next = head;head = nexthead;q = head;if ( nexthead->x == food->x && nexthead->y == food->y ) {while ( q != NULL ){gotoxy( q->x, q->y );color( 14 );printf( "★" );q = q->next;}score = score + add;speedup();createfood();}else { while ( q->next->next != NULL ){gotoxy( q->x, q->y );color( 14 );printf( "★" );q = q->next;}gotoxy( q->next->x, q->next->y );color( 3 );printf( "■" );free( q->next );q->next = NULL;}}if ( status == R ){nexthead->x = head->x + 2; nexthead->y = head->y;nexthead->next = head;head = nexthead;q = head;if ( nexthead->x == food->x && nexthead->y == food->y ) {while ( q != NULL ){gotoxy( q->x, q->y );color( 14 );printf( "★" );q = q->next;}score = score + add;speedup();createfood();}else {while ( q->next->next != NULL ){gotoxy( q->x, q->y );color( 14 );printf( "★" );q = q->next;}gotoxy( q->next->x, q->next->y );color( 3 );printf( "■" );free( q->next );q->next = NULL;}}if ( biteself() == 1 ) {endgamestatus = 2;endgame();}
}void keyboardControl()
{status = R; while ( 1 ){scoreandtips();if ( GetAsyncKeyState( VK_UP ) && status != D ) {status = U; }else if ( GetAsyncKeyState( VK_DOWN ) && status != U ) {status = D;}else if ( GetAsyncKeyState( VK_LEFT ) && status != R ) {status = L;}else if ( GetAsyncKeyState( VK_RIGHT ) && status != L ) {status = R;}if ( GetAsyncKeyState( VK_SPACE ) ) {while ( 1 ){Sleep( 300 ); if ( GetAsyncKeyState( VK_SPACE ) ) {break;}}}else if ( GetAsyncKeyState( VK_ESCAPE ) ){endgamestatus = 3; break;}else if ( GetAsyncKeyState( VK_F1 ) ) {speedup();}else if ( GetAsyncKeyState( VK_F2 ) ) {speeddown();}Sleep( sleeptime );snakemove();}
}void explation()
{system( "cls" );color( 3 );gotoxy( 30, 8 );printf( "1. 不能穿墙,不能咬到自己" );color( 10 );gotoxy( 30, 11 );printf( "2. 用↑.↓.←.→分别控制蛇的移动" );color( 14 );gotoxy( 30, 14 );printf( "3. F1 为加速,F2 为减速" );color( 11 );gotoxy( 30, 17 );printf( "4. 按空格键暂停游戏,再按空格键继续" );color( 4 );gotoxy( 30, 20 );printf( "5. ESC :退出游戏.space:暂停游戏" );_getch(); system( "cls" );welcometogame();
}void endgame()
{system( "cls" );if ( endgamestatus == 1 ){gotoxy( 43, 9 );color( 12 );printf( "GAME OVER !" );}else if ( endgamestatus == 2 ){gotoxy( 43, 9 );color( 12 );printf( "GAME OVER !" );}else if ( endgamestatus == 3 ){gotoxy( 40, 9 );color( 12 );printf( "已结束游戏。" );}gotoxy( 43, 12 );color( 13 );printf( "你的得分是 %d", score );choose();
}void choose()
{int n;gotoxy( 25, 23 );color( 12 );printf( "Continue ------ 1" );gotoxy( 52, 23 );printf( "Exit ------ 2" );gotoxy( 45, 25 );color( 11 );printf( "选择: " );scanf( "%d", &n );switch ( n ){case 1:system( "cls" ); score = 0; sleeptime = 200; add = 10; welcometogame();break;case 2:exit( 0 ); break;default:gotoxy( 35, 27 );color( 12 );printf( " 输入有误 重新输入 !" );system( "pause >nul" );endgame();choose();break;}
}void Lostdraw()
{system( "cls" );int i;gotoxy( 45, 2 );color( 6 );printf( "\\\\\\|///" );gotoxy( 43, 3 );printf( "\\\\" );gotoxy( 47, 3 );color( 15 );printf( ".-.-" );gotoxy( 54, 3 );color( 6 );printf( "//" );gotoxy( 44, 4 );color( 14 );printf( "(" );gotoxy( 47, 4 );color( 15 );printf( ".@.@" );gotoxy( 54, 4 );color( 14 );printf( ")" );gotoxy( 17, 5 );color( 11 );printf( "+------------------------" );gotoxy( 35, 5 );color( 14 );printf( "oOOo" );gotoxy( 39, 5 );color( 11 );printf( "----------" );gotoxy( 48, 5 );color( 14 );printf( "(_)" );gotoxy( 51, 5 );color( 11 );printf( "----------" );gotoxy( 61, 5 );color( 14 );printf( "oOOo" );gotoxy( 65, 5 );color( 11 );printf( "-----------------+" );for ( i = 6; i <= 19; i++ ) {gotoxy( 17, i );printf( "|" );gotoxy( 82, i );printf( "|" );}gotoxy( 17, 20 );printf( "+---------------------------------" );gotoxy( 52, 20 );color( 14 );printf( "☆☆☆〃" );gotoxy( 60, 20 );color( 11 );printf( "----------------------+" );
}int main()
{system( "mode con cols=100 lines=30" ); welcometogame();keyboardControl();endgame();return(0);
}
总结
虽然,偶尔会是这样的……
小声BB:地狱级难度
程序展示
展示什么?自己试试不就行了?
不好用,你就过来砍……砍……砍CSDN博客!
我说的!
【从入门到入土系列】C语言制作小游戏-贪吃蛇:Copy+运行即可另附注释相关推荐
- c语言入门级小游戏 · 贪吃蛇 | 激发你的编程兴趣
目录 前言 拓展知识 介绍system("pause") First:制作可控移动的小蛇 Second:添加食物 Third:如何Game Over 完整代码 前言 声明:本游戏参 ...
- go语言编程小游戏--贪吃蛇
前提准备条件:安装gcc环境,可以百度也 可以安装这个链接:https://pan.baidu.com/s/1BbXFcBZywK-k-eIkWqY3Ug 提取码:04wp 复制这段内容后打开百度网盘 ...
- C语言实战小游戏:贪吃蛇大战
代码如下: #include<easyx.h> #include<stdio.h> #include<conio.h> // 需要使用_kbhit和_getch函数 ...
- c语言游戏代码(c语言制作小游戏)
用C语言编写的小游戏代码是什么? /*也不知道你是什么级别的,我是一个新手,刚接触编程语言,以下是我自己变得一个小程序,在所有c语言的编译器(vc++6.0.turbo----)上都能运行,你还可以进 ...
- C语言小游戏————贪吃蛇.c
1.主函数框架的搭建 int main (void) {starup();//数据初始化while(1){show();//打印画面updateWithoutInput();//与用户输入无关的更新u ...
- Python——制作小型游戏贪吃蛇
记得之前大二上过一门交叉学科,使用了python制作贪吃蛇小游戏(但是当时真的就是浪555大家大学的时候真的要好好学习呀),然后自己在b站学习网站跟着做了这个小游戏,整体还是很容易懂的,用pychar ...
- R语言|for循环————R语言入门到入土系列(八)
R语言入门到入土系列 R语言作为数据科学的第一利器:本人介绍了一些R语言的基础入门知识,希望能帮到大家,往期系列文章点击下面文字直达
- d3.js 制作简单的贪吃蛇
d3.js是一个不错的可视化框架,同时对于操作dom也是十分方便的.今天我们使用d3.js配合es6的类来制作一个童年小游戏–贪吃蛇.话不多说先上图片. 1. js snaker类 class Sna ...
- C语言趣味小游戏——三子棋
全篇无任何废话,本文的解释大多数都在代码段中,所以一定要看代码,边看边学边理解. 这只是初学者入门的一个小游戏,不难懂,没有什么复杂的内容 可以先学习一下比三子棋还简单的猜数字小游戏 C语言趣味小游戏 ...
最新文章
- 道路场景语义分割算法
- 华为机考HJ7取近似值
- centos访问mysql_MySql 安装和访问(基于CentOS)
- GitHub 报告显示香港码农大爆发,诚实的程序员:转行只因工资高!
- 2021年春季学期-信号与系统-第八次作业参考答案-第八小题
- java 创建日程到期提醒_苹果“快捷指令”日程播报完美版
- 动态规划之----最长公共子序列
- 40 | 案例篇:网络请求延迟变大了,我该怎么办?
- 比较交换/(选择)排序法和冒泡排序法(C语言)
- java构建二叉树_java实现二叉树的构建以及3种遍历方法
- The minimum required Cuda capability is 3.7.
- 06-列空间和零空间
- 初学者必学教程——JQuery的简介
- 用SYS本地登录或远程登录引起ORA-01031错误
- 9套Android实战经典项目
- 统计用区划代码和城乡划分代码编制规则
- JSESSIONID理解
- 成都拓嘉启远:拼多多下单后地址错误能改吗
- php输入框里的提示文字,input标签输入框带提示文字方法
- 成功解决ImportError: cannot import name ‘GloVe‘ from ‘torchtext.legacy.vocab‘
热门文章
- 服务器文件夹取消只读,服务器上的excle文件有人打开文件编辑后关闭文件,别人再去打开文件时“**”正在编辑,用只读方式打开!excel怎样解除只读...
- python龙虎榜数据_【爬虫】使用爬虫技术获取盘后龙虎榜
- [GWCTF 2019]pyre 1
- 安装dlib的一些坑
- 前苹果工程师吐槽:“Siri” 代码过时且复杂,不可能变得像 ChatGPT 一样强大...
- android提取pdf中文字,使用iTextG從Android上的pdf文件中提取文本
- 【信息学】【2018.02】噪声环境下基于时频域信号模型的语音去混响
- 微信小程序拨打客服电话
- php 上级控制下级权限,业务单据上下级权限控制实现
- 串口之OVERLAPPED结构体详解