《贪吃蛇游戏课程设计》报告

时间:2024.3.31

主函数是程序的主流程,首先定义使用到的常数、全局变量及函数原型说明,然后初始化图形系统,调用函数DrawK()画出开始画面,调用函数GamePlay(),即玩游戏的具体过程,游戏结束后调用Close()关闭图形系统,结束程序

void main()//主函数

{

Init();//图形驱动

DrawK();//开始画面

GamePlay();//玩游戏的具体过程

Close();//图形结束

}

void Init()//图形驱动

{

int gd=DETECT,gm;

initgraph(&gd,&gm," ");/*此处为turboc的路径,读者可以根据自己的电脑而改*/

cleardevice();

}

(3) 画界面函数DrawK( ) 

主界面是一个封闭的围墙,用两个循环语句分别在水平和垂直方向输出连续的宽度和高度均的矩形方块,表示围墙,为了醒目,设置为白色。

void DrawK()//开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙

{

    setbkcolor(GREEN);

    setcolor(LIGHTRED);

    setlinestyle(0,0,5);//设置线型

    for(i=50;i<=600;i+=10)//画围墙

    {

       rectangle(i,40,i+10,49);//上边

       rectangle(i,451,i+10,460);//下边

    }

    for(i=40;i<=450;i+=10)

    {

       rectangle(50,i,59,i+10);//左边

       rectangle(601,i,610,i+10);//右边

    }

}

(4)游戏具体过程函数GamePlay( ) 

这是游戏的主要组成部分,他采用将前一节的坐标赋给后一节,用背景颜色将最后节去除,当蛇头的坐标与食物的坐标相等时,表示食物被吃掉了。

void GamePlay()//玩游戏的具体过程

{

    rand();//随机数发生器

    food.yes=1;//1表示需要出现新食物,0表示已经存在食物

    snake.life=0;//蛇活着

    snake.direction=1;//方向往右

    snake.x[0]=100;snake.y[0]=100;//舌头坐标

    snake.x[1]=110;snake.y[1]=100 ;

    snake.node=2;//蛇的节数

    PrScore();//输出分数

    while(1)//可重复玩游戏,按ESC键结束

    {

       while(!kbhit())//在没有按键的情况下,蛇自己移动身体

       {

           if(food.yes==1)//需要出现新食物

           {

              food.x=rand()%400+60;

              food.y=rand()%350+60;

              while(food.x%10!=0)//食物随即出现后必须让食物能够在整格内,这样才能让蛇迟到

                  food.x++;

              while(food.y%10!=0)

                  food.y++;

              food.yes=0;//画面上有食物了

           }

           if(food.yes==0)//画面上有食物就要显示

           {

              setcolor(GREEN);

              rectangle(food.x,food.y,food.x+10,food.y-10);

           }

           for(i=snake.node-1;i>0;i--)//蛇的每个环节往前移动,也就是贪吃蛇的关键算法

           {

              snake.x[i]=snake.x[i-1];

              snake.y[i]=snake.y[i-1];

           }

           switch(snake.direction)//1,2,3,4表示上下左右四个方向,通过这个判断来移动蛇头

           {

              case 1:

                  snake.x[0]+=10;break;

              case 2:

                  snake.x[0]-=10;break;

              case 3:

                  snake.y[0]-=10;break;

              case 4:

                  snake.y[0]+=10;break;

           }

           for(i=3;i<snake.node;i++)//从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来

           {

              if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])

              {

                  GameOver();//显示失败

                  snake.life=1;

                  break;

              }

           }

           if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||snake.y[0]>455)//蛇是否撞到墙壁

           {

              GameOver();//本次游戏结束

              snake.life=1;//蛇死

           }

           if(snake.life==1)//以上两种判断以后,如果蛇死就跳出内循环,重新开始

              break;

           if(snake.x[0]==food.x&&snake.y[0]==food.y)//吃到食物以后

           {

              setcolor(0);//把画面上的食物去掉

              rectangle(food.x,food.y,food.x+10,food.y-10);

              snake.x[snake.node]=-20;

              snake.y[snake.node]=-20;//新的一节先放在看不见得位置,下次循环就取前一节的位置

              snake.node++;//蛇的身体长一节

              food.yes=1;

              score+=10;

              PrScore();//输出新的得分

           }

           setcolor(WHITE);//画出蛇

           for(i=0;i<snake.node;i++)

              rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10);

           Sleep(gamespeed);

           setcolor(0);//用黑色去除蛇的最后一节

           rectangle(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);

       }

       if(snake.life==1)//如果蛇死就跳出循环

           break;

       key=getchar();//接受案件

       if(key==Esc)//按ESC键退出

           break;

       else if(key==UP&&snake.direction!=4)

           snake.direction=3;

       else if(key==RIGHT&&snake.direction!=2)

           snake.direction=1;

       else if(key==LEFT&&snake.direction!=1)

           snake.direction=2;

       else if(key==DOWN&&snake.direction!=3)

           snake.direction=4;

    }//endwhile(1)

}

