C++贪吃蛇说明_第1页
C++贪吃蛇说明_第2页
C++贪吃蛇说明_第3页
C++贪吃蛇说明_第4页
C++贪吃蛇说明_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C语言课程设计陈说之迟辟智美创作 题目:贪吃蛇 指导教师:许盟 院系:电气信息工程学院 班级:01 姓名:齐英帅 学号:15目录1、课程设计目的:1 .进一步掌握和利用 C语言进行行程设计的能力;2 .进一步理解和运用结构化法式设计的思想和方法;3 .初步掌握开发一个小型实用系统的基本方法;4 .学会调试一个较长法式的基本方法;5 .学会利用流程图暗示算法;6 .掌握书写法式设计开发文档的能力(书写课程设计陈说).2、课程设计具体要求:贪吃蛇是一种风靡全球的小游戏,就是一条小蛇,不竭地在屏幕上游走,吃各个方向呈现的蛋,越吃越长.只要蛇头碰到屏幕四周,或者碰到自己的身子,小蛇就立即毙命.和另外游

2、戏分歧,贪食蛇是一个喜剧性的游戏.许多电子游戏都是买通关究竟,游戏把持者以胜 利而告终.而贪食蛇的结局却是死亡.贪食蛇工要命的就在一个 贪字上.所以,有时候真的需要及时收手,不要逼人太甚.如果没有余地,就算你的手再快,面临的结局也是崩盘.3、法式功能:1 .每吃到一个普通食物,蛇的身体增长一节,玩家的分数加1.同时,蛇移动的速度也会随之加快 .2 .可以选择 FAST NOMAL SLOW 三个速度品级3 .可以选择单人游戏或者双人游戏,选择双人游戏时,按方向 键控制Playerl,按 W A S D控制Player2.首先撞死的蛇为败者.4 .每吃失落3个普通食物,将发生一个奖励食物,如果吃

3、失落 奖励食物,玩家的分数加 1,可是蛇的身体不增长.5 .每吃失落3个普通食物,同时将发生一个障碍,如果吃失落 奖励食物,障碍也将随之消失.另外,每次发生的障碍形状分歧 .6 .如果在难度品级对应的时间内没有吃失落奖励食物,食物消 失,障碍也会消失.7 .按空格键可以控制暂停与开始,按 ESC键退由游戏.8 .游戏有排行榜功能,当得分不为0时,玩家的姓名将被记录到排行榜中;进行双人游戏时,胜利玩家的姓名将被记录到排行榜中.9 .游戏开始以及蛇吃到食物,蛇死亡时,都有分歧的音效10 .兼容性:代码年夜概 620行,在 WINDOWS7&&VC+6.0 环境 下编译通过.生成的E

4、XE游戏文件在 WINDOWS 7 | | WINDOW XP 环 境下都能运行.4、设计思路:1 .法式总体结构贪吃蛇的关键算法为:先调用画图函数画由舆图以及蛇的身体, 将蛇的每一步移动当做一次循环来处置,判断是否吃到食物或者撞到0障碍等问题,如果撞到障碍,则游戏结束;如果不撞到障碍,则进行下一次循环.其主流程如图 2所示 .图 2 贪吃蛇的流程图2界面设计贪吃蛇的界面如图 3 所示,具体设计如下:( 1 )舆图布景采纳黑色,蛇的可移动范围为绿色方框部份,舆图边框为蓝色图形部份.( 2)舆图左右两边用绿色字体,调用 newscore(int i) 函数分别输出两个玩家的得分情况.( 3)两条

5、蛇分别用分歧颜色输出 .普通食物以紫色星星输出;奖励食物以白色星星输出,障碍以红色图形输出 .( 5)当游戏结束时,在舆图下方输出胜利者以及排行榜信息 .3重要数据的数据结构设计贪吃蛇的主体法式为蛇的移动,主要用到了循环算法 . 由于 TC 中的 gotoxy(int x, int y) 函数到 VC 或者其它编译器中用不了了,这样一来如果想在控制台法式中进行简单的屏幕输出控制就欠好办了 .所以为了实现在 VC+6.0 中颜色字体的输出以及清屏,光标位置控制等功能,必需在头文件中包括”“”jkey32.h ”等文件 .利用上述同文件中的接口函数,便能够在 WIN32 控制台法式中实现TC 中才

