C语言贪吃蛇实验报告

更新时间:2023-08-31 16:42:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

C语言贪吃蛇实验报告 实训 课题研究

C语言程序设计实训报告

姓 名 专 业 班 级 指导教师

2011 年 7 月 14 日

C语言贪吃蛇实验报告 实训 课题研究

目录

1 实训的目的和要求 ............................................. 1 1.1 实训的目的 ................................................ 1 1.2 实训的要求 ................................................ 1

2 实训任务内容 ................................................. 2 2.1 实训的题目: .............................................. 2 2.2 题目的要求: .............................................. 2 2.3 设计的步骤: .............................................. 2

3 详细设计说明 ................................................. 2 3.1 课程设计的要求: .......................................... 2 3.2 程序的功能: .............................................. 3 3.3 课程设计的思想: .......................................... 3 3.4 设计程序中的调试过程 ...................................... 3 3.5 设计的流程图 .............................................. 3 3.6 程序的总体设计思想 ........................................ 6

4 软件的使用说明 ............................................... 6 4.1 建立游戏的过程说明 ........................................ 6 4.2 执行游戏的过程说明 ........................................ 6

5 实训心得与体会 ............................................... 6

参考文献 ........................................................... 8 附录 部分程序清单 .............................................. 9

C语言贪吃蛇实验报告 实训 课题研究

1 实训的目的和要求

1.1 实训的目的

C程序设计实训是在学完C程序设计课程之后的实践教学环节。其目的是进一步加深、巩固学生所学《C程序设计》的基本理论知识,理论联系实际,进一步培养学生综合分析问题和解决问题的能力。掌握运用C语言独立地编写、调试应用程序和进行其它相关设计的技能,充分发挥广大同学的潜力,使他们通过本次实训得到全面的锻炼。本实训的目的和任务:

巩固和加深学生对C语言课程的基本知识的理解和掌握 掌握C语言编程和程序调试的基本技能 利用C语言进行基本的软件设计 掌握书写程序设计说明文档的能力 提高运用C语言解决实际问题的能力

进一步掌握和利用C语言进行程设计的能力; 进一步理解和运用结构化程设计的思想和方法; 初步掌握开发一个小型实用系统的基本方法; 学会调试一个较长程序的基本方法; 学会利用流程图或N-S图表示算法;

1.2 实训的要求

分析实训题目的要求 写出详细设计说明

编写程序代码,调试程序使其能正确运行 设计完成的软件要便于操作和使用 设计完成后提交实训报告

C语言贪吃蛇实验报告 实训 课题研究

2 实训任务内容 2.1 实训的题目:

设计贪吃蛇小游戏

2.2 题目的要求:

玩家通过键盘控制蛇在地图上寻找食物,蛇吃下食物,可以加分,碰到四壁游戏结束。

2.3 设计的步骤:

分析实训题目的要求,即需求分析。

总体设计,确定所需模块及模块间调用关系,定义系统中使用的数据类型。 详细设计,确定每个模块的功能,绘制主要函数的流程图。

编写程序代码,调试程序使其能正确运行。要求书写规范,注意采用缩进格式。函数

名、变量名要见文晓意,注释要简而不失、详而不缀。设计完成的软件要便于操作和使用。

程序测试,发现程序中存在的错误并改正。

完成实训报告。

3 详细设计说明

3.1 课程设计的要求:

通过游戏程序设计,提高编程兴趣与编程思路,巩固C语言中所学的知识,合理的运用资料,实现理论与实际相结合。

收集资料,分析课题,分解问题,形成总体设计思路;

对于设计中用到的关键函数,要学会通过查资料,弄懂其用法,要联系问题进行具

体介绍;

上机调试,查错,逐步分析不能正常运行的原因,确保所设计的程序正确,并且能

正常运行;

C语言贪吃蛇实验报告 实训 课题研究

完成课程设计报告。

3.2 程序的功能:

贪吃蛇游戏是一个经典小游戏,一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。

3.3 课程设计的思想:

