本文由清风灬鬼迷贡献
rtf文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。
C语言课程设计报告
题目:贪吃蛇游戏
专 业: 业: 级: 班 级: 号: 学 号: 名: 姓 名: 指导老师: 指导老师: 绩: 成 绩: 设计日期: 设计日期:
目
录
《C语言课程设计》报告 1 语言课程设计》 题目: 题目:贪吃蛇游戏 1 3 一、选题背景 4 二、设计思路 四、程序流程图 5 五、原程序清单 5 六、程序运行结果 11 12 七、设计总结 14 八、教师评语元旦高速免费吗
一、选题背景
C语言实际上已经成为了中级语言的事实上的标准,如果你从事嵌入式开 发、芯片设计等,C语言是必须懂的基础;在高级语言上,C语言的简练和精确 也具备特殊的优势;VC的强大在Windows平台上其它语言更是难与之相匹敌, 在Unix/Linux平台上,C语言也是最终要的语言,Linux的内核也主要是以C语言 写的。 当然C语言也有缺点:就是难,容易出错,因为它的数据类型需要精确, 而导致不够深入理解的程序员常容易犯错。 通过本学期对C语言的学习,掌握了C语言的基本语法,能编一些小程序。 通过这次实习,结合C++语言,编写了著名的贪吃蛇游戏,目的提高自己的编 程水平。
二、设计思路
程序关键在于表示蛇的图形及蛇的移动。用一个小矩形快表示蛇的一节身 体,身体每长一节,增加一个矩形块,蛇头用俩节表示。移动时必须从蛇头开 始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前 移,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按 下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现 是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新 蛇的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后一节用背景 覆盖。食物的出现与消失也是画矩形块和覆盖矩形块。为了便于理解,定义 两个结构体:食物与蛇
三、主要问题的解决方法和关键技术
.通过随机函数产生随机数,控制游戏过程食物的出现; .定义键盘操作,控制游戏过程蛇的移动方向; . 画出边界,并判断游戏是否结束; . 统计游戏过程蛇吃的食物数量,计算并输出游戏成绩。
四、程序流程图
五、原程序清单
#include <windows.h> #include <ctime> #include #include <vector> #include <queue> using namespace std; #ifndef SNAKE_H #define SNAKE_H class Cmp {
friend class Csnake; int rSign; //横坐标 int lSign; //竖坐标 public: // friend bool isDead(const Cmp& cmp); Cmp(int r,int l){setPoint(r,l);} Cmp(){} void setPoint(int r,int l){rSign=r;lSign=l;} Cmp operator-(const Cmp &m)const { return Cmp(rSign-m.rSign,lSign-m.lSign);
} Cmp operator+(const Cmp &m)const { return Cmp(rSign+m.rSign,lSign+m.lSign); } }; const int maxSize = 5; //初始蛇身长度 class Csnake { Cmp firstSign; //蛇头坐标 Cmp secondSign;//蛇颈坐标 Cmp lastSign; //蛇尾坐标 Cmp nextSign; //预备蛇头 int row; //列数 int line; //行数 int count; //蛇身长度 vector<vector<char> > snakeMap;//整个游戏界面 queue<Cmp> snakeBody; //蛇身 public: int GetDirections()const; char getSymbol(const Cmp& c)const //获取指定坐标点上的字符 { return snakeMap[c.lSign][c.rSign]; } Csnake(int n) //初始化游戏界面大小 { if(n<20)line=20+2; else if(n>30)line=30+2; else line=n+2; row=line*3+2;
} bool isDead(const Cmp& cmp) { return ( getSymbol(cmp)=='@' || cmp.r
Sign == row-1 || cmp.rSign== 0 || cmp.lSign
== line-1 || cmp.lSign == 0 ); } void InitInstance(); //初始化游戏界面 bool UpdataGame(); //更新游戏界面 void ShowGame(); //显示游戏界面 }; #endif // SNAKE_H using namespace std; //测试成功 void Csnake::InitInstance() { snakeMap.resize(line); // snakeMap[竖坐标][横坐标] for(int i=0;i
if(GetKeyState(VK_LEFT)<0) return 3; //3表示按下左键 if(GetKeyState(VK_RIGHT)<0)return 4; //4表示按下右键 return 0; } bool Csnake::UpdataGame() { ////初始化得分0 static int score=0; //获取用户按键信息 int choice; choice=GetDirections(); cout<<"Total score: "<<score<<endl; //随机产生食物所在坐标 int r,l; //开始初始已经吃食,产生一个食物 static bool eatFood=true; //如果吃了一个,才再出现第2个食物 if(eatFood) { do { //坐标范围限制在(1,1)到(line-2,row-2)对点矩型之间 srand(time(0)); r=(rand()%(row-2))+1; //横坐标 l=(rand()
%(line-2))+1;//竖坐标 //如果随机产生的坐标不是蛇身,则可行 //否则重新产生坐标 if(snakeMap[l][r]!='@') {snakeMap[l][r]='*';} }while (snakeMap[l][r]=='@'); } switch (choice) { case 1://向上 //如果蛇头和社颈的横坐标不相同,执行下面操作 if(firstSign.rSign!=secondSign.rSign)nextSign.setPoint (firstSign.rSign,firstSign.lSign-1); //否则,如下在原本方向上继续移动 else nextSign=firstSign+(firstSign-secondSign); break; case 2://向下 if(firstSign.rSign!=secondSign.rSign)nextSign.setPoint
(firstSign.rSign,firstSign.lSign+1); else nextSign=firstSign+(firstSign-secondSign); break; case 3://向左 if(firstSign.lSign!=secondSign.lSign)nextSign.setPoint (firstSign.rSign-1,firstSign.lSign); else nextSign=firstSign+(firstSign-secondSign); break; case 4://向右
if(firstSign.lSign!=secondSign.lSign)nextSign.setPoint (firstSign.rSign+1,firstSign.lSign); else nextSign=firstSign+(firstSign-secondSign); break; default: nextSign=firstSign+(firstSign-secondSign); } //if(getSymbol(nextSign)!='*' && !isDead(nextSign)) //如果没有碰到食物(且没有死亡的情况下),删除蛇尾,压入新的蛇头 { //删除蛇尾 lastSign=snakeBody.front(); snakeMap[lastSign.lSign][lastSign.rSign]=' '; snakeBody.pop(); //更新蛇头 secondSign=firstSign; //压入蛇头 snakeBody.push(nextSign); firstSign=snakeBody.back(); snakeMap[firstSign.lSign][firstSign.rSign]='@'; //没有吃食 eatFood=false; return true; } //吃食else if(getSymbol(nextSign)=='*' && !isDead(nextSign)) { secondSign=firstSign; snakeMap[nextSign.lSign][nextSign.rSign]='@'; //只压入蛇头 snakeBody.push(nextSign); firstSign=snakeBody.back(); eatFood=true; //加分
score+=20; return true; } //死亡else {cout<<"Dead"<<endl;cout<<"Your last total score is "<<score <<endl; return false;} } void Csnake::ShowGame() { for(int i=0;i
六、程序运行结果
七、设计总结
经过这学期对《C程序设计》的学习,我们学习了理论知识,了解了C语言 程序设计的思想,这些知识都为我们的下一步学习打下了坚实的基础。通过课 程设计,一方面是为了检查我们一个学期来我们学习的成果,另一方面也是为 了让我们进一步的掌握和运用它,同时也让我们认清自己的不足之处和薄弱环 节,加以弥补和加强。 C语言,对我们学习软件技术的学生还是特别重要,他除了能便一些小型程 序之外,还能变一些大型的程序。计算机本身是无生命的机器,要是计算机能 够运行起来,为人类完成各种各样的工作,就必须让他执行相应的程序,这些 程序都是依靠程序设计语言编写出来的。在众多的程序设计语言中, C语言有独 特之处。它作为一种高级程序设计语言,具备方便性、灵活性和通用性等特 点。同时,他还向程序员提供了直接操作计算机硬件的功能,具备低级语言的 特点,适合各种类型的软件开发。因此C语言深受软件工程人员欢迎的程序设
计 语言。要想学好C语言首先要了解C语言的发展、特点等一些知识。 C语言的出现是与UNIX操作系统是联系在一起的,C语言本身也有一个发展 过程,目前仍然吃与发展和完善之中。从历史发展来看,C语言起源于1968年
的 CPL,他的许多思想来自于Martin Richards 在1969年研制的BCPL为基础的由 Ken Thompson 在1970年研制的B语言,他用B语言写出了第一个UNIX 操作系 统,用在PDP-7计算机上。D.M.Ritchie 于1972年在B语言的基础上研制了C语 言,并用C语言写成了第一个在PDP-11计算机上实现的UNIX操作系统。1977年出 现了独立于计算机的C语言编译文本——《可移植C语言编译程序》,从而大大 简化了把C语言编译程序移植到新环境所需要做的工作,这就使得UNIX操作系统 迅速在众多的计算机上得以实现。 说到C语言的特点,它是多方面的。可以归纳为以下几点:1、C语言具有结 构语言的特点,程序之间很容易实现段的共享。2、C语言的主要结构成分为函 数,函数可以在程序中被定义完成独立的任务,独立地编译成代码,以实现程 序的模块化。3、C语言运算符丰富,运算符包含的范围很广。4、C语言数据类 型丰富,有整型、实型、字符型、数组型、指针型、结构体型、共用体型 等。5、C语言允许直接访问物理地址,即可直接对硬件进行操作,实现汇编语 言的大部分功能。6、C语言语法限制不太严格,程序设计自由度大,这样使C语 言能够减少对程序员的束缚。7、用C语言编程,生成的目标代码质量高,程序 执行效率高。总之 C语言既是非
世界第八大奇观常有趣的语言又是非常实用的语言。 说到实训,你要明确自己的目标,不要整天沉迷于网络游戏当中,浪费自 己的大好青春。在实训前要明确实训的相关要点,课程设计为学生提供了一个 既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起 来,锻炼学生的分析解决实际问题的能力。提高学生适应实际,实践编程的能 力。课程设计的基本理论是该课程设计的C语言为基础,掌握程序设计方法,为 科学研究中的基层开发工作奠定良好基础;同时培养学生的分析能力、设计能 力和整体设计思想,以提高学生的科学研究素质和在工作岗位中的具体应用能 力。课程设计内容和基本要求,首先课程设计内容是利用学到的编程知识和编 程技巧,通过布置具有一定难度的程序设计题目,帮助学生熟悉程序编写,及 时查究错误,独立完成。这次C语言有很多题目,主要有以下设计题目:、输入 学生成绩并显示、显示输入数据、日历源程序、字符排序、指法练习、汉诺
塔、排序、模拟时钟、贪吃蛇游戏、学生管理系统。总之这词实训的任务特别 繁重,他不仅要耗费我们的时间,同时他也会耗费我们的经精力,但那样是值 得的。 如果说第一天是摸索,第二天是创业,第三天是完善,第四天就是革命 了!经过我的不段努力,一个又一个的问题在我的脑细胞下伏首称臣,一个又 一个枷锁被我斩断,好象又获得了另一片天地,感到神情气爽,一坐又一坐高 山被我征服,在欢庆胜利的喜悦的同时,我看着下面依然在不懈的奋斗中的同 胞妹们,心里叫一个着急啊!!我知道今天的努力就是明天的成功。我是经 过自己的努力成功了,但在这可能是我终
生难忘的,在这过程中我经历了风风 雨雨,经过了酸甜苦辣。有时为了一个未完成的程序,我甚至废寝忘食,在计 算机楼整整呆了四五个小时,忍着千般痛苦就是为了自己的理想。有时为了一 个不懂的问题,我几乎都踏平老师办公室的门槛了,可能老师有点烦了,但就 是那种求知欲趋使我不断的去问问题。经管是这样,我还是有有些不懂,我还 得经常去请教同学。就这样经过两周的时间我终于完成了自己的使命,正所谓 不辱使命啊!! 实训结束在即,但是学习的路途依然漫长,“学海无涯苦做舟,书山有路勤 为径”,这句话一直都游荡在我的脑海中。在现实社会中 知识是永无止境的, 在知识中我们可以学习前人丰富的思想学识,我们可以熏陶自己的灵魂,我们 可以增进自己的情感,我们可以了解到世界的宽广和伟大。我们必须发扬老一 辈无产阶级革命分子的不怕苦不怕累不怕精神疲惫的大无畏精神,为了能够超 日赶美,为了中国IT行业能够得到更大的发展,我们必须努力,成为新一代中 国程序员而努力!!程序员之路是一条漫长而艰辛的道路,从我做起,前人植树后人乘凉,让 我们从现在开始,你会有成功的一天。
八、教师评语
评阅教师: 评阅教师:
评阅日期: 评阅日期: 2010 年 7 月
如何写入团申请书 1本文由清风灬鬼迷贡献
rtf文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。
C语言课程设计报告
题目:贪吃蛇游戏
专 业: 业: 级: 班 级: 号: 学 号: 名: 姓 名: 指导老师: 指导老师: 绩: 成 绩: 设计日期: 设计日期:
目
录
《C语言课程设计》报告 1 语言课程设计》 题目: 题目:贪吃蛇游戏 1 3 一、选题背景 4 二、设计思路 四、程序流程图 5 五、原程序清单 5 六、程序运行结果 11 12 七、设计总结 14 八、教师评语
一、选题背景
C语言实际上已经成为了中级语言的事实上的标准,如果你从事嵌入式开 发、芯片设计等,C语
言是必须懂的基础;在高级语言上,C语言的简练和精确 也具备特殊的优势;VC的强大在Windows平台上其它语言更是难与之相匹敌, 在Unix/Linux平台上,C语言也是最终要的语言,Linux的内核也主要是以C语言 写的。 当然C语言也有缺点:就是难,容易出错,因为它的数据类型需要精确, 而导致不够深入理解的程序员常容易犯错。 通过本学期对C语言的学习,掌握了C语言的基本语法,能编一些小程序。 通过这次实习,结合C++语言,编写了著名的贪吃蛇游戏,目的提高自己的编 程水平。
二、设计思路
程序关键在于表示蛇的图形及蛇的移动。用一个小矩形快表示蛇的一节身 体,身体每长一节,增加一个矩形块,蛇头用俩节表示。移动时必须从蛇头开 始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前 移,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按 下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现 是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新 蛇的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后一节用背景 覆盖。食物的出现与消失也是画矩形块和覆盖矩形块。为了便于理解,定义 两个结构体:食物与蛇
三、主要问题的解决方法和关键技术
.通过随机函数产生随机数,控制游戏过程食物的出现; .定义键盘操作,控制游戏过程蛇的移动方向; . 画出边界,并判断游戏是否结束; . 统计游戏过程蛇吃的食物数量,计算并输出游戏成绩。
弘扬雷锋精神征文 四、程序流程图
五、原程序清单
#include <windows.h> #include <ctime> #include #include <vector> #include <queue> using namespace std; #ifndef SNAKE_H #define SNAKE_H class Cmp {
friend class Csnake; int rSign; //横坐标 int lSign; //竖坐标 public: // friend bool isDead(const Cmp& cmp); Cmp(int r,int l){setPoint(r,l);} Cmp(){} void setPoint(int r,int l){rSign=r;lSign=l;} Cmp operator-(const Cmp &m)const { return Cmp(rSign-m.rSign,lSign-m.lSign);
} Cmp operator+(const Cmp &m)const { return Cmp(rSign+m.rSign,lSign+m.lSign); } }; const int maxSize = 5; //初始蛇身长度 class Csnake { Cmp firstSign; //蛇头坐标 Cmp secondSign;//蛇颈坐标 Cmp lastSign; //蛇尾坐标 Cmp nextSign; //预备蛇头 int row; //列数 int line; //行数 int count; //蛇身长度 vector<vector<char> > snakeMap;//整个游戏界面 queue<Cmp> snakeBody; //蛇身 public: int GetDirections()const; char getSymbol(const Cmp& c)const //获取指定坐标点上的字符 { return snakeMap[c.lSign][c.rSign]; } Csnake(int n) //初始化游戏界面大小 { if(n<20)line=20+2; else if(n>30)line=30+2; else line=n+2; row=line*3+2;
} bool isDead(const Cmp& cmp) { return ( getSymbol(cmp)=='@' || cmp.rSign == row-1 || cmp.rSign== 0 || cmp.lSign == line-1 || cmp.l
Sign == 0 ); } void InitInstance(); //初始化游戏界面 bool UpdataGame(); //更新游戏界面 void ShowGame(); //显示游戏界面 }; #endif // SNAKE_H using namespace std; //测试成功 void Csnake::InitInstance() { snakeMap.resize(line); // snakeM
ap[竖坐标][横坐标] for(int i=0;i
if(GetKeyState(VK_LEFT)<0) return 3; //3表示按下左键 if(GetKeyState(VK_RIGHT)<0)return 4; //4表示按下右键 return 0; } bool Csnake::UpdataGame() { ////初始化得分0 static int score=0; //获取用户按键信息 int choice; choice=GetDirections(); cout<<"Total score: "<<score<<endl; //随机产生食物所在坐标 int r,l; //开始初始已经吃食,产生一个食物 static bool eatFood=true; //如果吃了一个,才再出现第2个食物 if(eatFood) { do { //坐标范围限制在(1,1)到(line-2,row-2)对点矩型之间 srand(time(0)); r=(rand()%(row-2))+1; //横坐标 l=(rand()
%(line-2))+1;//竖坐标 //如果随机产生的坐标不是蛇身,则可行 //否则重新产生坐标 if(snakeMap[l][r]!='@') {snakeMap[l][r]='*';} }while (snakeMap[l][r]=='@'); } switch (choice) { case 1://向上 //如果蛇头和社颈的横坐标不相同,执行下面操作 if(firstSign.rSign!=secondSign.rSign)nextSign.setPoint (firstSign.rSign,firstSign.lSign-1); //否则,如下在原本方向上继续移动 else nextSign=firstSign+(firstSign-secondSign); break; case 2://向下 if(firstSign.rSign!=secondSign.rSign)nextSign.setPoint
(firstSign.rSign,firstSign.lSign+1); else nextSign=firstSign+(firstSign-secondSign); break; case 3://向左 if(firstSign.lSign!=secondSign.lSign)nextSign.setPoint (firstSign.rSign-1,firstSign.lSign); else nextSign=firstSign+(firstSign-secondSign); break; case 4://向右
if(firstSign.lSign!=secondSign.lSign)nextSign.setPoint (firstSign.rSign+1,firstSign.lSign); else nextSign=firstSign+(firstSign-secondSign); break; default: nextSign=firstSign+(firstSign-secondSign); } //if(getSymbol(nextSign)!='*' && !isDead(nextSign)) //如果没有碰到食物(且没有死亡的情况下),删除蛇尾,压入新的蛇头 { //删除蛇尾 lastSign=snakeBody.front(); snakeMap[lastSign.lSign][lastSign.rSign]=' '; snakeBody.pop(); //更新蛇头 secondSign=firstSign; //压入蛇头 snakeBody.push(nextSign); firstSign=snakeBody.back(); snakeMap[firstSign.lSign][firstSign.rSign]='@'; //没有吃食 eatFood=false; return true; } //吃食else if(getSymbol(nextSign)=='*' && !isDead(nextSign)) { secondSign=firstSign; snakeMap[nextSign.lSign][nextSign.rSign]='@'; //只压入蛇头 snakeBody.push(nextSign); firstSign=snakeBody.back(); eatFood=true; //加分信用卡咋用的
score+=20; return true; } //死亡else {cout<<"Dead"<<endl;cout<<"Your last total score is "<<score <<endl; return false;} } void Csnake::ShowGame() { for(int i=0;i
林妙可的胸部 六、程序运行结果
七、设计总结
经过这学期对《C程序设计》的学习,我们学习了理论知识,了解了C语言 程序设计的思想,这些知识都为我们的下一步学习打下了坚实的基础。通过课 程设计,一方面是为了检查我们一个学期来我们学习的成果,另一方面也是为 了让我们进一步的掌握和运用它,同时也让我们认清自己的不足之处和薄弱环 节,加以弥补和加强。 C语言,对我们学习软件技术的学生还是特别重要,他除了能便一些小型程 序之外,还能变一些大型的程序。计算机本身是无生命的机器,要是计算机能 够运行起来,为人类完成各种各样的工作,就必须让他执行相应的程序,这些 程序都是依靠程序设计语言编写出来的。在众多的程序设计语言中, C语言有独 特之处。它作为一种高级程序设计语言,具备方便性、灵活性和通用性等特 点。同时,他还向程序员提供了直接操作计算机硬件的功能,具备低级语言的 特点,适合各种类型的软件开发。因此C语言深受软件工程人员欢迎的程序设
计 语言。要想学好C语言首先要了解C语言的发展、特点等一些知识。 C语言的出现是与UNIX操作系统是联系在一起的,C语言本身也有一个发展 过程,目前仍然吃与发展和完善之中。从历史发展来看,C语言起源于1968年的 CPL,他的许多思想来自于Martin Richards 在1969年研制的BCPL为基础的由 Ken Thompson 在1970年研制的B语言,他用B语言写出了第一个UNIX 操作系 统,用在PDP-7计算机上。D.M.Ritchie 于1972年在B语言的基础上研制了C语 言,并用C语言写成了第一个在PDP-11计算机上实现的UNIX操作系统。1977年出 现了独立于计算机的C语
发布评论