(5)游戏结束函数GameOver( ) 

游戏结束,清除屏幕,输出分数,显示游戏结束信息。

void GameOver()//游戏结束

{

    cleardevice();

    PrScore();

    setcolor(RED);

    outtextxy(100,100,"我会回来的!!!!!");

    getch();

}

void PrScore()//输出成绩

{

    char str[10];

    setfillstyle(SOLID_FILL,YELLOW);

    bar(50,15,220,35);

    setcolor(6);

    sprintf(str,"score:%d",score);

    outtextxy(55,20,str);

}

void Close()//图形结束

{

    getch();

    closegraph();

}

五、调试及解决方法

可以按照程序运行的错误提示对原程序进行修改,在调试过程中有时也会遇到不懂的问题,我去图书馆或上网查阅一些资料或者是向老师请教也解决了对源程序一一修改直到运行成功。

六、测试结果

七、设计心得体会

在设计这个程序中我主要学会了如何运用以下有关C语言和C++的知识

1) 函数定义是要做到顾名思义是很重要的,它对读程序的人正确认识程序  

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

加了程序的可读性。

2) 分析函数先从main()函数入手。Main()函数是C++源程序编译时的开始,    

从main()函数开始读函数可将其他函数的功能理解得更透彻。

3) 在做程序的时候先列框架,将这个程序所要达到的目的(功能)分析出 

来,选择正确的数据结构然后在将程序模块化,按照模块编写函数更加简单合理。

4) 我还了解了很多的库函数的作用,如字符串函数中有很多对字符串进行

处理的函数,起功能我都有所了解。

5)学会了有关头文件的使用方法,及系统调配问题的解决方法等。

   6)了解到了注释的重要性。

八、附录

1、参考文献:

谭浩强,《C++程序设计》            清华大学出版社

郭翠英,《C语言课程设计案例精编》,中国水利水电出版社,2004.3

李丽娟,《C语言程序设计教程》        人民邮电出版社

林华聪,《C语言程序设计思想与实践》  冶金工业出版社

2、源代码


#define M 200

#include"graphics.h"

#include<stdlib.h>

#include<stdio.h>

#include<string.h>

#include<iostream.h>

#include<dos.h>

#include<conio.h>

#include <windows.h>

#define LEFT 97//A

#define RIGHT 100//D

#define DOWN 115//S

#define UP 119//W

#define Esc 0x011b

int i,key;

int score=0;

int gamespeed=250;//游戏速度可根据实际情况自行调整

struct Food

{

    int x;//食物的横坐标

    int y;//食物的纵坐标

    int yes;//判断是否要出现食物的变量

}food;//食物的结构体

struct Snake

{

    int x[M];

    int y[M];

    int node;//蛇的节数

    int direction;//蛇的移动方向

    int life;//蛇的生命,0表示活着,1表示死亡

}snake;

void Init();//图形驱动

void Close();//图形结束

void DrawK();//开始画面

void GamePlay();//玩游戏的具体过程

void GameOver();//游戏结束

void PrScore();//输出成绩

void main()//主函数

{

    Init();//图形驱动

    DrawK();//开始画面

    GamePlay();//玩游戏的具体过程

    Close();//图形结束

}

void Init()//图形驱动