程序关键在于表示蛇的图形及蛇的移动。用一个小圆点来表示蛇的一节身体,身体每长一节,增加一个圆点,蛇头用四节来表示。移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,如果按与蛇运动方向相反的方向键,此游戏就会暂停,再按想前的方向键才能继续游戏,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新蛇的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现与消失也是画一个圆点和覆盖原来的圆点。为了便于理解,定义两个结构体:食物与蛇。

3.4 设计程序中的调试过程

在调试过程中,遇到了很多的问题,比如,因为使用的刷屏函数,所以屏幕经常出现闪烁的情况,但是通过我和我的伙伴们的共同努力和学习,通过网上和书籍的查阅,我们也得到了很多的收获,我们的小组也在中真正的学会了很多的东西,这次实训给我们带来了很大的收获。可以按照程序运行的错误提示对原程序进行修改,在调试过程中有时也会遇到不懂的问题,我去图书馆或上网查阅一些资料或者是向老师请教也解决了对源程序一一修改直到运行成功。

3.5 设计的流程图

总程序设计图如图1所示:

C语言贪吃蛇实验报告 实训 课题研究

图1 程序设计流程图

方向键控制的设计流程图如图2所示:其中upmove函数控制蛇向上运动,downmove函

C语言贪吃蛇实验报告 实训 课题研究

图2 方向键控制方向键控制的设计流程图

蛇吃食物蛇身变长的设计流程图如图3所示:

图3

C语言贪吃蛇实验报告 实训 课题研究

3.6 程序的总体设计思想

利用人工绘图法,制作美观的游戏界面.

通过随机函数产生随机数,控制游戏过程食物的出现. 定义键盘操作,控制游戏过程蛇的移动方向.

画出边界,并判断游戏是否结束.

统计游戏过程蛇吃的食物数量,计算并输出游戏成绩.

4 软件的使用说明

4.1 建立游戏的过程说明

先打开 Microssft Visual C++ 程序,进入Microssft Visual C++ 程序后打开文件菜单,点机新键命令按钮,先建立一个Win32 Console Application工程,建立工程时可填写工程名称和你所建工成要存放的位置,点机确定按钮,再点机一个空工程类型的控制台程序,再点机完成,然后点机确定按钮,此时一个所要建立的工程就已经建立好,然后再点机文件中的新建按钮,然后再建立一个C++ Source File 文件,并填写文件名称,然后点机确定按钮,此时所要建立的工程和文件都已建立完毕,此时您就可以把贪吃蛇游戏的代码复制粘贴到你刚刚建立的工程和文件里面了,然后点机组建命令中的编译和组建命令,最后点机执行命令就可进入贪吃蛇游戏中了。

4.2 执行游戏的过程说明

进入贪吃蛇游行中后,首先弹出一个界面,上面出现的是欢迎词和游戏的简单说明,可点机任意键开始游戏,此游戏是由键盘的四个方向键进行控制的,吃一个点,蛇身就长长一端,总分数就加10分,如果碰壁或结尾游戏则结束,最后出先一个界面,上面显示你此次游戏的总分数。希望我这个小游戏能让你玩的开心。

5 实训心得与体会

在设计这个程序中我主要学会了如何运用以下有关C语言和C++的知识: 1) 函数定义是要做到顾名思义是很重要的,它对读程序的人正确认识程序

C语言贪吃蛇实验报告 实训 课题研究

十分重要,在修改这个程序的过程中也能很快找到程序各模块的作用,大大增 加了程序的可读性。

2) 分析函数先从main()函数入手。Main()函数是C++源程序编译时的开始, 从main()函数开始读函数可将其他函数的功能理解得更透彻。

3) 在做程序的时候先列框架,将这个程序所要达到的目的(功能)分析出 来,选择正确的数据结构然后在将程序模块化,按照模块编写函数更加简单合理。

4) 我还了解了很多的库函数的作用,如字符串函数中有很多对字符串进行 处理的函数,起功能我都有所了解。

5)学会了有关头文件的使用方法,及系统调配问题的解决方法等。 6)了解到了注释的重要性。

C语言贪吃蛇实验报告 实训 课题研究

参考文献