6、华实现的屏幕控制以及键盘控制等功能.另外,在设计游戏排行榜的过程中,运用了 C 文件调用以及重新保管技术.5、函数清单:贪吃蛇 V1.00 法式采纳了结构化法式设计的思想,由 8 个 h 文件, 1个.cpp文件,2个普通文件,2个.a静态库文件和4个.wav组成.其中包括 11 个自编函数,函数名及功能如下:/*注:由于游戏功能强年夜,以下函数仅为主要函数,一些用于控制细节的函数,如 Playsound() 等将不予以一一列出,详见源代码*/1 .Char menu();/* 用于输入玩家选择的游戏速度,返回一个char 值*/2 .Char menudouble();/* 用于输入玩家选择

7、的游戏人数,返回一个chare 值*/3 .DELAY(char ch1);/* 用于控制游戏速度*/4 .Void main();/*主函数,用于控制游戏*/5 .void drawmap();/*绘制游戏舆图函数*6 .void drawfood(char ch);/*绘制普通食物函数*/7 .void snake_move();/*蛇的移动函数*/8 .void drawsnake(int i);/*绘制蛇身函数*/9 .void newscore(int i);/*更新玩家得分函数*/10 .void drawrw_food(char ch);/*绘制奖励食物函数*/11 .void

8、drawstone(char ch);/*绘制障碍函数*/贪 吃 蛇 包 括 的 文 件 有 : common.h , pcc32.h , jkey32.h , , , finalsnake.cpp ,片头.wav ,超级马里奥兄弟死失落音 .wav ,食物 .wav ,奖励食物 .wav.源代码如下:#include <stdio.h>#include<stdlib.h>#include<time.h>#include<stdlib.h>#include<string.h>#include "pcc32.h"#i

9、nclude "mmsystem.h"#include "jkey32.h"#pragma comment(lib, "winmm.lib")#pragma comment(lib,"libpcc32.a")#pragma comment(lib,"libjkey32.a")#define DIR_UP 1# define DIR_DOWN 2# define DIR_LEFT 3# define DIR_RIGHT 4void drawmap();void drawfood(char ch);

10、void snake_move();void drawsnake(int i);void newscore(int i);void drawrw_food(char ch);void drawstone(char ch);struct point / 结构体坐标int x;int y;snake280,food,rw_food,stone4;struct rank / 排行榜char name20;int point;player80;clock_t begin_time,end_time;int count=0; / 记录吃失落普通食物的次数int num=0;int gamespeed=5

11、0;int nofood=1;int nopause=0;int norw_food=1;int rwtime;int snake_dir2=DIR_RIGHT,DIR_RIGHT;int snake_life2=1,1;int snake_len2=3,3; / 蛇的初始节数都为 3int hx2,hy2;/ 蛇头坐标int score2=0,0;/ 得分为零char menu()char ch1;setTextColor(2);gotoTextPos(24/2,16/2);片头 .wav",NULL,SND_ASYNC|SND_NODEFAULT );/SND_ASYNC 用异步

12、方式播放声音,PlaySound 函数在开始播放后立即返回.SND_NODEFAULT 不播放缺省声音,若无此标识表记标帜,则 PlaySound 在没找到声音时会播放缺省声音 .printf("ttPlease choose the gamespeed:n");printf("ttt1-Fast 2-Normal 3-Slown");printf("ntttPlease Press The numbers.n");do/ 确保输入的为规定情况之一ch1=getch();while(ch1!='1'&&

13、ch1!='2'&&ch1!='3');printf("tttYou have choosed the speed %c!",ch1);printf("nntttPress Anykey to continue!");if(jkGetKey()system("cls");/ 清空屏幕 #include <stdlib.h>return(ch1); / 返回一个选择的速度char menudouble()char ch2;setTextColor(6);gotoTextPos(

14、24/2,16/2);片头 .wav",NULL, SND_ASYNC|SND_NODEFAULT );printf("ttPlease choose the game mode:n");printf("ttt1-1 playern");printf("ttt2-2 playersn");printf("ntttPlease Press The numbers.n");doch2=getch();while(ch2!='1'&&ch2!='2');print