{

    int gd=DETECT,gm;

    initgraph(&gd,&gm," ");/*此处为turboc的路径,读者可以根据自己的电脑而改*/

    cleardevice();

}

void DrawK()//开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙

{

    setbkcolor(GREEN);

    setcolor(LIGHTRED);

    setlinestyle(0,0,5);//设置线型

    for(i=50;i<=600;i+=10)//画围墙

    {

        rectangle(i,40,i+10,49);//上边

        rectangle(i,451,i+10,460);//下边

    }

    for(i=40;i<=450;i+=10)

    {

        rectangle(50,i,59,i+10);//左边

        rectangle(601,i,610,i+10);//右边

    }

}

void GamePlay()//玩游戏的具体过程

{

    rand();//随机数发生器

    food.yes=1;//1表示需要出现新食物,0表示已经存在食物

    snake.life=0;//蛇活着

    snake.direction=1;//方向往右

    snake.x[0]=100;snake.y[0]=100;//舌头坐标

    snake.x[1]=110;snake.y[1]=100 ;

    snake.node=2;//蛇的节数

    PrScore();//输出分数

    while(1)//可重复玩游戏,按ESC键结束

    {

        while(!kbhit())//在没有按键的情况下,蛇自己移动身体

        {

            if(food.yes==1)//需要出现新食物

            {

                food.x=rand()%400+60;

                food.y=rand()%350+60;

                while(food.x%10!=0)//食物随即出现后必须让食物能够在整格内,这样才能让蛇迟到

                    food.x++;

                while(food.y%10!=0)

                    food.y++;

                food.yes=0;//画面上有食物了

            }

            if(food.yes==0)//画面上有食物就要显示

            {

                setcolor(GREEN);

                rectangle(food.x,food.y,food.x+10,food.y-10);

            }

            for(i=snake.node-1;i>0;i--)//蛇的每个环节往前移动,也就是贪吃蛇的关键算法

            {

                snake.x[i]=snake.x[i-1];

                snake.y[i]=snake.y[i-1];

            }

            switch(snake.direction)//1,2,3,4表示上下左右四个方向,通过这个判断来移动蛇头

            {

                case 1:

                    snake.x[0]+=10;break;

                case 2:

                    snake.x[0]-=10;break;

                case 3:

                    snake.y[0]-=10;break;

                case 4:

                    snake.y[0]+=10;break;

            }

            for(i=3;i<snake.node;i++)//从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来

            {

                if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])

                {

                    GameOver();//显示失败

                    snake.life=1;

                    break;

                }

            }

            if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||snake.y[0]>455)//蛇是否撞到墙壁

            {

                GameOver();//本次游戏结束

                snake.life=1;//蛇死

            }

            if(snake.life==1)//以上两种判断以后,如果蛇死就跳出内循环,重新开始

                break;

            if(snake.x[0]==food.x&&snake.y[0]==food.y)//吃到食物以后

            {

                setcolor(0);//把画面上的食物去掉

                rectangle(food.x,food.y,food.x+10,food.y-10);

                snake.x[snake.node]=-20;

                snake.y[snake.node]=-20;//新的一节先放在看不见得位置,下次循环就取前一节的位置

                snake.node++;//蛇的身体长一节

                food.yes=1;

                score+=10;

                PrScore();//输出新的得分

            }

            setcolor(WHITE);//画出蛇

            for(i=0;i<snake.node;i++)

                rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10);

            Sleep(gamespeed);

            setcolor(0);//用黑色去除蛇的最后一节

            rectangle(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);

        }

        if(snake.life==1)//如果蛇死就跳出循环

            break;

        key=getchar();//接受案件

        if(key==Esc)//按ESC键退出

            break;

        else if(key==UP&&snake.direction!=4)

            snake.direction=3;

        else if(key==RIGHT&&snake.direction!=2)

            snake.direction=1;

        else if(key==LEFT&&snake.direction!=1)

            snake.direction=2;

        else if(key==DOWN&&snake.direction!=3)

            snake.direction=4;

    }//endwhile(1)

}

void GameOver()//游戏结束