[1] 陈显刚.C语言程序设计[M]. 北京: 北京理工大学出版社,2007. [2] 谭浩强.C语言程序设计[M]. 北京: 清华大学出版社,1998. [3] 徐新华.C语言程序设计教程[M]. 北京: 中国水利水电出版社,2001. [4] 伍一,等.C语言程序设计与实训教程[M]. 北京: 清华大学出版社,2007. [5] 徐翠霞.C语言程序设计案例教程[M]. 北京: 北京大学出版社,2008. [6] 刘新航.软件工程与项目管理案例教程[M]. 北京: 北京大学出版社,2009.

C语言贪吃蛇实验报告 实训 课题研究

附录 部分程序清单

#include<stdio.h> #include<stdlib.h> #include<conio.h> #include<time.h> #include<windows.h> #define HEAD 300 #define FOOD 400

#define v_sleep 100/*改变sleep的大小可改变蛇的运动速度,此数值越小蛇的运动速度越快*/ int score=0; /*定义了一个全局变量来在整个程序中统计总成绩*/ /*----------------欢迎词-------------------*/ void welc() {

printf("\n\n\n\n\n\n\t\t\t欢迎来到【贪吃蛇】小游戏\n\n"); printf("\t\t\t蛇身加长一段就加10分\n\n");

printf("\t\t此游戏用键盘的方向键控制即可。若想退出请按Esc建。\n"); printf("\n\t\t\t相反的方向的话是暂停。\n"); printf("\n\t\t\t请按任意键进入游戏。"); getch(); }

/*--------------------------------------------*/ /*------------人工画图程序--------------------*/

void drawpt(int a,int x,int y) /*利用人工绘图程序来画出蛇运动的范围*/ {

if(x==0) {

printf("\t\t"); return ; }

if(y==0)

{ printf("\t\t\t"); return ; }

if(x==16) {

printf("\n"); return ; }

if(y==16)

C语言贪吃蛇实验报告 实训 课题研究

{

printf("\t"); }

if(x>0&&x<16&&y>0&&y<16) {

if(a==0)

printf("○");/*用空心圆来表蛇改运动的总范围*/

else printf("●");/*用实心圆来蛇的长度和食物的出现地点*/ return ; } }

void draw(int (*sna)[17]) {

int i,j; system("cls"); /*刷屏工具*/ for(i=0;i<17;i++) /*区域范围的大小*/ {

for(j=0;j<17;j++) {

drawpt(sna[i][j],j,i); } }

printf ("\t\t\t总成绩为%d分",score); }

/*-----------------------------------------------*/

/*---------------取随机数,出现食物用------------*/

int randno() /*利用这个随机函数来控制食物的随机出现*/ {

srand(time(NULL));

return rand()%15+1;/*随机函数出现食物时的范围,防止食物出现在范围之外*/ }

/*-----------------------------------------------*/

/*----------判断游戏是否结束---------------------*/ bool judgeGO(int (*sna)[17]) {

int x,y,i=0,max=0,count=0; for(x=0,y=0;y<17;y++)

if(sna[x][y]==HEAD)/*判断头部是否在最外层的*/ return false; for(x=16,y=0;y<17;y++) if(sna[x][y]==HEAD) return false;

C语言贪吃蛇实验报告 实训 课题研究

for(y=0,x=0;x<17;x++) if(sna[x][y]==HEAD) return false; for(y=16,x=0;x<17;x++) if(sna[x][y]==HEAD) return false; for(x=0;x<16;x++) {

for(y=0;y<16;y++) {

if(max<sna[x][y])

if(sna[x][y]!=HEAD&&sna[x][y]!=FOOD)

max=sna[x][y];/*这个也是求头部之后的*/ } }

for(i=0;i<max;i++) {

for(x=1;x<16;x++) {

for(y=1;y<16;y++) {

if(sna[x][y]==i+1)

count++;/*这个判断想了好久的*/ score=(count-3)*10;/*计算蛇的总成绩*/ } } }

if(count!=max)/*判断身体部分是否连续*/ return false; return true; }

/*--------------------------------------------------*/ /*-------------游戏结束显示-------------------------*/ void gameover() {

system("cls");

printf("\n\n\n\n\n\n\n\n"); printf("\t\t\t\t");

printf("游戏结束\n\n"); printf("\t\t\t\t"); printf ("此次总成绩为%d分\n\n",score); printf("\t\t\t\t"); printf ("请您再接再厉\n\n"); printf("\t\t\t");

printf("按Esc键退出,按任意键重新开始。\n"); }

