C语言-简单可用的贪吃蛇游戏

C语言-简单可用的贪吃蛇游戏
C语言-简单可用的贪吃蛇游戏

// 作者:莫智豪

// 名称:贪吃蛇游戏

// 绝对绚丽、可用的贪吃蛇游戏,欢迎参考和指点

#include

#include

#include

#include

#define UP 1

#define DOWN 2

#define LEFT 3

#define RIGHT 4

//格子类

class Cell

{

private:

short m_x;

short m_y;

short m_full; //0为空,1为阻挡,2为食物

COLORREF m_color; //格子的颜色

public:

friend class GameArea;

void setxy(short x,short y)

{

m_x=x; m_y=y;

}

void setfull(short full)

{

m_full=full;

}

void display(COLORREF color)

{

m_color=color;

setfillstyle(m_color);

bar(m_x,m_y,m_x+7,m_y+7);

}

void laserDisplay() //显示镭射状态的格子

{

IMAGE image(10,10);

SetWorkingImage(&image);

DWORD* pMem=GetImageBuffer(&image);

for(int i=0;i<10*10;i++)

pMem[i]=BGR(RGB(0,0,i*156/(10*10)));

SetWorkingImage(NULL);

putimage(m_x,m_y,&image);

}

short ReturnFull() //返回格子状态

{

return m_full;

}

Cell()

{

m_x=0,m_y=0,m_full=0;

m_color=BLACK;

}

};

//游戏区类

class GameArea

{

private:

int m_random1,m_random2;

public:

Cell m_game[60][60];

friend void MessageDispose();

bool CreatFood() //随机产生食物

{

srand(time(NULL));

m_random1=rand()%58+1;

m_random2=rand()%58+1;

if(m_game[m_random1][m_random2].m_full==0) //检查生成的食物坐标是否在障碍上

{

m_game[m_random1][m_random2].display(GREEN);

m_game[m_random1][m_random2].m_full=2;

return true;

}

//如果随机的食物正好出现在蛇身上,则进入下面的循环寻找可以生成食物的地方

for(m_random1=1;m_random1<59;m_random1++)

{

for(m_random2=1;m_random2<59;m_random2++)

{

if(m_game[m_random2][m_random2].m_full==0)

{

m_game[m_random1][m_random2].m_full=2;

}

}

}

//如果没有找到可以生成食物的地方,则通关

return false;

}

void DelFood() //删除食物

{

m_game[m_random1][m_random2].m_full=0;

}

void ChangeColor(int flag1,int flag2,COLORREF color)//设置指定格子的颜色{

m_game[flag1][flag2].display(color);

}

void Init()

{

int flag1,flag2;

BeginBatchDraw();

setfillstyle(BLACK);

bar(0,0,600,600);

for(flag1=0;flag1<60;flag1++)

{

for(flag2=0;flag2<60;flag2++)

{

if(flag1==0||flag1==59||flag2==0||flag2==59)

{

m_game[flag1][flag2].setfull(1);

m_game[flag1][flag2].setxy(flag1*10,flag2*10);

m_game[flag1][flag2].display(WHITE);

}

else

{

m_game[flag1][flag2].setfull(0);

m_game[flag1][flag2].setxy(flag1*10,flag2*10);

m_game[flag1][flag2].display(BLACK);

}

}

}

CreatFood();

EndBatchDraw();

}

};

//蛇类,定义蛇的结构和行为

class Snake

{

private:

struct node //蛇身链表

{

int m_x,m_y;

struct node *next; //下一结点

struct node *prior; //上一结点

};

struct node *head;

struct node *last;

struct node *now;

public:

int toward; //蛇头朝向

friend void MessageDispose();

friend int HitDetect();

friend void ReInit();

Snake()

{

head = NULL;

last = NULL;

now = NULL;

}

void Init() //初始化蛇的结构

{

if(head!=NULL) //重玩游戏时,释放原先的链表所有结点

{

for(now = head->next;now->next != NULL;now = now->next)

{

free(now->prior);

}

}

head = (struct node*)malloc(sizeof(struct node)); //为蛇头分配内存

head->prior = NULL;

head->m_x = 300;

head->m_y = 300;

now = (struct node*)malloc(sizeof(struct node));

head->next = now;

now->prior = head;

now->next = NULL;

now->m_x = 300;

now->m_y = 290;

last = now;

toward = DOWN;

}

void SnakeAdd()

{

now=head;

now->prior=(struct node*)malloc(sizeof(struct node));

now=now->prior;

now->prior=NULL;

now->next=head;

switch(toward)

{

case UP:

now->m_x=head->m_x;

now->m_y=head->m_y-10;

break;

case DOWN:

now->m_x = head->m_x;

now->m_y = head->m_y + 10;

break;

case LEFT:

now->m_x = head->m_x - 10;

now->m_y = head->m_y;

break;

case RIGHT:

now->m_x = head->m_x + 10;

now->m_y = head->m_y;

break;

}

head=now; //设置当前结点为蛇头

}

void SnakeDel() //释放蛇尾结点(删除蛇尾)

{

last=last->prior;

free(last->next);

last->next=NULL;

}

void SnakeMove()

{

SnakeAdd(); //增加蛇头

SnakeDel(); //删除蛇尾

}

};

//游戏类,用来初始化游戏的参数,及实现其他游戏操作class Game