{

    cleardevice();

    PrScore();

    setcolor(RED);

    outtextxy(100,100,"我会回来的!!!!!");

    getch();

}

void PrScore()//输出成绩

{

    char str[10];

    setfillstyle(SOLID_FILL,YELLOW);

    bar(50,15,220,35);

    setcolor(6);

    sprintf(str,"score:%d",score);

    outtextxy(55,20,str);

}

void Close()//图形结束

{

    getch();

    closegraph();

}

更多相关推荐:
C课程设计报告—贪吃蛇

程序设计基础课程设计院系班级姓名指导教师20xx年12月25日第1页共49页贪吃蛇程序设计基础课程设计任务书一题目贪吃蛇二设计要求1XXX负责设计与实现2查阅相关资料自学具体课题中涉及到的新知识3采用结构化模块...

贪吃蛇课程设计报告

目录1课程设计目的32课程设计任务与要求321课程设计内容322课程设计要求323课程设计环境33课程设计方案331方案论证332程序整体设计说明333设计思路434设计总体流程图435设计的具体实现54程序测...

基于MFC的贪吃蛇程序设计(课程设计) 报告

MFC应用程序设计课程设计报告题目学院专业班级姓名学号指导教师评阅成绩二0年月日1目录概述3123456789设计目的3功能描述3大体思想3程序框图4主要知识点5重要的MFC5数据结构6主要函数7代码实现710...

JAVA贪吃蛇课程设计报告

Java应用开发课程设计报告题目指导老师姓名专业班级日期JAVA小游戏贪吃蛇目录一系统总体设计1一设计目标及完成功能1二系统结构设计1二详细设计2一界面设计2二系统设计4三关键技术及算法6四测试7五安装使用说明...

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

C语言课程设计报告C语言课程设计报告贪吃蛇专业学生姓名班学级号完成日期C语言课程设计报告一游戏规则需求1在打开程序后出现选择界面里面包含难度选择其中难度选择能够使程序出现相应的游戏难度2开始游戏后WASD键控制...

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

山东工商学院信电学院自动111班第一组贪吃蛇课程设计报告高级语言程序设计课程设计报告ExperimentDesigningreporter课程名称高级语言程序设计英文名称CProgramExperimentDe...

贪吃蛇课程设计报告 2

基于VCNET的贪吃蛇游戏的目录1实验目的2实验任务与要求21实验内容22实验要求23实验环境3设计方案31程序功能32设计思想33设计总体流程图34设计的具体实现4程序测试41测试内容与结果42程序运行效果图...

贪吃蛇游戏程序设计实验报告

Windows编程大作业贪吃蛇设计与实现学校武汉轻工大学院系班级姓名学号20xx年12月16日目录一题目介绍二设计目的三详细设计31贪吃蛇本体设计32贪吃蛇食物设计33游戏界面设计331游戏初始化332游戏开始...

MFC课程设计报告-贪食蛇游戏

MFC应用开发技术贪食蛇小游戏学院人民武装学院专业计算机科学与技术班级11学号1120xx0521学生姓名王兴德指导教师黄顺强摘要本设计实现了一个简单的贪食蛇小游戏该游戏不仅实现了简单的游戏操作功能还实现了灵活...

C课程设计论文报告贪吃蛇游戏

目录第1章课程设计的目的与要求.11.1课程设计目的.11.2课程设计的实验环境.11.3课程设计的预备知识.11.4课程设计要求.1第2章课程设计内容.22.1程序功能介绍.22.2程序整体设计说明.22.2…

贪吃蛇游戏课程设计(C语言).模版

湖南文理学院课程设计报告课程名称计算机软件技术基础学院专业班级通信08101姓名吴春香学号20xx16020xx0指导教师曹玲玲完成时间20xx年12月27日报告成绩目录一程序功能3二设计目的3三程序设计331...

贪吃蛇游戏课程设计(C语言)

湖南文理学院课程设计报告课程名称计算机软件技术基础学院专业班级通信08101姓名吴春香学号20xx16020xx0指导教师曹玲玲完成时间20xx年12月27日报告成绩目录一程序功能3二设计目的3三程序设计331...

贪吃蛇课程设计报告(22篇)