15、f("tttYou have choosed the mode %c!",ch2);printf("nntttPress Anykey to start!");if(jkGetKey()system("cls");return(ch2);void DELAY(char ch1)if(ch1='1')delayMS(gamespeed);else if(ch1='2')delayMS(gamespeed);delayMS(gamespeed);elsedelayMS(gamespeed);delayMS(

16、gamespeed);delayMS(gamespeed);delayMS(gamespeed);void main()FILE *fp,*p1;char ch1;char ch2;int i,j,n,k;int temp_point;char temp_name20;printf(" 贪吃蛇 -By qiyingshuain");printf("zhuandian 09-01-15n");/ 题目setCursorVisible(0);setConsoleTitle(" 贪吃蛇 qiyingshuain");ch1=menu();c

17、h2=menudouble();drawmap();switch(ch1)case '1':rwtime=2500;break;case '2':rwtime=3000;break;case '3':rwtime=3500;break;for(i=0;i<(ch2-48);i+)newscore(i);for(i=0;i<(ch2-48);i+)/ 画出蛇的最初形态setTextColor(15);gotoTextPos(30, 5+i*9);printf(" ");gotoTextPos(30+2, 5+i*9)

18、;setTextColor(3+i*2);printf(" ");setTextColor(4+i*2);gotoTextPos(30+4, 5+i*9);printf(" ");for(i=0;i<(ch2-48);i+) / 定位蛇每节身体的初始坐标for(j=0;j<snake_leni;j+)snakeij.x=34-j*2;snakeij.y=5+i*9;hxi=snakei0.x; / 蛇头初始坐标hyi=snakei0.y;while(snake_life0&&snake_life1) / 开始游戏if(nopa

19、use)DELAY(ch1); / 赋予游戏速度delayMS(80-snake_len0*2); / 游戏速度随蛇长度的增加而加快if(nofood)drawfood(ch2); / 发生食物if(norw_food=1&&count=3) / 每吃失落 3 个普通食物发生一个奖励 食物 ,并发生障碍drawrw_food(ch2);drawstone(ch2);begin_time=clock();end_time=begin_time+rwtime;snake_move();if(end_time<=clock()&&norw_food=0) / 在

20、难度品级对应的时间内 没有吃失落奖励食物,食物消失gotoTextPos(rw_food.x, rw_food.y);setTextColor(2);printf(" ");for(i=0;i<4;i+)gotoTextPos(stonei.x,stonei.y);printf(" ");for(j=0;j<4;j+) / 石头坐标清零.stonej.x=0;stonej.y=0;rw_food.x=0; / 奖励食物坐标清零rw_food.y=0;begin_time=0;end_time=0;norw_food=1;for(i=0;i&l

21、t;(ch2-48);i+)drawsnake(i);if(snake_life1=0&&snake_life0=0)goto d;for(i=0;i<(ch2-48);i+) / 如果有其中一只蛇死亡,结束游戏if(snake_lifei=0)goto c;if(jkHasKey()switch(jkGetKey()case JK_SPACE:nopause=!nopause;break;case JK_ESC:snake_life1=0;snake_life0=0;score0=0;score1=0;goto d;break;default:break;超级马里奥兄弟

22、 死失落音 .wav",NULL,SND_ASYNC|SND_NODEFAULT );d:setTextColor(14);gotoTextPos(25,20);if(ch2='1')printf("Game over!");else if(ch2='2')if(snake_life0=0&&snake_life1!=0)printf("player 2 win!");else if(snake_life1=0&&snake_life0!=0)printf("player

23、 1 win!");elseprintf("Game over!/n");getch();if(score0!=0|score1!=0) / 当有其中一个玩家的分数不为零,记录排行榜if(fp=fopen("player_rank","rb")=NULL) / 翻开排行榜文件printf("file open error");exit(0);if(p1=fopen("num","rb")=NULL) / 翻开排行榜玩家数量文件printf("file op

24、en error");exit(0);n=fgetc(p1); / 调用排行榜玩家数到内存,赋值给 nfor(j=0;j<n;j+) / 调用排行榜玩家信息到内存fread(&playerj,sizeof(struct rank),1,fp);fclose(fp);fclose(p1);printf("Please intput the name of player:");scanf("%s",);if(ch2='1')playern.point=score0;else/双人游戏时,分数高的

25、玩家姓名被记录到排行榜if(score0>=score1)playern.point=score0;elseplayern.point=score1;n+; / 排行榜记录加 1for(i=0;i<n-1;i+) / 依照得分进行从年夜到小排序k=i;for(j=i+1;j<n;j+)if(playerj.point>playerk.point)k=j;temp_point=playerk.point;playerk.point=playeri.point;playeri.point=temp_point;strcpy(temp_name,);s

26、trcpy(,);strcpy( ,temp_name);gotoTextPos(25,21);printf("player's name score");printf("n");for(i=0;i<n;i+)/ 输出排行榜gotoTextPos(25,21+i+1);printf("%-15s%4dn",,playeri.point);if(fp=fopen("player_rank","wb&

27、quot;)=NULL) / 翻开排行榜文件printf("file open error");exit(0);if(p1=fopen("num","wb")=NULL) / 翻开排行榜玩家数量文件printf("file open error");exit(0);for(j=0;j<n;j+)/ 将排行榜玩家信息重新写入文件fwrite(&playerj,sizeof(struct rank),1,fp);fputc(n,p1);fclose(fp);fclose(p1);getch();void

28、drawmap()int j,i;setTextColor(2);for(i=0;i<16;i+)gotoTextPos(16, 3+i);for(j=0;j<24;j+)printf(" ");setTextColor(9);for(j=0;j<26;j+)/ 输出上边gotoTextPos(14+j*2, 2);printf(" "); O gotoTextPos(14, 2+i);printf("")。for(i=0;i<18;i+)/ 输出右边gotoTextPos(14+25*2, 2+i);prin

29、tf("")。for(j=0;j<26;j+)/ 输出下边gotoTextPos(14+j*2, 2+17);printf(" "); Ovoid snake_move()if(jkHasKey()switch(jkGetKey()case JK_UP:if(snake_dir0!=DIR_DOWN)snake_dir0=DIR_UP;break;case 'w':if (snake_dir1!=DIR_DOWN) snake_dir1=DIR_UP;break;case JK_DOWN:if (snake_dir0!=DIR_UP

30、)snake_dir0=DIR_DOWN;break;case 's':if (snake_dir1!=DIR_UP)snake_dir1=DIR_DOWN;break;case JK_LEFT:if (snake_dir0!=DIR_RIGHT) snake_dir0=DIR_LEFT;break;case 'a':if (snake_dir1!=DIR_RIGHT)snake_dir1=DIR_LEFT;break;case JK_RIGHT:if (snake_dir0!=DIR_LEFT) snake_dir0=DIR_RIGHT;case 'd

31、':snake_dir1=DIR_RIGHT;break;case JK_SPACE:nopause=!nopause;break;caseJK_ESC:snake_life1=0;snake_life0=0;score0=0;score1=0;break;void drawsnake(int i)int j,k=1;switch(snake_diri)case DIR_UP: hyi-;break;case DIR_DOWN: hyi+;break;case DIR_LEFT:hxi=hxi-2;break;case DIR_RIGHT:hxi=hxi+2;break;if(hxi>=64|hxi<=14|hyi>=19|hyi<=2) / 判断蛇是否撞墙snake_lifei=0,k=0;for(j=0;j<4;j+)/ 蛇是否撞到障碍if(hxi=stonej.x&&

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论