{

public:

int d;

Game()

{

d=1;

}

friend void MessageDispose();

void Init()

{

closegraph();

initgraph(800,600);

setbkmode(TRANSPARENT); //使用透明的输出背景

LOGFONT f;

getfont(&f);

f.lfHeight=50;

_tcscpy(f.lfFaceName,_T("黑体"));

f.lfQuality=ANTIALIASED_QUALITY;

setfont(&f);

}

void FailGame() //游戏失败显示的画面

{

setcolor(RED);

setfont(70,0,_T("微软雅黑"));

outtextxy(150,265,_T("游戏失败"));

setcolor(WHITE);

setfont(40,0,_T("微软雅黑"));

outtextxy(160,365,_T("退出按'O',重玩按'R'"));

}

void WinGame() //游戏胜利时显示的画面

{

setcolor(RED);

setfont(70, 0, _T("微软雅黑"));

outtextxy(150, 265, _T("胜利!"));

FlushBatchDraw();

Sleep(10000);

exit(0);

}

void ExitGame() //游戏中途退出

{

BeginBatchDraw();

if(d==1)

{

setfont(25,0,_T("微软雅黑"));

setfillstyle(BLACK);

bar(15,200,500,450);

setcolor(RED);

setfont(45, 0, _T("微软雅黑"));

outtextxy(130, 220, _T(" EXIT THE GAME?"));

setfont(40, 0, _T("微软雅黑"));

outtextxy(150, 300,_T("YES(Y) or NO(N)"));

}

else if(d==2)

{

setfont(25,0,_T("微软雅黑"));

setfillstyle(BLACK);

bar(15,200,500,450);

setcolor(BLACK);

setfont(45, 0, _T("微软雅黑"));

outtextxy(130, 220, _T("EXIT THE GAME?"));

setfont(40, 0, _T("微软雅黑"));

outtextxy(150, 300,_T("YES(Y) or NO(N)"));

}

EndBatchDraw();

}

};

////////////////////////////////////////////

//管理区类,定义管理区域的相关操作

////////////////////////////////////////////

class ManageArea

{

private:

double m_time;

short m_score;

short m_leave;

bool m_pause;

TCHAR m_str_leave[2], m_str_time[33], m_str_score[5];

COLORREF m_bgcolor;

void DisplayTime() //显示当前耗时

{

BeginBatchDraw();

_stprintf(m_str_time, _T("%.1lf"), m_time);

setfont(25, 0, _T("微软雅黑")); //设置字体(nHeight 指定高度nWidth 字符的平均宽度(0为自适应)lpszFace 字体名称)

setfillstyle(m_bgcolor);

bar(680,430,800,455); //bar(int left,int top,int right,int bottom) 是画二维条形图的函数

setcolor(RED);

outtextxy(680,430,m_str_time);

EndBatchDraw();

}

void DisplayScore() //显示当前分数

{

BeginBatchDraw();

_stprintf(m_str_score, _T("%d"), m_score);

setfont(25, 0, _T("微软雅黑"));

setfillstyle(m_bgcolor);

bar(680,460,800,485);

setcolor(RED);

outtextxy(680,460,m_str_score);

EndBatchDraw();

}

public:

friend void MessageDispose();

void TimeAdd(double add) //增加时间(可在类外直接调用实现动态刷新时间)

{

m_time += add;

DisplayTime();

}

void ScoreAdd(short add) //增加分数(可在类外直接调用实现动态刷新分数)

{

m_score += add;

DisplayScore();

}

void DisplayPause() //显示暂停或者开始

{

BeginBatchDraw();

_stprintf(m_str_score, _T("%d"), m_score);

//setfont(25, 0, _T("微软雅黑"));

setfillstyle(m_bgcolor);

bar(625,200,800,300);

setcolor(RGB(12,45,19));

setfont(40,0,_T("微软雅黑"));

if(!m_pause)

outtextxy(630, 250, _T("进行中..."));

else

{

setcolor(RED);

outtextxy(630, 250, _T("暂停"));

}

EndBatchDraw();

}

void Init() //初始化管理界面

{

m_time = 0.0;

m_score = 0;

m_leave = 1;

m_pause = false;

_stprintf(m_str_score, _T("%d"), m_score); //格式化转换类型,将m_score输出到m_str_score

_stprintf(m_str_time, _T("%.1lf"), m_time);

m_bgcolor = BLACK;

BeginBatchDraw();

setfillstyle(BLACK);

bar(601,0,800,600);

setfont(40, 0, _T("微软雅黑"));

setcolor(YELLOW);

outtextxy(625, 30, _T("贪吃蛇"));

setfont(20, 0, _T("微软雅黑"));

setcolor(YELLOW);

setfillstyle(BLUE);

fillcircle(640,140,25);

outtextxy(670, 140, _T("制作:软五莫智豪"));

setfont(25, 0, _T("微软雅黑"));

setcolor(WHITE);

outtextxy(625, 340, _T("退出(O键)"));

setfont(25, 0, _T("微软雅黑"));

setcolor(WHITE);

line(620,330,780,330);

line(620,490,780,490);

outtextxy(625, 430, _T("时间:"));

outtextxy(625, 460, _T("分数:"));

outtextxy(625, 400, _T("暂停/开始(P键)"));

outtextxy(625, 370, _T("重新游戏(R键)"));

setcolor(RED);

outtextxy(720, 400, m_str_leave);

outtextxy(680, 460, m_str_score);

outtextxy(680, 430, m_str_time);

EndBatchDraw();

DisplayPause();

}

};

////////////////////////////////////////////

//声明游戏需要的类

////////////////////////////////////////////

Game game; //用于初始化游戏、设置游戏相关参数

GameArea a; //用于初始化游戏区域,设置,改变游戏区域相关参数ManageArea manager; //用于初始化管理区域,设置管理区相关参数

Snake s; //用于初始化蛇,数据化蛇,操作蛇

////////////////////////////////////////////

//游戏的消息控制,流程控制函数

////////////////////////////////////////////

void MessageDispose() //消息处理函数

