实例介绍
【实例简介】C 经典贪吃蛇小游戏【有源代码】
彩色界面,无需图形库!
【实例截图】
等。。。【许多情况】
【核心代码】
int main()
{
int olddirection='w'; //初始键盘信号
int newdirection =0;//获取键盘信号
init();//初始化
setmouth(60, 0);
setcolour(0xF0);
printf("\n得分:");
printf("%d\n", snacklength - 3);
printf("请切换为英文输入法\n");
printf("W A S D键分别表示:上 左 下 右\n");
while (1) {
if (_kbhit()) { //检测缓冲区中是否有数据
newdirection = tolower(_getch()); //将缓冲区中的数据以字符的形式读出
if (newdirection == 27) {
break;
}
else {
//获取小蛇新的移动方向
newdirection=movedire(olddirection, newdirection);
if (newdirection != olddirection)
{
olddirection = newdirection;
}
}
}
screenRefresh(newdirection);
}
return 0;
}
//更新得分
void updategoal()
{
setcolour(0xF0);
setmouth(60, 0);
printf("\n得分:%d", snacklength - 3);
if(snacklength==33)
{
MessageBox(NULL,"恭喜你,成功得到“探花”称号","恭喜你,成功得到“探花”称号",MB_OK);
}
if(snacklength==53)
{
MessageBox(NULL,"恭喜你,成功得到“榜眼”称号","恭喜你,成功得到“榜眼”称号",MB_OK);
}
if(snacklength==103)
{
MessageBox(NULL,"恭喜你,成功得到“状元”称号","恭喜你,成功得到“状元”称号",MB_OK);
}
if(snacklength==153)
{
MessageBox(NULL,"恭喜你,欢迎再来游玩","恭喜你,欢迎再来游玩",MB_OK);
exit(0);
}
}
//碰撞检测
int checksnack(int newdirection)
{
switch (newdirection)
{
case 'w':
if ((show[SnackSite[snackhead].x - 1][SnackSite[snackhead].y].kind)==1)
{
snackdie();
return 0;
}else if((show[SnackSite[snackhead].x - 1][SnackSite[snackhead].y].kind) == 4)
{
snackdie();
return 0;
}
else if ((show[SnackSite[snackhead].x - 1][SnackSite[snackhead].y].kind) == 3)
{
return 1;
}
else {
return 2;
}
break;
case 's':
if ((show[SnackSite[snackhead].x 1][SnackSite[snackhead].y].kind) == 1)
{
snackdie();
return 0;
}
else if ((show[SnackSite[snackhead].x 1][SnackSite[snackhead].y].kind) == 4)
{
snackdie();
return 0;
}
else if ((show[SnackSite[snackhead].x 1][SnackSite[snackhead].y].kind) == 3)
{
return 1;
}
else {
return 2;
}
break;
case 'a':
if ((show[SnackSite[snackhead].x][SnackSite[snackhead].y-1].kind) == 1)
{
snackdie();
return 0;
}
else if ((show[SnackSite[snackhead].x][SnackSite[snackhead].y-1].kind) == 4)
{
snackdie();
return 0;
}
else if ((show[SnackSite[snackhead].x][SnackSite[snackhead].y-1].kind) == 3)
{
return 1;
}
else {
return 2;
}
break;
case 'd':
if ((show[SnackSite[snackhead].x][SnackSite[snackhead].y 1].kind) == 1)
{
snackdie();
return 0;
}
else if ((show[SnackSite[snackhead].x][SnackSite[snackhead].y 1].kind) == 4)
{
snackdie();
return 0;
}
else if ((show[SnackSite[snackhead].x][SnackSite[snackhead].y 1].kind) == 3)
{
return 1;
}
else {
return 2;
}
break;
}
}
//创建新食物
void newfood()
{
srand((unsigned)time(NULL));
FoodSite.x = rand() % 38 1;
FoodSite.y = rand() % 38 1;
}
//刷新屏幕
void screenRefresh(int newdirection)
{
int re = 0;
int i = 0;
re = checksnack(newdirection);
snackmove(newdirection, re);
background();
show[FoodSite.x][FoodSite.y] = food;
for (i = 0; i <= snackhead; i )
{
if (i == snackhead) {
show[SnackSite[i].x][SnackSite[i].y] = snack;
show[SnackSite[i].x][SnackSite[i].y].colour = 0x75;
}
else {
show[SnackSite[i].x][SnackSite[i].y] = snack;
}
}
showing();
if (re == 1)
{
snacklength ;
updategoal();
newfood();
}
}
/*********************************************
获取最新的方向
**********************************************/
int movedire(int olddirection, int newdirection)
{
if (newdirection == 'w' || newdirection == 'a' || newdirection == 's' || newdirection == 'd')
{
return newdirection;
}
else {
return olddirection;
}
}
/**********************************
展示最新的show
*********************************/
void showing()
{
int line, lie;
for (line = 0; line < MaxLine; line )
{
for (lie = 0; lie < MaxLie; lie )
{
setmouth(line, lie);
setcolour(show[line][lie].colour);
printf("%s",show[line][lie].display);
}
}
}
/******************************************
小蛇死亡
*******************************************/
void snackdie()
{
setmouth(20, 5);
printf("Game over! 按任意键重新开始游戏!");
getch();
system("cls");
int olddirection='w'; //初始键盘信号
int newdirection =0;//获取键盘信号
init();//初始化
setmouth(60, 0);
setcolour(0xF0);
printf("\n得分:");
printf("%d\n", snacklength - 3);
printf("请切换为英文输入法\n");
printf("W A S D键分别表示:上 左 下 右\n");
while (1) {
if (_kbhit()) { //检测缓冲区中是否有数据
newdirection = tolower(_getch()); //将缓冲区中的数据以字符的形式读出
if (newdirection == 27) {
break;
}
else {
//获取小蛇新的移动方向
newdirection=movedire(olddirection, newdirection);
if (newdirection != olddirection)
{
olddirection = newdirection;
}
}
}
screenRefresh(newdirection);
}
}
//小蛇移动
void snackmove(int newdirection,int re)
{
int i = 0;
switch (newdirection)
{
case 'w':
for (i = 0; i < snackhead;i =1) {
SnackSite[i].x = SnackSite[i 1].x;
SnackSite[i].y = SnackSite[i 1].y;
}
SnackSite[snackhead].x -= 1;
if (re == 1)
{
snackhead = 1;
SnackSite[snackhead].x = SnackSite[snackhead-1].x-1;
SnackSite[snackhead].y = SnackSite[snackhead - 1].y;
}
break;
case 's':
for (i = 0; i < snackhead; i =1) {
SnackSite[i].x = SnackSite[i 1].x;
SnackSite[i].y = SnackSite[i 1].y;
}
SnackSite[snackhead].x = 1;
if (re == 1)
{
snackhead = 1;
SnackSite[snackhead].x = SnackSite[snackhead - 1].x 1;
SnackSite[snackhead].y = SnackSite[snackhead - 1].y;
}
break;
case 'a':
for (i = 0; i < snackhead; i =1) {
SnackSite[i].x = SnackSite[i 1].x;
SnackSite[i].y = SnackSite[i 1].y;
}
SnackSite[snackhead].y -= 1;
if (re == 1)
{
snackhead = 1;
SnackSite[snackhead].x = SnackSite[snackhead - 1].x ;
SnackSite[snackhead].y = SnackSite[snackhead - 1].y-1;
}
break;
case 'd':
for (i = 0; i < snackhead; i =1) {
SnackSite[i].x = SnackSite[i 1].x;
SnackSite[i].y = SnackSite[i 1].y;
}
SnackSite[snackhead].y = 1;
if (re == 1)
{
snackhead = 1;
SnackSite[snackhead].x = SnackSite[snackhead - 1].x;
SnackSite[snackhead].y = SnackSite[snackhead - 1].y 1;
}
break;
}
}
//初始食物
void startfood()
{
FoodSite.x = 5;
FoodSite.y = 10;
show[5][10] = food;
}
//初始小蛇
void startsnack()
{
SnackSite[0].x = 35;
SnackSite[0].y = 13;
SnackSite[1].x = 35;
SnackSite[1].y = 12;
SnackSite[2].x = 35;
SnackSite[2].y = 11;
show[35][11] = snack;
show[35][11].colour = 0x75;
show[35][12] = snack;
show[35][13] = snack;
}
/*******************************
初始化生成show结构体数组
*******************************/
void init()
{
//设置窗口大小
system("mode con:cols=80 lines=43");
//隐藏光标
hidemouth();
//生成背景图
background();
//创建初始食物
startfood();
//创建初始小蛇蛇体
startsnack();
//显示
showing();
}
/**************************************
生成背景图
**************************************/
void background()
{
int line, lie;
for (line = 0; line < MaxLine; line )
{
for (lie = 0; lie < MaxLie; lie )
{
setmouth(line, lie);
if (lie == 0 || lie == MaxLie-1 || line == 0 || line == MaxLine-1) {
show[line][lie] = wall;
}
else {
show[line][lie] = livearea;
}
}
}
}
/********************************
定义光标位置
*********************************/
void setmouth(int x, int y)
{
COORD coord;
coord.X = y*2; //第3列
coord.Y = x; //第3行
//获取控制台缓冲区句柄
HANDLE ConsoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
//设置光标位置
SetConsoleCursorPosition(ConsoleHandle, coord);
}
//设置种类的颜色
void setcolour(int a)
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, a);
}
//隐藏光标
void hidemouth()
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(handle, &CursorInfo);//获取控制台光标信息
CursorInfo.bVisible = 0; //隐藏控制台光标
SetConsoleCursorInfo(handle, &CursorInfo);//设置控制台光标状态
}
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论