C语言贪吃蛇实验报告 实训 课题研究

/*-------------------------------------------------*/

/*全程标记法,从尾巴开始123456....HEAD,食物是FOOD。*/ void marksn() {

void downmove(int (*sna)[17]);/*用键盘的方向键的下键来控制蛇向下运动*/ void upmove(int (*sna)[17]);/*用键盘的方向键的上键来控制蛇向上运动*/ void leftmove(int (*sna)[17]);/*用键盘的方向键的左键来控制蛇向左运动*/ void rightmove(int (*sna)[17]);/*用键盘的方向键的右键来控制蛇向右运动*/ int judgeF(int (*sna)[17],int keym); int snake[17][17]={0};

/*------各种东西初始化-------------------*/ int x=1,y=7,key,key1; snake[1][1]=1; snake[1][2]=2; snake[1][3]=3; snake[2][3]=HEAD; while(snake[x][y]!=0) {

x=randno(); y=randno(); }

snake[x][y]=FOOD; draw(snake);

/*---------------------------------------*/ /*--------控制的部分---------------------*/ while(judgeGO(snake)) {

key=getch(); switch(key){ case 72:

while(!kbhit()&&key1!=80&&judgeGO(snake))/*这个函数kbhit()自己查一下吧~控制输入很好*/ {

if(judgeF(snake,key)) {

draw(snake);

Sleep(v_sleep);/*Sleep函数在着是个延迟函数,也可在呈现头改变v_sleep的大小来控制蛇的运动速度*/

continue; }

upmove(snake);/*用键盘的方向键的上键来控制蛇向上运动*/ draw(snake);

key1=key;/*这里的key1是就来标记上一步的方向,这样相反的方向就暂停了*/

Sleep(v_sleep);/*Sleep函数在着是个延迟函数,也可在呈现头改变v_sleep的大小来控制蛇的运动速度*/ }

C语言贪吃蛇实验报告 实训 课题研究

break; case 80:

while(!kbhit()&&key1!=72&&judgeGO(snake)) {

if(judgeF(snake,key)) {

draw(snake);

Sleep(v_sleep);/*Sleep函数在着是个延迟函数,也可在呈现头改变v_sleep的大小来控制蛇的运动速度*/

continue; }

downmove(snake);/*用键盘的方向键的下键来控制蛇向下运动*/ draw(snake); key1=key;

Sleep(v_sleep);/*Sleep函数在着是个延迟函数,也可在呈现头改变v_sleep的大小来控制蛇的运动速度*/ }

break; case 75:

while(!kbhit()&&key1!=77&&judgeGO(snake)) {

if(judgeF(snake,key)) {

draw(snake);

Sleep(v_sleep);/*Sleep函数在着是个延迟函数,也可在呈现头改变v_sleep的大小来控制蛇的运动速度*/

continue; }

leftmove(snake);/*用键盘的方向键的左键来控制蛇向左运动*/ draw(snake);

key1=key;

Sleep(v_sleep);/*Sleep函数在着是个延迟函数,也可在呈现头改变v_sleep的大小来控制蛇的运动速度*/ }

break; case 77:

while(!kbhit()&&key1!=75&&judgeGO(snake)) {

if(judgeF(snake,key)) {

draw(snake);

Sleep(v_sleep);/*Sleep函数在着是个延迟函数,也可在呈现头改变v_sleep的大小来控制蛇的运动速度*/

continue; }

rightmove(snake);/*用键盘的方向键的右键来控制蛇向右运动*/

C语言贪吃蛇实验报告 实训 课题研究

draw(snake);

key1=key;

Sleep(v_sleep);/*Sleep函数在着是个延迟函数,也可在呈现头改变v_sleep的大小来控制蛇的运动速度*/ }

break; case 27: exit(0); default:

switch(key1){ case 72:

while(!kbhit()&&judgeGO(snake)) {

upmove(snake);/*上键函数控制蛇向上运动*/ draw(snake); }

break; case 80:

while(!kbhit()&&judgeGO(snake)) {

downmove(snake);/*下键函数控制蛇向下运动*/ draw(snake); }

break; case 75:

while(!kbhit()&&judgeGO(snake)) {

leftmove(snake);/*左键函数控制蛇向左运动*/ draw(snake); }

break; case 77:

while(!kbhit()&&judgeGO(snake) ) {

rightmove(snake);/*右键函数控制蛇蛇向右运动*/ draw(snake); }

break; } } }

/*---------------------------------------------------*/ /*------------是否继续游戏---------------------------*/ gameover();/*判断游戏是否继续的函数*/ if(getch()==27) exit(0);

C语言贪吃蛇实验报告 实训 课题研究

else {

marksn(); getch(); }

/*---------------------------------------------------*/ }