{

char c;

//---------------------------

char t=' ';

int d=0; //我添加的

int f=0;

//---------------------------

s.now = NULL;

bool Keepdown = false;

while(true)

{

Keepdown = false; //是否持续按W A S D 中的一个按键

if(kbhit())

{

switch(c = getch()) //处理按键消息(W A S D)

{

case 'o':

case 'O':

{

f=1;

break;

}

case 'w':

case 'W':

if(s.toward == UP)Keepdown = true;

else if(s.toward != DOWN&&s.toward != UP)s.toward = UP;

break;

case 's':

case 'S':

if(s.toward == DOWN)Keepdown = true;

else if(s.toward != UP&&s.toward != DOWN)s.toward = DOWN;

break;

case 'a':

case 'A':

if(s.toward == LEFT)Keepdown = true;

else if(s.toward != RIGHT&&s.toward != LEFT)s.toward = LEFT;

break;

case 'd':

case 'D':

if(s.toward == RIGHT)Keepdown = true;

else if(s.toward != LEFT&&s.toward != RIGHT)s.toward = RIGHT;

break;

case 'p':

case 'P':

manager.m_pause = !manager.m_pause; //设置暂停或开始

manager.DisplayPause(); //显示暂停或开始

break;

case 'r':

case 'R':

ReInit();

break;

}

}

//----------------------------------------------------------------

if(f==1)

{

game.d=1;

f=0;

game.ExitGame();

while((t!='y')&&(t!='Y')&&(t!='n')&&('N'))

{

t=getch();

}

if((t=='y')||(t=='Y'))

{

t=' ';

break;

}

else if((t=='n')||(t=='N'))

{

game.d=2;

game.ExitGame();

t=' ';

}

}

//----------------------------------------------------------------

if(true == manager.m_pause) //如果暂停重新开始,直接进行下次循环

{

continue;

}

BeginBatchDraw();

switch(a.m_game[s.head->m_x/10][s.head->m_y/10].ReturnFull()) //检测蛇头遇到的情况

{

case 2: //遇到食物,蛇身加长

a.ChangeColor(s.head->m_x/10,s.head->m_y/10,BLUE);

s.SnakeAdd(); //蛇增长

a.ChangeColor(s.head->m_x/10,s.head->m_y/10,BLUE);

a.DelFood(); //删除食物

if(a.CreatFood() == false) //创建新食物,并检查是否通关

{

game.WinGame(); //游戏通关(当地图没地方创建食物时)}

manager.ScoreAdd(1); //加一分

break;

case 0:

a.m_game[https://www.360docs.net/doc/eb4392596.html,st->m_x/10][https://www.360docs.net/doc/eb4392596.html,st->m_y/10].setfull(0); //设置蛇尾经过处无障碍

a.ChangeColor(https://www.360docs.net/doc/eb4392596.html,st->m_x/10,https://www.360docs.net/doc/eb4392596.html,st->m_y/10,BLACK);

s.SnakeMove(); //蛇移动一次

a.ChangeColor(s.head->m_x/10,s.head->m_y/10,BLUE);

a.m_game[s.head->next->m_x/10][s.head->next->m_y/10].setfull(1); //设置蛇头经过处有障碍

break;

case 1: //遇到障碍物

game.FailGame();

a.ChangeColor(s.head->m_x/10,s.head->m_y/10,RGB(255,127,39));

FlushBatchDraw();

{

char c = ' ';

while(c != 'r' && c != 'R') //当游戏失败时,按R键可重新进行游戏

{

if(kbhit())

{

c = getch();

if(c=='o'||c=='O')

{

d=1;

break;

}

}

Sleep(10);

}

}

if(d==1) //*****************

{break;}

ReInit(); //重新开始游戏

break;

}

if(d==1) //*****************

{break;}

EndBatchDraw();

if(Keepdown==false)

{

Sleep(150);

manager.TimeAdd(0.1); //增加时间

}

else //当持续按下按方向键时

{

Sleep(40); //适当休眠可以增加游戏流畅性

manager.TimeAdd(0.04); //增加时间

}

}

}

////////////////////////////////////////////

//游戏初始化函数

////////////////////////////////////////////

void ReInit()

{

a.Init(); //初始化游戏区

s.Init(); //初始化蛇

manager.Init(); //初始化管理区

//绘制蛇的开始状态

s.now = s.head;

a.ChangeColor(s.now->m_x/10,s.now->m_y/10,BLUE);

s.now = https://www.360docs.net/doc/eb4392596.html,st;

a.ChangeColor(s.now->m_x/10,s.now->m_y/10,BLUE); }

////////////////////////////////////////////

//main函数,程序入口

////////////////////////////////////////////

int main(void)

{

game.Init(); //初始化游戏参数、设置

ReInit(); //初始化其他

MessageDispose(); //消息处理函数

return 0;

}

c语言课程设计贪吃蛇设计

. 《C语言程序设计》课程设计 题目:贪吃蛇游戏设计 学院:信息学院 专业:网络工程 姓名:李益双 学号:1101010121 班级:信息A1111班 指导教师:罗成 职称:讲师 完成日期:2012年6月

目录 1、前言 (3) 2、摘要 (4) 3、项目背景 (5) 4、需求分析 (6) 5、概要设计 (7) 6、详细设计与测试 (8) 601 定义蛇身的数据结构 (8) 602算法设计与程序流程图 (8) 602.1贪吃蛇算法设计 (8) 602.2程序流程图 (9) 603光标移动的设计与实现 (10) 603.1显示水平围墙的实现 (10) 603.2显示分数的实现 (11) 603.3接受玩家按键信息的实现 (11) 603.4游戏结束时显示信息的实现 (11) 604 贪吃蛇游戏主干的设计 (12) 604.1游戏的初始化与加载的实现 (12) 604.2食物随机产生的实现 (13) 604.3蛇身的增长设计 (14) 604.4蛇身的显示与移动的设计实现 (15)

604.5蛇的头部与物体碰撞的而设计实现 (16) 7、编码 (17) 8、结论 (18) 9、参考文献 (19) 10、致谢 (19) 前言 C语言,是一种通用的、过程式的编程语言,广泛用于系统与应用软件的开发。具有高效、灵活、功能丰富、表达力强和较高的移植性等特点,在程序员中备受青睐。 C语言是由UNIX的研制者丹尼斯·里奇(Dennis Ritchie)于1970年由肯·汤普逊(Ken Thompson)所研制出的B语言的基础上发展和完善起来的。目前,C语言编译器普遍存在于各种不同的操作系统中,例如UNIX、MS-DOS、Micro soft Windows及Linux等。C语言的设计影响了许多后来的编程语言,例如C+ +、Objective-C、Java、C#等。 1980年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局(American National Standard Institution)为C语言订定了一套完整的国际标准语法,称为ANSI C,作为C语言的标准。1980年代至今的有关程式开发工具,一般都支持符合ANSI C的语法。

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

#include #include #include #include #include //蛇头移动方向 #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)//同理,提取出y HANDLE Console;

void Position(int x, int y); //移动光标到(x,y)//Windows.h void 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; //食物

C语言课程设计报告——贪吃蛇源程序

C 语言课程设计(小游戏贪吃蛇的程序设计报告) 设计人: 班级: 201 年月号

目录一:概述 1:研究背景及意义 2:设计的任务与需要知识点3:具体完成设计内容 二:需求分析 1:功能需求 2:操作方法 三:总体设计 1:模块划分 2:数据结构设计 四:详细设计 1:主空摸块设计 2:绘制游戏界面 3:游戏的具体过程 4:游戏的结束处理 5:显示排行榜信息模块 五:程序的调试与测试1:动画与音乐同步 2:蛇的运行 3:终止程序 六:结论 七::结束语 八:程序清单 九:参考文献

一. 概述 本课程设计以软件工程方法为指导,采用了结构化,模块化的程序设计方法,以C语言技术为基础,使用Turbo C++3、0为主要开发工具,对贪吃蛇游戏进行了需求分析,总体设计,详细设计,最终完成系统的实现与测试。 1、1 研究的背景及意义 随着社会的发展,人们生活的节奏日益加快,越来越多的人加入了全球化的世界。人们不再拘泥与一小块天地,加班,出差成了现代人不可避免的公务。而此时一款可以随时随地娱乐的游戏成为了人们的需要。此次课程设计完成的贪吃蛇小游戏,正就是为了满足上述需求而设计出来的。贪吃蛇游戏虽小,却设计诸多的知识点。通过开发贪吃蛇游戏系统,可使读者初步了解使用软件工程的与那个发,技术与工具开发软件的过程,进一步掌握结构化,模块化的程序设计方法与步骤,进一步掌握总体数据结构设计,模块划分方法,掌握局部变量,全局变量,结构体,共用体,数组,指针,文件等数据结构的使用方法,掌握图形,声音,随机数等多种库函数的使用方法,学习动画,音乐,窗口,菜单,键盘等多项编程技术,进一步学会软件调试,测试,组装等软件测试方法,为后续课程的学习与将来实际软件开发打下坚实的基础。 1、2 设计的任务与需要的知识点 1、2、1 课程设计主要完成的任务 1)、通过编写“贪吃蛇游戏”程序,掌握结构化,模块块化程序设计的思想,培养解决实际问题的能力。 2) 有同步播放动画,声音效果。 3) 设计好数组元素与蛇,食物的对应关系。 4) 随机产生食物。 5) 有分数统计,排行榜,分数存储等功能。 通过此次课程设计,希望使读者能更深入的理解与掌握课程教学中的基本概念,培养读者应用基本技术解决实际问题的能力,从而进一步提高分析问题与解决问题的能力。 1、2、2需要掌握与运用的知识点 1、2、3本次课程设计需要掌握与运用如下的知识点: 1) 数组的应用。 2) 全局变量的使用。 3) 按键处理。 4)结构体的应用。 5)图形,音乐与动画的有关知识。 6)随即函数的使用。 7)文件的基本出操作。 8) 结构化,模块化的设计方法。

