先放效果

源代码

//2016-2-12
//zhaoyu
//Gmail:zhaoyu1995.com@gmail.com
//Language: C
//Platform:Code::Blocks
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <time.h> typedef struct snake
{
int x;
int y;
struct snake *next;
}Snake;
int X, Y;
enum STATUS{Up = 1, Down, Left, Right}; Snake *pHead, *pBody;//the head of the snake enum STATUS Direction;
int score=0, scorePerFood=10;
int gameStatus = 0;
int timeInterval = 200;
void gameEnd(void);
void setPosition(int x, int y)
{
COORD pos;
HANDLE hOutput;
pos.X = x;
pos.Y = y;
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOutput, pos);
}
void hideCursor()
{
CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void creatInterface(void)
{
int i;
for(i=0;i<58;i+=2)
{
setPosition(i,0);
printf("¡ö");//a ¡ö occupy two character space
setPosition(i,26);
printf("¡ö");
}
for(i=1;i<26;i++)
{
setPosition(0,i);
printf("¡ö");
setPosition(56,i);
printf("¡ö");
}
setPosition(65, 10);
printf("Introduction");
setPosition(63,12);
printf("¡ü\tMove up.");
setPosition(63,14);
printf("¡ý\tMove Down.");
setPosition(63,16);
printf("¡û\tMove left.");
setPosition(63,18);
printf("¡ú\tMove right.");
setPosition(63,20);
printf("F1\tSpeed up.");
setPosition(63, 22);
printf("F2\tSlow down.");
setPosition(63, 24);
printf("Space\tGame pause.");
setPosition(63,26);
printf("ESC\tQuit the game.");
setPosition(63, 4);
printf("Score:");
setPosition(63, 6);
printf("Score Per Food:");
}
void initializeSnake(void)
{
Snake *pTail;
int i;
pTail = (Snake *)malloc(sizeof(Snake));
pTail->x = 24;
pTail->y = 5;
pTail->next = NULL;
for (i = 1; i < 4; i++)
{
pHead = (Snake *)malloc(sizeof(Snake));
pHead->next = pTail;
pHead->x = 24 + 2*i;
pHead->y = 5;
pTail = pHead;//Important
}
while (pTail != NULL)
{
setPosition(pTail->x, pTail->y);
printf("¡ö");
pTail = pTail->next;
}
}
int biteSelf(void)
{
Snake *pSelf = pHead->next;
while (pSelf != NULL)
{
if (pHead->x==pSelf->x && pHead->y==pSelf->y)
{
return 1;
}
pSelf = pSelf->next;
}
return 0;
}
void creatFood(void)
{
int flag = 0;
X = Y = 4;
srand((unsigned)time(NULL));
do{
X = rand()%52 + 2;
Y = rand()%24 + 1; if (X%2 != 0)
{
flag = 1;
}
else
{
flag = 0;
}//Important
pBody = pHead;
while (pBody->next != NULL)
{
if(pBody->x==X && pBody->y==Y)
{
flag = 1;
}
pBody = pBody->next;
}
}while(flag==1);
setPosition(X, Y);
printf("¡ö");
} void hitWall(void)
{
if (pHead->x==0 || pHead->x>=56 || pHead->y==0 || pHead->y>=26)
{
gameStatus = 1;
gameEnd();
}
}
void snakeMove(void)
{
Snake *pNextHead;
hitWall(); pNextHead = (Snake *)malloc(sizeof(Snake));
pNextHead->next = pHead;
switch(Direction)
{
case Up:
pNextHead->x = pHead->x;
pNextHead->y = pHead->y - 1;
break;
case Down:
pNextHead->x = pHead->x;
pNextHead->y = pHead->y + 1;
break;
case Right:
pNextHead->x = pHead->x + 2;
pNextHead->y = pHead->y;
break;
case Left:
pNextHead->x = pHead->x - 2;
pNextHead->y = pHead->y;
break;
default:
break;
}
pHead = pNextHead;
pBody = pHead;
if (pNextHead->x == X && pNextHead->y == Y)
{
while (pBody != NULL)
{
setPosition(pBody->x, pBody->y);
printf("¡ö");
pBody = pBody->next;
}
score += scorePerFood;
creatFood();
}
else
{
setPosition(pBody->x, pBody->y);
printf("¡ö");
while (pBody->next->next != NULL)
{
pBody = pBody->next;
}
setPosition(pBody->next->x, pBody->next->y);
printf(" ");
free(pBody->next);
pBody->next = NULL;
}
if (biteSelf() == 1)
{
gameStatus = 2;
gameEnd();
}
}
void pause(void)
{
while(1)
{
Sleep(300);
if(GetAsyncKeyState(VK_SPACE))
{
break;
}
}
}
void gameCircle(void)
{
Direction = Right;
while (1)
{
setPosition(72, 4);
printf("%d", score);
setPosition(80, 6);
printf("%d ", scorePerFood);//Attention space is needed
if (GetAsyncKeyState(VK_UP) && Direction!=Down)
{
Direction = Up;
}
else if (GetAsyncKeyState(VK_DOWN) && Direction!=Up)
{
Direction = Down;
}
else if (GetAsyncKeyState(VK_LEFT) && Direction!=Right)
{
Direction = Left;
}
else if (GetAsyncKeyState(VK_RIGHT) && Direction!=Left)
{
Direction = Right;
}
else if (GetAsyncKeyState(VK_SPACE))
{
pause();
}
else if (GetAsyncKeyState(VK_ESCAPE))
{
gameStatus = 3;
break;
}
else if (GetAsyncKeyState(VK_F1))
{
if(timeInterval >= 70)
{
timeInterval -= 60;
}
}
else if (GetAsyncKeyState(VK_F2))
{
if (timeInterval <= 400)
{
timeInterval += 60;
} }
switch (timeInterval)
{
case 20: scorePerFood = 20;break;
case 80: scorePerFood = 15;break;
case 140: scorePerFood = 12;break;
case 200: scorePerFood = 10;break;
case 260: scorePerFood = 8;break;
case 320: scorePerFood = 6;break;
case 380: scorePerFood = 4;break;
case 440: scorePerFood = 2;break;
default: scorePerFood = 0;break;
}
Sleep(timeInterval);
snakeMove();
}
}
void welcomePage(void)
{
setPosition(35,2);
printf("Welcome to Snake");
setPosition(15, 5);
printf("Rules:");
setPosition(15, 7);
printf("1. Use ¡ü.¡ý.¡û.¡ú to control the movement of the Snake.");
setPosition(15, 9);
printf("2. Biting the snake itself is forbidden.");
setPosition(15, 11);
printf("3. Hit the wall is forbidden.");
setPosition(15, 13);
printf("Developeder: zhaoyu.");
setPosition(15, 15);
printf("Blog: http://blog.csdn.net/sinat_30046339");
setPosition(28, 23);
printf("Press any key to continue...");
setPosition(0, 28);
getchar();
system("cls");
}
void gameEnd(void)
{
system("cls");
setPosition(32, 10);
switch(gameStatus)
{
case 1:
printf("You hit the wall!");
break;
case 2:
printf("You bit yourself!");
break;
case 3:
printf("You chose to end the game.");
break;
default:
break;
}
setPosition(32, 14);
printf("Your final score is %d", score);
getchar();
setPosition(0, 25);
exit(0);
}
void gameStart(void)
{
system("mode con cols=100 lines=30");//no space around equal sign
welcomePage();
creatInterface();
initializeSnake();
creatFood();
} //Main Function
int main(void)
{
hideCursor();
gameStart();
gameCircle();
gameEnd();
return 0;
}

  

C语言实现贪吃蛇源码的更多相关文章

  1. Winfrom 极简版贪吃蛇源码

    该源码是我在百度知识库借助前辈的的经验,加上自己的一点小改动写的一个非常简陋的贪吃蛇小程序.如果你们有更好的改动方案,欢迎评论. 进入主题吧! 1.创建一个桌面应运程序,拖一个定时器控件.这样,程序界 ...

  2. c# 贪吃蛇源码

    using UnityEngine; using System.Collections;using System.Diagnostics;using UnityEngine.SceneManageme ...

  3. H5 贪吃蛇源码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. js贪吃蛇源码

    1.注意,自己引入jquery,这个demo基于jquery的,我的jquery是写的本地的 2.没有写注释,看不懂的再问我吧, <!DOCTYPE html><html> & ...

  5. 使用strace查看C语言级别的php源码

    XCACHE XCache 是一个开源的 opcode 缓存器/优化器, 这意味着他能够提高您服务器上的 PHP 性能. 他通过把编译 PHP 后的数据缓冲到共享内存从而避免重复的编译过程, 能够直接 ...

  6. c语言版贪吃蛇小游戏

    编译环境:windows 7 64位 编译工具:codeblocks 13.12 备注:未使用graphics.h 声明:个人原创,未经允许,禁止转载!!! 数据结构:双向链表 1.程序未使用grap ...

  7. C语言实现贪吃蛇

    日期:2018.9.11 用时:150min 项目:贪吃蛇(C语言--数组   结构体实现) 开发工具:vs2013 关键知识:数组,结构体,图形库,键位操作 源代码: #include<std ...

  8. 小迪安全 Web安全 基础入门 第六天 - 信息打点-Web架构篇&域名&语言&中间件&数据库&系统&源码获取

    一 . Web架构 语言.常用的Web开发语言有PHP,Java,Python,JavaScript,.net等.具体可参考w3school的介绍. 中间件. (1)常见的Web服务器中间件:IIS. ...

  9. C语言之贪吃蛇

    利用链表的贪吃蛇,感觉自己写的时候还是有很多东西不熟悉, 1.预编译 2.很多关于系统的头文件也不是很熟悉 3.关于内存 第一个是.h头文件 #ifndef _SNAKE_H_H_H #define ...

随机推荐

  1. [转] EJB 3和Spring技术体系比较

    最近在学习EJB 3,对于SSH与EJB3,一直不太明白“即生瑜,何生亮?”,今天无意看到一篇旧文,比较系统的对比了这二种技术架构,转载于此: 原文出处:http://www.51cto.com/sp ...

  2. 关于闭包的理解(JS学习小结)

    前言: 啊啊啊,看书真的很痛苦啊,还是好想做项目写代码才有意思,不过我现在缺的确是将知识体系化,所以不论看书多么痛苦都一定要坚持坚持啊,这才是我现在最需要的进步的地方,加油! 因为现在期末啦,下周一也 ...

  3. 学习SQLite之路(五) C/C++ SQLite开发实例

    介绍一种乌班图中使用sqlite的用法,非常简单,下面的例子是在乌班图12.04中实现的: 1,先安装两个东西: sudo apt-get install sqlite sqlite3 sudo ap ...

  4. Angular指令1

    Angular的指令 也就是directive,其实就是一WebComponent,以前端的眼光来看,好象很复杂,但是以后端的眼光来看,还是非常简单的.其实就是一个中等水平的类. var myModu ...

  5. SDRAM读写一字(下)

    SDRAM读写一字 SDRAM控制模块 上电后进行初始化状态,初始化完成后进入空闲状态,在此进行判断如下判断: 如果自刷新时间到,则进行自刷新操作,操作完成后重新进入空闲状态: 如果读使能有效则进行读 ...

  6. 最短判断IE的办法

    if(!!-[1,]){ return }; 无意中看到这样一行代码,经查是用来判断IE的代码,非常精简,原理如下: [1,],这是一个数组,IE和标准浏览器对这样一个数组的解析是不一样的 alert ...

  7. iOS 'The sandbox is not sync with the Podfile.lock'问题解决

    问题描述: github下载的Demo,很多时候使用到CocoaPods,有的时候因为依赖关系或者版本问题不能编译运行.出现例如The sandbox is not sync with the Pod ...

  8. JNI系列——常见错误

    1.本地方法没有找到 原因一:在Java代码中没有加载对应的类 原因二:在.c文件中将本地的方法名转换错误 2.本地库返回为空 原因一:加载的库名称错误 原因二:生成的库与部署设备平台错误

  9. iOS开发--换肤简单实现以及工具类的抽取

    一.根据美工提供的图片,可以有两种换肤的方案. <1>美工提供图片的类型一: <2>美工提供图片的类型二:这种分了文件夹文件名都一样的情况,拖入项目后最后用真实文件夹(蓝色文件 ...

  10. 【CodeVS 2822】爱在心中

    “每个人都拥有一个梦,即使彼此不相同,能够与你分享,无论失败成功都会感动.爱因为在心中,平凡而不平庸,世界就像迷宫,却又让我们此刻相逢Our Home.” 在爱的国度里有N个人,在他们的心中都有着一个 ...