/*-------------------------------------------------*/

/*-----------上下左右移动神马的--------------------*/

void downmove(int (*sna)[17])/*控制蛇向下运动的函数*/ {

int x=0,y=0,mark=0; for(x=0;x<16;x++) {

for(y=0;y<16;y++) {

if(sna[x][y]!=0&&sna[x][y]!=HEAD&&sna[x][y]!=FOOD) {

sna[x][y]=sna[x][y]-1;//前面已经说了,12345....标记法,减去1的话,除了头部以外其他的就移动了。 } } }

for(x=0;x<16;x++) {

for(y=0;y<16;y++) {

if(mark<sna[x][y])

if(sna[x][y]!=HEAD&&sna[x][y]!=FOOD)

mark=sna[x][y];//这个是求头部之后的值。 } }

for(x=0;x<16;x++) {

for(y=0;y<16;y++) {

if(sna[x][y]==HEAD) {

sna[x+1][y]=HEAD;//头部的移动, sna[x][y]=mark+1;//头部的赋值。 return; } } } }

void upmove(int (*sna)[17])/*控制蛇向上运动的函数*/

C语言贪吃蛇实验报告 实训 课题研究

{

int x=0,y=0,mark=0; for(x=0;x<16;x++) {

for(y=0;y<16;y++) {

if(sna[x][y]!=0&&sna[x][y]!=HEAD&&sna[x][y]!=FOOD) {

sna[x][y]=sna[x][y]-1; } } }

for(x=0;x<16;x++) {

for(y=0;y<16;y++) {

if(mark<sna[x][y])

if(sna[x][y]!=HEAD&&sna[x][y]!=FOOD) mark=sna[x][y]; } }

for(x=0;x<16;x++) {

for(y=0;y<16;y++) {

if(sna[x][y]==HEAD) {

sna[x-1][y]=HEAD; sna[x][y]=mark+1; return; } } } }

void leftmove(int (*sna)[17])/*控制蛇向左运动的函数*/ {

int x=0,y=0,mark=0; for(x=0;x<16;x++) {

for(y=0;y<16;y++) {

if(sna[x][y]!=0&&sna[x][y]!=HEAD&&sna[x][y]!=FOOD) {

sna[x][y]=sna[x][y]-1; } }

C语言贪吃蛇实验报告 实训 课题研究

}

for(x=0;x<16;x++) {

for(y=0;y<16;y++) {

if(mark<sna[x][y])

if(sna[x][y]!=HEAD&&sna[x][y]!=FOOD) mark=sna[x][y]; } }

for(x=0;x<16;x++) {

for(y=0;y<16;y++) {

if(sna[x][y]==HEAD) {

sna[x][y-1]=HEAD; sna[x][y]=mark+1; return; } } } }

void rightmove(int (*sna)[17])/*控制蛇向右运动的函数*/ {

int x=0,y=0,mark=0; for(x=0;x<16;x++) {

for(y=0;y<16;y++) {

if(sna[x][y]!=0&&sna[x][y]!=HEAD&&sna[x][y]!=FOOD) {

sna[x][y]=sna[x][y]-1; } } }

for(x=0;x<16;x++) {

for(y=0;y<16;y++) {

if(mark<sna[x][y])

if(sna[x][y]!=HEAD&&sna[x][y]!=FOOD) mark=sna[x][y]; } }

本文来源:https://www.bwwdw.com/article/ptxi.html

Top