C语言贪吃蛇

------------ 大学 C语言程序设计课程设计(论文)题目:贪吃蛇 院(系): 专业班级: 学号: 学生姓名: 指导教师: 教师职称: 起止时间:

课程设计(报告)任务及评语 院(系):教研室: 学号学生姓名专业班级 程序设计 (报告) 题目 贪吃蛇 程序设计(报告)任务 程序设计的任务与要求: (1)掌握C语言编程的基础知识。 (2)较熟练地编写C语言应用程序。 (3)了解C语言的常用标准函数、编程技巧、异常处理。 (5)联系已学过的内容,巩固所学的理论,增强独立工作能力。 (6)通过设计主要使学生有一个独立编写程序的过程,对理论学习及动手能力都有一个很大的提高。 (7)通过本次设计,进一步培养学生热爱专业的思想,同时对本专业综合素质的提高起一个积极的推动作用。 课程设计过程中,要严格遵守实践环节的时间安排,听从指导教师的指导。正确地完成上述内容,记录实习日记,规范完整地撰写出课程设计报告。 指 导 教 师 评 语 及 成 绩 成绩:指导教师签字: 2011年 1 月 4 日

目录 第1章 C语言课程设计的实训目的与要求 (1) 1.1 C语言课程设计目的 (1) 1.2 C语言课程设计的实验环境 (1) 1.3 C语言课程设计的预备知识 (1) 1.4 C语言课程设计要求 (1) 第2章 C语言课程设计内容 (2) 2.1程序功能介绍 (2) 2.2程序整体设计说明 (2) 2.2.1设计思路 (2) 2.2.2数据结构设计及用法说明 (3) 2.2.4各模块的功能及程序说明 (7) 2.2.5程序结果 (8) 2.3程序源代码及注释 (10) 第3章 C语言课程设计总结 (17) 参考资料.. (20)

基于VC的贪吃蛇游戏的C语言代码

#include #include #include #include #define U 1 #define D 2 #define L 3 #define R 4 //蛇的状态,U:上;D:下;L:左 R:右 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:主动退出游戏。 //声明全部函数// void Pos(); void creatMap(); void initsnake(); int biteself(); void createfood(); void cantcrosswall(); void snakemove(); void pause(); void gamecircle(); void welcometogame(); void endgame(); void gamestart(); void Pos(int x,int y)//设置光标位置 { COORD pos; HANDLE hOutput; pos.X=x;

c语言程序贪吃蛇课程设计报告范文

高级语言程序设计 课程设计报告 Experiment Designing reporter 课程名称:高级语言程序设计 英文名称 : C Program Experiment Designing 专业:自动化 111 学号: XXX 姓名: XXX 指导教师: XXX 日期: 2012 年 6月 17日至 2011 年6 月 20 日 山东工商学院信电学院

