实训报告实训题目:贪吃蛇游戏程序设计院系:计算机科学与工程学院专业:网络工程班级:网络工程131学号:090213128姓名:指导教师:肖微实训地点:九章楼N6-101开课时间:2013 至2014学年第 2 学期常熟理工学院计算机科学与工程学院制学生姓名周豪实训报告成绩评语:指导教师(签名)年月日说明:指导教师评分后,实训报告交院办公室保存。
目录1实训的目的和任务 (5)实训的目的: (5)实训的任务: (6)2.开发环境(软件开发环境和硬件开发环境) (6)3.界面设计 (6)3.1设计思路 (6)3.2实现原理 (7)4.算法设计 (9)5.程序流程 (30)6.总结 (31)1实训的目的和任务实训的目的:1.巩固和加深对C语言课程基本知识的理解和掌握2.掌握C语言编程和程序调试的基本技能3.利用C语言进行基本的程序设计4.掌握书写程序设计说明文档的能力5.提高运用C语言解决实际问题的能力6. 进一步理解和运用结构化程设计的思想和方法7.独立完成一个游戏的设计应用实训的任务:1.分析实训题目要求2.了解实训要求内容3.掌握实训要求代码4.编写程序代码,调试程序使其能正确运行5.设计完成的软件要便于操作和使用6.完成课程设计报告,并进行答辩2.开发环境(软件开发环境和硬件开发环境)1、一台能正常运行的计算机电脑2、Windows XP3、Microsoft Visual Studio20104、Microsoft Word20103.界面设计3.1设计思路:大家在运行这个游戏的时候,开始界面能够出现一只蛇,这样的图案比较符合游戏的内容。
首先是蛇图形的绘画,我们可以运用搜狗输入法轻松的绘出蛇的大致图像,但是值得大家注意的是搜狗直接生成的图形,在里面出现了“\”的符号,是Visual Studio不能识别的字符,应该改成“\\”,否则程序不能运行。
除此之外,一个简单的游戏介绍也是必不可少的,使用QQ拼音输入法中的符号工具栏,再加上自己制定的游戏规则,可以生成各种我们需要的游戏简介画面。
3.2实现原理:printf("---------------------------欢迎进入贪吃蛇游戏----------------------");std::cout<<" /^\\/^\\" << endl;std::cout<<" _|0_| 0|" <<endl;std::cout<<"\/ /~ \_/ \\"<<endl;std::cout<<"\____|__________/ \\"<<endl;std::cout<<" \_______ \\"<<endl;std::cout<<" `\\ \\ \\"<<endl;std::cout<<" | | \\"<<endl;std::cout<<" / / \\"<<endl; std::cout<<" / / \\"<<endl; std::cout<<" / / \\ \\"<<endl; std::cout<<" / / \\ \\"<<endl; std::cout<<" / / _----_ \\ \\"<<endl; std::cout<<" / / _-~ ~-_ | |"<<endl; std::cout<<" ( ( _-~ _--_ ~-_ _/ |"<<endl; std::cout<<" \ ~-____-~ _-~ ~-_ ~-_-~ /"<<endl; std::cout<<" ~-_ _-~ ~-_ _-~"<<endl; std::cout<<" ~--______-~ ~-___-~"<<endl; 通过“std::cout”(向终端屏幕输出)可以将找到的蛇图形显示在屏幕上。
显示结果printf(" ---------------------游戏简介--------------------- \n");printf(" ╔════════════════════════╗\n"); printf(" ║通过上下左右四个方向键可以控制贪吃蛇║\n"); printf(" ╠════════════════════════╣\n"); printf(" ║每吃掉一个虫子得分就会增加100分║\n"); printf(" ╠════════════════════════╣\n"); printf(" ║当吃的虫子多余5个时虫子的速度会增加哦║\n"); printf(" ╠════════════════════════╣\n"); printf(" ║游戏开始之前需要自己选择一下等级哦,还请量力而为║\n"); printf(" ╚════════════════════════╝\n"); printf(" 请输入您要挑战的游戏等级,1——5级,速度逐渐减慢,切记!\n"); printf(" 对了忘了说了,按回车键游戏才能开始\n"); printf(" 现在输入要选的等级吧");显示结果先在Word中设计好需要显示的内容,然后利用printf()将其输出显示在屏幕上。
不过在使用std::cout时一定要注意,std是标准库的命名空间名,cout,endl都在其中。
头文件如果是#include<iostream>下面就要这样写,或者加上using namespace std;头文件如果是#include<iostream.h>下面不用4.算法设计#include<stdio.h>#include "stdafx.h"#include <Windows.h>#include "iostream"#include"conio.h"#include<time.h>#include <stdlib.h>#define uint unsigned int上面的许多文件名都是第一次见到,但是在此编程中却是必不可少的,缺一个程序都没法顺利执行。
enum{ARROW_UP=72,ARROW_DOWN=80,ARROW_LEFT=75,ARROW_R};枚举类型,分别标出上下左右四个方向键所对应的数值,这些数值都是固定的。
typedef enum{ORIENTATION_UP,ORIENTATION_DOWN,ORIENTATION_LEFT,ORI ENTATION_RIGHT}Orientation;struct PT{int x;//横坐标int y;//纵坐标};结构体定义一个坐标。
struct Body{PT now;Body *last;Body *next;};结构体定义蛇的一节身体,为创建链表做准备。
{Orientation dir;Body *head;Body *tail;uint bodylong;};HANDLE hStdout=GetStdHandle(STD_OUTPUT_HANDLE); using namespace std;const int X=10;const int Y=5;/*pianyiliang*/const int WIDTH=60;const int HEIGHT=25;const char BRICK='H';const char snk='O';int cnt=0;int delaytime;int k;int score=0;PT foodpt;Snake snake;定义一些即将使用的全局变量,根据以前学到的知识,当全局变量在某一函数中被使用的时候,即使不返回函数值,全局变量也会改变。
因为这部分定义的结构体比较多,所以特别容易弄混,在使用的时候,花费好长时间才熟练的掌握。
void hidecursor(){CONSOLE_CURSOR_INFO cursor_info;cursor_info.bVisible =false;cursor_info.dwSize =30;SetConsoleCursorInfo(hStdout,&cursor_info);}以上代码的运行,可以隐藏运行结果界面的光标,这是我们学习c语言以来,第一次碰到类似的代码,有趣的是,其中的cursor_info.dwSize =30;改变数字不影响运行结果,起初我以为这行代码是多余的,但是将它删除之后,程序运行便出现了错误,后来我上网查了一下才知道,这行代码的作用是改变光标的大小,因为光标被隐藏,所以改变数字不会影响最终结果,然而值得注意的是,这行代码一定不能够省略。
void paintsnake(){//贪吃蛇图形}void prepare(){//游戏简介}void print_char(int x ,int y ,char ch){COORD c;c.X=x;c.Y=y;SetConsoleCursorPosition(hStdout,c);putchar(ch);}上面代码中COORD表示的是坐标,“X”和“Y”分别表示的是横坐标和纵坐标,规定好这两个后就可以很好的确定所打印的代码的位置。
通过改变x,y,以及ch就可以实现在任意位置打印任意字符的功能。
void draw_wall(){for(int i=0;i<HEIGHT;i++)for(int j=0;j<WIDTH;j++){if((i==0)||(i==HEIGHT-1)||(j==0)||(j==WIDTH-1))/*坐标从0开始的所以高和宽都要减1*/print_char(X+j,Y+i,BRICK);//通过改变全局变量BEICK可以改变墙的砖块形状}}}在这里,老师教我们通过循环可以在规定的范围内画出一道围墙,原来我自己的想法是通过printf和“\n”来画出自己所需要的墙,但是这种方法比较繁琐。