山东工商学院信电学院自动111班第一组“贪吃蛇课程设计报告“一:课程设计内容 程序功能介绍 贪吃蛇游戏是一个经典小游戏,深受众多玩家喜爱,其规则是:一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。此游戏不仅能锻炼人的思维敏捷性,而且还可以提高玩家的逻辑判断能力。 设计思路 我们小组称设计本次课题——贪吃蛇的思路为“贪快速上手贪吃蛇三步曲”: 第一步: 寻找到一个真正可以运行的已用C编好的贪吃蛇。 因为我们毕竟从未看到过用C编游戏的程序,让我们两手一抹黑的开始编写是有一定的困难的,如果我们自己找一个已经设计好的程序,以此为跳板实现我们想要达到的效果,那么肯定是高效的。所以我们组统一决定,去寻找一个可以运行的C编译的贪吃蛇。 第二步: 运行游戏并了解游戏程序。 我们认为,只有你运行并了解一个游戏,才能知道游戏里需要什么样的改进和创新,如果你自己本身就没玩过这个游戏,那么你就是再有技术,你也永远改进和改编不了一个游戏,因为你根本不知道你在干什么。 同样重要的是了解游戏程序。因为只有看懂了程序,才能实现对他的改编,才能游刃有余。 第三步: 寻找模块并分类,而后进行改编。 寻找到你想要改变的游戏内容的控制模块,比如,我想要增加一堵墙,那 第一页共十六页 自动化 111

彩版_贪吃蛇C语言版

// (彩版——贪吃蛇代码)在vc++6.0 中运行通过~~ //以下为运行效果图:

//好了,现在上源文件,,哈哈# include

# include # include # include # include # include # define ESC 27 # define SPACE 32 # define MAX_X 25 # define MAX_Y 50 int max_food;// 食物总数 int length = 0;// 蛇身长度 char sna_dir = 'd';// 蛇头方向 char temp; int snaDir_x, snaDir_y;// 蛇头方向坐标clock_t now_time;// 取系统时钟 double wait_time = 300;// 限制蛇的速度 typedef struct Node// 结构体 { int x;

int y; struct Node *pNext; }NODE, *PNODE; typedef struct Queue// queue 队列 { PNODE front; PNODE rear; }QUEUE, *PQUEUE; PQUEUE pSnake = (PQUEUE)malloc(sizeof(QUEUE));// 全局 HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); //获取句柄 void hideCursor()// 隐藏光标 { CONSOLE_CURSOR_INFO cursor_info = {1, 0}; SetConsoleCursorInfo(hConsole, &cursor_info); }

C语言课程设计报告——贪吃蛇源程序

C 语言课程设计 (小游戏贪吃蛇的程序设计报告)

设计人: 班级: 201 年月号

目录一:概述 1:研究背景及意义 2:设计的任务与需要知识点 3:具体完成设计内容 二:需求分析 1:功能需求 2:操作方法 三:总体设计 1:模块划分 2:数据结构设计 四:详细设计 1:主空摸块设计 2:绘制游戏界面 3:游戏的具体过程 4:游戏的结束处理 5:显示排行榜信息模块 五:程序的调试与测试 1:动画与音乐同步 2:蛇的运行 3:终止程序 六:结论 七::结束语 八:程序清单 九:参考文献

一.概述 本课程设计以软件工程方法为指导,采用了结构化,模块化的程序设计方法,以C 语言技术为基础,使用Turbo C++3.0为主要开发工具,对贪吃蛇游戏进行了需求分析,总体设计,详细设计,最终完成系统的实现与测试。 1.1 研究的背景及意义 随着社会的发展,人们生活的节奏日益加快,越来越多的人加入了全球化的世界。人们不再拘泥与一小块天地,加班,出差成了现代人不可避免的公务。而此时一款可以随时随地娱乐的游戏成为了人们的需要。此次课程设计完成的贪吃蛇小游戏,正是为了满足上述需求而设计出来的。贪吃蛇游戏虽小,却设计诸多的知识点。通过开发贪吃蛇游戏系统,可使读者初步了解使用软件工程的和那个发,技术和工具开发软件的过程,进一步掌握结构化,模块化的程序设计方法和步骤,进一步掌握总体数据结构设计,模块划分方法,掌握局部变量,全局变量,结构体,共用体,数组,指针,文件等数据结构的使用方法,掌握图形,声音,随机数等多种库函数的使用方法,学习动画,音乐,窗口,菜单,键盘等多项编程技术,进一步学会软件调试,测试,组装等软件测试方法,为后续课程的学习和将来实际软件开发打下坚实的基础。 1.2 设计的任务和需要的知识点 1.2.1 课程设计主要完成的任务 1). 通过编写“贪吃蛇游戏”程序,掌握结构化,模块块化程序设计的思想,培养解决实际问题的能力。 2) 有同步播放动画,声音效果。 3) 设计好数组元素与蛇,食物的对应关系。 4) 随机产生食物。 5) 有分数统计,排行榜,分数存储等功能。 通过此次课程设计,希望使读者能更深入的理解和掌握课程教学中的基本概念,培养读者应用基本技术解决实际问题的能力,从而进一步提高分析问题和解决问题的能力。 1.2.2需要掌握和运用的知识点 1.2.3本次课程设计需要掌握和运用如下的知识点: 1) 数组的应用。 2) 全局变量的使用。 3) 按键处理。 4)结构体的应用。 5)图形,音乐和动画的有关知识。 6)随即函数的使用。 7)文件的基本出操作。

C语言贪吃蛇实验报告

C语言程序设计报告 题目:贪吃蛇游戏的程序设计 院系:西语学院英语教育6班 : 学号:

1.1题目: 设计贪吃蛇小游戏 1.2题目的要求: 玩家通过键盘控制蛇在地图上寻找食物,蛇吃下食物,可以加分,碰到四壁游戏结束。 1.3设计的步骤: ●分析设计题目的要求,即需求分析。 ●总体设计,确定所需模块及模块间调用关系,定义系统中使用的数据类型。 ●详细设计,确定每个模块的功能,绘制主要函数的流程图。 ●编写程序代码,调试程序使其能正确运行。要求书写规范,注意采用缩进格式。函数 名、变量名要见文晓意,注释要简而不失、详而不缀。设计完成的软件要便于操作和使用。 ●程序测试,发现程序中存在的错误并改正。 ●完成报告。 2详细设计说明 2.1课程设计的要求: 通过游戏程序设计,提高编程兴趣与编程思路,巩固C语言中所学的知识,合理的运用资料,实现理论与实际相结合。 ●收集资料,分析课题,分解问题,形成总体设计思路;

●对于设计中用到的关键函数,要学会通过查资料,弄懂其用法,要联系问题进行具 体介绍; ●上机调试,查错,逐步分析不能正常运行的原因,确保所设计的程序正确,并且能 正常运行; ●完成课程设计报告。 2.2程序的功能: 贪吃蛇游戏是一个经典小游戏,一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。 2.3课程设计的思想: 程序关键在于表示蛇的图形及蛇的移动。用一个小圆点来表示蛇的一节身体,身体每长一节,增加一个圆点,蛇头用四节来表示。移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,如果按与蛇运动方向相反的方向键,此游戏就会暂停,再按想前的方向键才能继续游戏,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新蛇的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现与消失也是画一个圆点和覆盖原来的圆点。为了便于理解,定义两个结构体:食物与蛇。

C语言贪吃蛇源程序代码双人对抗

C语言贪吃蛇源程序代码双人对抗 #include <conio.h> #include <dos.h> #include <graphics.h> #include <stdlib.h> #include <bios.h> #include <time.h> #include <malloc.h> #define LEFT 100 #define TOP 30 #define RIGHT 538 #define BOTTOM 468 #define SIZE 20 #define SL 100 /*SL表示产生食物的个数*/ typedef struct Snake/*表示蛇的结点*/ { int bx,by; struct Snake *next; }Snake,*SnakeList; SnakeList createsnake(int cx,int cy)/*创建一个蛇头。*/ { SnakeList l; l=(SnakeList)malloc(sizeof(Snake)); l->next=NULL; l->bx=cx; l->by=cy; return l; } void paintsnake(SnakeList l,int scoler,int tcoler)/*输出蛇身的函数,也可作为消去蛇身的函数。*/ { SnakeList p; int x,y; p=l; setfillstyle(SOLID_FILL,scoler); for(;p->next;)

贪吃蛇C语言课程设计报告

贪吃蛇游戏设计 姓名:张力 学号: 10020323完成日期:月日

一、设计目的 贪吃蛇游戏程序功能的实现主要是建立在二维数组和图形界面的应用上,通过编写游戏程序能够熟悉掌握相关数组和图形函数的运用,提高编程水平,增加编程的兴趣 二、总体设计 主函数 ↓ 图形驱动I n i t画界面D r a w K游戏具体过程G a m e P l a y 图形结束C l o s e ↓ 游戏结束G a m e O v e r输出成绩P r S c o r e 三、详细设计(项目成员及分工、模块功能说明(如函数功能、入口及出口参数说明,函数调用关系描述等) ①主函数m a i n(): 定义使用的常数,全局变量及函数原型说明,并调用I n i t()函数初始化图形系统;然后调用D r a w K()函数画界面,调用G a m e P l a y()函数实现游戏的具体过程,游戏结束后调用C l o s e()函数关闭图形系统结束程序。 ②画界面函数D r a w K(): 主界面是一个密封的围墙,用两个循环语句分别在水平方向和垂直方向输出连续的宽度和高度均为10个单位的矩形小方块,设置成淡青色,背景颜色为黑色。 ③游戏具体过程函数G a m e P l a y(): 算法过程: a.设置初始值。为防止食物出现在一个位置上,要设置随机数发生器,真正产生随机数。初始时,蛇只有蛇头,设定一个开始方向; b.循环执行,直到按E s c键退出; c.没有按键的情况下,循环执行。 如果没有食物,随机出现食物;食物的随机出现要确保它的位置在10的倍数位置上,因为蛇的坐标都是以10为模的;如果有食物,则显示食物,蛇

C语言小游戏源代码《贪吃蛇》

C语言小游戏源代码《贪吃蛇》 #define N 200/*定义全局常量*/ #define m 25 #include #include #include #include #define LEFT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 #define UP 0x4800 #define Esc 0x011b inti,j,key,k; struct Food/*构造食物结构体*/ { int x; int y; int yes; }food; struct Goods/*构造宝贝结构体*/ { int x; int y; int yes; }goods; struct Block/*构造障碍物结构体*/ { int x[m]; int y[m]; int yes; }block; struct Snake{/*构造蛇结构体*/ int x[N]; int y[N]; int node; int direction; int life; }snake; struct Game/*构建游戏级别参数体*/ { int score; int level; int speed;

}game; /*定义函数*/ void init(void);/*定义图形驱动*/ void close(void);/*定义关闭函数*/ void drawk(void);/*定义界面函数*/ void gameover(void);/*定义游戏结束函数*/ void gameplay(void);/*定义游戏主函数*/ void prscore(void);/*定义得分函数*/ void main(void){/*主函数体,调用以下四个函数*/ init(); setbkcolor(7); drawk(); gameplay(); close(); } void init(void){/*构建图形驱动函数*/ intgd=DETECT,gm; initgraph(&gd,&gm,""); cleardevice(); } void drawk(void){/*构建游戏界面函数*/ /*setbkcolor(LIGHTGREEN);*/ char str3[50]; setfillstyle(SOLID_FILL,BLUE);/*条型边框,显示版本信息*/ bar3d(48,9,610,38,1,45); setcolor(YELLOW);/*版本信息*/ sprintf(str3,"Version:5.01,Powerwing Studio"); outtextxy(330,20,str3); setfillstyle(LTSLASH_FILL,YELLOW);/*设定墙边的填充形式*/ bar3d(48,48,58,462,0,0);/*设定墙边*/ bar3d(48,39,611,48,0,0); bar3d(48,452,611,462,0,0); bar3d(602,39,611,462,0,0); } void gameplay(void){/*构建游戏主函数*/ /*初始化游戏角色*/ randomize();/*随机数发生器*/ goods.yes=1; block.yes=1; food.yes=1;/*场景中需建立新的食物*/

C语言课程设计报告——贪吃蛇源程序

课程设计(小游戏贪吃蛇的程序设计报告) 设计人:刘兵飞 班级:计11-1 学号:21号 2011年12月28号

目录一:概述 1:研究背景及意义 2:设计的任务与需要知识点3:具体完成设计内容 二:需求分析 1:功能需求 2:操作方法 三:总体设计 1:模块划分 2:数据结构设计 四:详细设计 1:主空摸块设计 2:绘制游戏界面 3:游戏的具体过程 4:游戏的结束处理 5:显示排行榜信息模块 五:程序的调试与测试1:动画与音乐同步 2:蛇的运行 3:终止程序 六:结论 七::结束语 八:程序清单 九:参考文献

一.概述 本课程设计以软件工程方法为指导,采用了结构化,模块化的程序设计方法,以C语言技术为基础,使用Turbo C++3.0为主要开发工具,对贪吃蛇游戏进行了需求分析,总体设计,详细设计,最终完成系统的实现与测试。 1.1 研究的背景及意义 随着社会的发展,人们生活的节奏日益加快,越来越多的人加入了全球化的世界。人们不再拘泥与一小块天地,加班,出差成了现代人不可避免的公务。而此时一款可以随时随地娱乐的游戏成为了人们的需要。此次课程设计完成的贪吃蛇小游戏,正是为了满足上述需求而设计出来的。贪吃蛇游戏虽小,却设计诸多的知识点。通过开发贪吃蛇游戏系统,可使读者初步了解使用软件工程的和那个发,技术和工具开发软件的过程,进一步掌握结构化,模块化的程序设计方法和步骤,进一步掌握总体数据结构设计,模块划分方法,掌握局部变量,全局变量,结构体,共用体,数组,指针,文件等数据结构的使用方法,掌握图形,声音,随机数等多种库函数的使用方法,学习动画,音乐,窗口,菜单,键盘等多项编程技术,进一步学会软件调试,测试,组装等软件测试方法,为后续课程的学习和将来实际软件开发打下坚实的基础。 1.2 设计的任务和需要的知识点 1.2.1 课程设计主要完成的任务 1). 通过编写“贪吃蛇游戏”程序,掌握结构化,模块块化程序设计的思想,培养解决实际问题的能力。 2) 有同步播放动画,声音效果。 3) 设计好数组元素与蛇,食物的对应关系。 4) 随机产生食物。 5) 有分数统计,排行榜,分数存储等功能。 通过此次课程设计,希望使读者能更深入的理解和掌握课程教学中的基本概念,培养读者应用基本技术解决实际问题的能力,从而进一步提高分析问题和解决问题的能力。 1.2.2需要掌握和运用的知识点 1.2.3本次课程设计需要掌握和运用如下的知识点: 1) 数组的应用。 2) 全局变量的使用。 3) 按键处理。 4)结构体的应用。 5)图形,音乐和动画的有关知识。 6)随即函数的使用。 7)文件的基本出操作。

C语言课程设计报告材料——贪吃蛇源程序

C 语言课程设计(小游戏贪吃蛇的程序设计报告) 设计人: 班级: 201 年月号

目录一:概述 1:研究背景及意义 2:设计的任务与需要知识点3:具体完成设计内容 二:需求分析 1:功能需求 2:操作方法 三:总体设计 1:模块划分 2:数据结构设计 四:详细设计 1:主空摸块设计 2:绘制游戏界面 3:游戏的具体过程 4:游戏的结束处理 5:显示排行榜信息模块 五:程序的调试与测试1:动画与音乐同步 2:蛇的运行 3:终止程序 六:结论 七::结束语 八:程序清单 九:参考文献

一.概述 本课程设计以软件工程方法为指导,采用了结构化,模块化的程序设计方法,以C语言技术为基础,使用Turbo C++3.0为主要开发工具,对贪吃蛇游戏进行了需求分析,总体设计,详细设计,最终完成系统的实现与测试。 1.1 研究的背景及意义 随着社会的发展,人们生活的节奏日益加快,越来越多的人加入了全球化的世界。人们不再拘泥与一小块天地,加班,出差成了现代人不可避免的公务。而此时一款可以随时随地娱乐的游戏成为了人们的需要。此次课程设计完成的贪吃蛇小游戏,正是为了满足上述需求而设计出来的。贪吃蛇游戏虽小,却设计诸多的知识点。通过开发贪吃蛇游戏系统,可使读者初步了解使用软件工程的和那个发,技术和工具开发软件的过程,进一步掌握结构化,模块化的程序设计方法和步骤,进一步掌握总体数据结构设计,模块划分方法,掌握局部变量,全局变量,结构体,共用体,数组,指针,文件等数据结构的使用方法,掌握图形,声音,随机数等多种库函数的使用方法,学习动画,音乐,窗口,菜单,键盘等多项编程技术,进一步学会软件调试,测试,组装等软件测试方法,为后续课程的学习和将来实际软件开发打下坚实的基础。 1.2 设计的任务和需要的知识点 1.2.1 课程设计主要完成的任务 1). 通过编写“贪吃蛇游戏”程序,掌握结构化,模块块化程序设计的思想,培养解决实际问题的能力。 2) 有同步播放动画,声音效果。 3) 设计好数组元素与蛇,食物的对应关系。 4) 随机产生食物。 5) 有分数统计,排行榜,分数存储等功能。 通过此次课程设计,希望使读者能更深入的理解和掌握课程教学中的基本概念,培养读者应用基本技术解决实际问题的能力,从而进一步提高分析问题和解决问题的能力。 1.2.2需要掌握和运用的知识点 1.2.3本次课程设计需要掌握和运用如下的知识点: 1) 数组的应用。 2) 全局变量的使用。 3) 按键处理。 4)结构体的应用。 5)图形,音乐和动画的有关知识。 6)随即函数的使用。 7)文件的基本出操作。

一个C语言写的简单贪吃蛇源代码

#include #include #include #include #include #include int grade=5,point=0,life=3; void set(),menu(),move_head(),move_body(),move(),init_insect(),left(),upon(),right(),down(),init_grap h(),food_f(),ahead(),crate(); struct bug { int x; int y; struct bug *last; struct bug *next; }; struct fd { int x; int y; int judge; }food={0,0,0}; struct bug *head_f=NULL,*head_l,*p1=NULL,*p2=NULL; void main() { char ch; initgraph(800,600); set(); init_insect(); while(1) { food_f(); Sleep(grade*10); setcolor(BLACK); circle(head_l->x,head_l->y,2); setcolor(WHITE); move_body(); if(kbhit()) { ch=getch(); if(ch==27) { ahead();

set(); } else if(ch==-32) { switch(getch()) { case 72:upon();break; case 80:down();break; case 75:left();break; case 77:right();break; } } else ahead(); } else { ahead(); } if(head_f->x==food.x&&head_f->y==food.y) { Sleep(100); crate(); food.judge=0; point=point+(6-grade)*10; if(food.x<30||food.y<30||food.x>570||food.y>570) life++; menu(); } if(head_f->x<5||head_f->x>595||head_f->y<5||head_f->y>595) { Sleep(1000); life--; food.judge=0; init_graph(); init_insect(); menu(); } for(p1=head_f->next;p1!=NULL;p1=p1->next) { if(head_f->x==p1->x&&head_f->y==p1->y) { Sleep(1000); life--; food.judge=0;

vc贪吃蛇c语言代码

#include "stdio.h" #include "stdio.h" #include "windows.h" #include "time.h" #include "setjmp.h" #define MAXNOD 500 #define UP 1 #define DOWN -1 #define LEFT -2 #define RIGHT 2 #define YES 1 #define NO 0 jmp_buf retry; typedef struct{ int x; int y; int status; }Food; typedef struct { int *px; int *py; int direction; int nodlen; int score; }Snack; int gotoxy(int x, int y) { COORD cd; cd.X = x; cd.Y = y; return SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cd); } void initialization(Snack *pss) { system("color 0e"); pss->px=(int *)malloc(MAXNOD*sizeof(int)); pss->py=(int *)malloc(MAXNOD*sizeof(int)); memset(pss->px,0,MAXNOD); memset(pss->py,0,MAXNOD);

pss->px[0]=0;pss->py[0]=0; pss->px[1]=1;pss->py[1]=0; pss->direction=RIGHT; pss->nodlen=2; pss->score=0; } void getscoresys(Snack scr) { gotoxy(68,7); cprintf("score: %d",scr.score); } int ctrltoi(char ctr) { switch(ctr) { case 'w': return UP; case 's': return DOWN; case 'a': return LEFT; case 'd': return RIGHT ; } } void boundary() { int cnt,y; gotoxy(15,3); for (cnt=0;cnt<45;cnt++) { cprintf("%c",4); } for (y=4;y<20;y++) { gotoxy(15,y); cprintf("%c",219); gotoxy(59,y); cprintf("%c",219); }

C语言实现贪吃蛇

C语言实现贪吃蛇 /***************************************************************** ************************************************************ 贪吃蛇实现原理: * 贪吃蛇游戏在理论上是可以无限的进行下去的(除了撞墙和咬到自己),那么游戏主体就一定是个循环。 * 蛇是如何动起来的?在这里就是通过不断改变蛇的坐标,然后根据蛇的坐标不断刷新屏幕在视觉上形成蛇的移动效果。* 食物出现在随机位置(当然不能出现在障碍物和蛇身上)。* 蛇能吃到食物其实就是蛇头的坐标与食物的坐标重合时。 *

当蛇咬到自己或者撞到墙的时候游戏结束(坐标判断) * ****************************************************************** ************************************************************/#incl ude <stdio.h> #include <conio.h> #include <stdlib.h> #include <windows.h> #include <time.h>//72,80,75,77是方向键对应的键值 #define UP 72 #define DOWN 80 #define LEFT 75

#define RIGHT 77 #define SNAKE 1 //蛇的坐标标识 #define FOOD 2 //食物的坐标标识 #define BAR 3 //墙的坐标标识//初始化地图17*17 char map[17][17] = {0}; //初始化蛇头坐标 unsigned char snake[50] = {77}; //初始化食物坐标 unsigned char food = 68; //蛇长 char len = 1;//存储坐标数字与x、y的转换函数

贪吃蛇代码-C语言-VC++6.0

/*这是一个贪吃蛇代码,运行环境VC++6.0(亲测完美运行)*/ /*该程序在dos系统下运行,不需要graphics.h头文件*/ /*该程序由C语言小方贡献,谢谢您的支持*/ #include #include #include #include #include #include #define N 21 int apple[3]; char score[3]; char tail[3]; void gotoxy(int x, int y) //输出坐标 { COORD pos; pos.X = x; pos.Y = y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); } void color(int b) //颜色函数 { HANDLE hConsole = GetStdHandle((STD_OUTPUT_HANDLE)) ; SetConsoleTextAttribute(hConsole,b) ; } int Block(char head[2]) //判断出界 { if ((head[0] < 1) || (head[0] > N) || (head[1] < 1) || (head[1] > N)) return 1; return 0; } int Eat(char snake[2]) //吃了苹果 { if ((snake[0] == apple[0]) && (snake[1] == apple[1])) { apple[0] = apple[1] = apple[2] = 0; gotoxy(N+44,10); color(13);

完整版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 只表示了贪吃蛇的活动区域。通过 snakeMap 可以定位 globalMap 中的元素,反过来通过 globalMap 也可以找到 snakeMap 中的元素。请看下图: 图1:globalMap 和 snakeMap 的初始对应关系 贪吃蛇向左移动时,headerIndex 指向 404,tailIndex指向 406。 为什么设计的这么晦涩和复杂呢,因为这样设计有以下几个好 处: 贪吃蛇移动时不用处理所有节点,只要添加蛇头、删除蛇尾、重建 globalMap 和 snakeMap 的对应关系就可以; 随机生成食物一次就可以成功,不用担心食物会占用边框或贪吃蛇的位置; 贪吃蛇移动时,不用遍历数组就可以知道是否与自身相撞。

相关文档
最新文档