贪吃蛇设计程序(字符版)
贪吃蛇游戏单片机程序
贪吃蛇游戏单片机程序贪吃蛇游戏是一款经典的游戏,其简洁的规则和有趣的玩法使其成为了许多人喜爱的游戏之一。
在单片机中实现贪吃蛇游戏需要利用单片机的输入输出功能以及控制算法来完成游戏的控制和显示。
下面是一个简单的贪吃蛇游戏单片机程序的实现。
首先,我们需要定义一些常量和变量来表示游戏中的一些参数和状态。
比如,我们可以定义一个常量来表示屏幕的宽度和高度,以及一个变量来表示蛇的长度和当前的移动方向。
c#define SCREEN_WIDTH 16#define SCREEN_HEIGHT 8#define SNAKE_MAX_LENGTH 64int snake_length;int snake_direction;接着,我们需要定义一个数据结构来表示蛇的身体,可以使用一个数组来表示蛇的每一节身体的位置。
同时,我们还需要定义一个数据结构来表示食物的位置。
cstruct point {int x;int y;};struct point snake[SNAKE_MAX_LENGTH];struct point food;然后,我们可以编写一个函数来初始化游戏的状态。
在这个函数中,我们需要初始化蛇的位置和长度,以及随机生成食物的位置。
void init_game{// 初始化蛇的位置和长度snake[0].x = SCREEN_WIDTH / 2;snake[0].y = SCREEN_HEIGHT / 2;snake_length = 1;// 随机生成食物的位置food.x = rand% SCREEN_WIDTH;food.y = rand% SCREEN_HEIGHT;}接下来,我们需要编写一个函数来处理用户输入,并更新蛇的移动方向。
这个函数可以通过读取按键的状态来实现,比如可以通过一个变量来记录当前的按键状态。
cvoid handle_input{// 读取按键状态int key = read_key// 根据按键状态更新蛇的移动方向if (key == 'W' && snake_direction != 'S') {snake_direction = 'W';} else if (key == 'S' && snake_direction != 'W') {snake_direction = 'S';} else if (key == 'A' && snake_direction != 'D') {snake_direction = 'A';} else if (key == 'D' && snake_direction != 'A') {snake_direction = 'D';}然后,我们可以编写一个函数来更新蛇的位置。
超简单贪吃蛇c语言代码编写
超简单贪吃蛇c语言代码编写贪吃蛇其实就是实现以下几步——1:蛇的运动(通过“画头擦尾”来达到蛇移动的视觉效果)2:生成食物3:蛇吃食物(实现“画头不擦尾”)4:游戏结束判断(也就是蛇除了食物,其余东西都不能碰)#include<stdio.h>#include<stdlib.h>#include<windows.h>#include<conio.h>#include<time.h>#define width 60#define hight 25#define SNAKESIZE 200//蛇身的最长长度int key=72;//初始化蛇的运动方向,向上int changeflag=1;//用来标识是否生成食物,1表示蛇还没吃到食物,0表示吃到食物int speed=0;//时间延迟struct {int len;//用来记录蛇身每个方块的坐标int x[SNAKESIZE];int y[SNAKESIZE];int speed;}snake;struct{int x;int y;}food;void gotoxy(int x,int y)//调用Windows的API函数,可以在控制台的指定位置直接操作,这里可暂时不用深究{COORD coord;coord.X = x;coord.Y = y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); }//■○void drawmap(){//打印图框for (int _y = 0; _y < hight; _y++){for (int x = 0; x < width; x+=2){if (x == 0 || _y == 0 || _y == hight - 1 || x == width - 2){gotoxy(x, _y);printf("■");}}}//打印蛇头snake.len=3;snake.x[0]=width/2;snake.y[0]=hight/2;gotoxy(snake.x[0],snake.y[0]);printf("■");//打印蛇身for(int i=1;i<snake.len;i++){snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1]+1;gotoxy(snake.x[i],snake.y[i]);printf("■");}//初始化食物的位置food.x=20;food.y=20;gotoxy(food.x,food.y);printf("○");}/**控制台按键所代表的数字*“↑”:72*“↓”:80*“←”:75*“→”:77*/void snake_move()//按键处理函数{int history_key=key;if (_kbhit()){fflush(stdin);key = _getch();key = _getch();}if(changeflag==1)//还没吃到食物,把尾巴擦掉{gotoxy(snake.x[snake.len-1],snake.y[snake.len-1]);printf(" ");}for(int i=snake.len-1;i>0;i--){snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1];}if(history_key==72&&key==80)key=72;if(history_key==80&&key==72)key=80;if(history_key==75&&key==77)key=75;if(history_key==77&&key==75)key=77;switch(key){case 72:snake.y[0]--;break;case 75:snake.x[0]-= 2;break;case 77:snake.x[0]+= 2;break;case 80:snake.y[0]++;break;}gotoxy(snake.x[0],snake.y[0]);printf("■");gotoxy(0,0);changeflag=1;}void creatfood(){if(snake.x[0] == food.x && snake.y[0] == food.y)//只有蛇吃到食物,才能生成新食物{changeflag=0;snake.len++;if(speed<=100)speed+=10;while(1){srand((unsigned int) time(NULL));food.x=rand()%(width-6)+2;//限定食物的x范围不超出围墙,但不能保证food.x 为偶数food.y=rand()%(hight-2)+1;for(int i=0;i<snake.len;i++){if(food.x==snake.x[i]&&food.y==snake.y[i])//如果产生的食物与蛇身重合则退出break;}if(food.x%2==0)break;//符合要求,退出循环}gotoxy(food.x,food.y);printf("○");}}bool Gameover(){//碰到围墙,OVERif(snake.x[0]==0||snake.x[0]==width-2)return false;if(snake.y[0]==0||snake.y[0]==hight-1) return false;//蛇身达到最长,被迫OVERif(snake.len==SNAKESIZE)return false;//头碰到蛇身,OVERfor(int i=1;i<snake.len;i++){if(snake.x[0]==snake.x[i]&&snake.y[0]==snake.y[i])return false;}return true;}int main(){system("mode con cols=60 lines=27");drawmap();while(Gameover()){snake_move();creatfood();Sleep(350-speed);//蛇的移动速度}return 0;}。
c语言课程设计贪吃蛇设计
Part Three
C语言基础知识
数据类型和变量
基本数据类型:int、float、char、double等 复合数据类型:数组、结构体、指针等 变量声明:使用关键字"int"、"float"等声明变量 变量赋值:使用"="为变量赋值 变量作用域:局部变量、全局变量等 变量生命周期:从声明到释放的过程
结构体和联合体:包括结构 体定义、结构体初始化、结 构体访问、联合体定义、联 合体初始化、联合体访问等
函数和数组
函数:C语言中的基本单元,用于实现特定功能
数组:C语言中的基本数据类型,用于存储一组相同类型 的数据
数组函数:如strlen()、strcpy()等,用于操作字符串
指针:C语言中的重要概念,用于指向内存地址
Part Four
贪吃蛇游戏设计
游戏逻辑设计
游戏结束:当蛇碰到边界或 自己时结束
游戏循环:不断更新蛇的位 置和方向
游戏开始:初始化蛇的位置 和方向
得分计算:根据吃到的食物 数量计算得分
游戏难度:根据得分调整游 戏难度,如增加蛇的速度或
改变食物的位置
游戏界面:设计游戏界面, 包括蛇、食物、边界等元素
Part Seven
总结和展望
课程设计收获和体会
掌握了C语言的基本语法和编 程技巧
学会了如何设计并实现一个完 整的游戏项目
提高了解决问题的能力和团队 协作能力
对游戏开发有了更深入的了解 和兴趣
C语言在游戏开发中的应用前景
游戏开发中,C语言具有高效、稳定的特点,适合开发大型游戏。 C语言具有广泛的应用领域,可以开发各种类型的游戏,如动作、冒险、策略等。 C语言具有强大的社区支持,可以找到大量的游戏开发资源和教程。 C语言在游戏开发中具有广泛的应用前景,可以开发出更多优秀的游戏作品。
贪吃蛇程序文档
1.需求分析1.1问题的描述本程序主要是一个交互式的游戏程序,通过玩家的键盘上下左右键控制贪吃蛇的运动方向。
程序会根据您按下的键判断贪吃蛇走向。
这个程序的关键是表示蛇的图形以及蛇的移动。
用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块。
移动时必须从蛇头开始,所以蛇不能向相反方向移动,也就是蛇尾不能改作蛇头。
如果不按任何键,蛇自行在当前方向上前移,当游戏者按了有效的方向键后,蛇头朝着指定的方向移动,一步移动一节身体,所以当按了有效的方向键后,先确定蛇头的位置,然后蛇身体随着蛇头移动,图形的实现是从蛇头的新位置开始画出蛇,这时由于没有清屏的原因,原来蛇的位置和新蛇的位置差一个单位,所以看起来社会多一节身体,所以将蛇的最后一节用背景色覆盖。
食物的出现和消失也是画圆形和覆盖圆形。
1.2基本要求应用Visual C++的MFC进行可视化编程,完成一个贪吃蛇小程序。
程序包含snake.EXE可执行文件和所有的可编译程序源码;能够实行游戏的开始、结束、得分和计时;屏幕上能够显示游戏规则和游戏的注意事项。
2.概要设计2.1数据结构数据结构是指相互之间存在一定关系的数据元素的集合。
按照视点的不同,数据结构分为逻辑结构和存储结构。
数据的逻辑结构(logical structure)是指数据元素之间逻辑关系的整体。
所谓逻辑关系是指数据元素之间的关联方式或邻接关系。
根据数据元素之间逻辑关系的不同,数据结构分为四类:集合;线性结构;树结构;图结构。
数据的逻辑结构属于用户视图,是面向问题的,反映了数据内部的构成方式。
为了区别于数据的存储结构,常常将数据的逻辑结构称为数据结构。
数据的存储结构(storage structure)又称为物理结构,是数据及其逻辑结构在计算机中的表示,换言之,存储结构除了数据元素之外,必须隐式或显示地存储数据元素之间的逻辑关系。
通常有两种存储结构:顺序存储结构和链接存储结构[1]。
贪吃蛇程序中的重要代码如下:动态数组:CArray<CPoint,CPoint> m_aBody // 保存蛇身点类:CPoint m_pAim / /保存一个食物目标的坐标函数:void CSnakeView::IniAim() //随机函数生成食物的X 和Y坐标voidCSnakeView::IniGame()//改函数对游戏初始化定义游戏的初始状态void CSnakeView::ReDisplay(CPoint pPoint)//刷新游戏区域中pPoint处的一个小方格void CSnakeView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) //判断键盘按钮事件CView::OnTimer(nIDEvent) //计时器函数来重画屏幕程序的功能是实现对贪吃蛇游戏的开始,如下图所示2.3各模块之间的调用关系及算法设计用流程图示出程序的主要控制流程和处理流程,其图形如下:3 详细设计构思如下:首先,设计者考虑设计一个可以游动的蛇。
用C和SFML编程实现贪吃蛇小游戏
用C和SFML编程实现贪吃蛇小游戏贪吃蛇是一款经典的小游戏,它的目标是控制一条蛇,通过吃食物不断壮大身体长度,避免碰到自己的身体或者墙壁。
在本文中,我们将使用C语言和SFML库来实现这个有趣的小游戏。
1. 准备工作在开始编程之前,我们需要确保已经安装了C编译器和SFML库。
如果你还没有安装,可以通过官方网站下载并按照指导安装。
2. 创建游戏窗口首先,我们需要创建一个窗口来显示游戏界面。
我们可以使用SFML库提供的函数来实现。
```c#include <SFML/Graphics.h>int main() {int width = 800;int height = 600;sfVideoMode mode = {width, height, 32};sfRenderWindow* window = sfRenderWindow_create(mode, "Snake Game", sfClose, NULL);// 游戏主循环sfRenderWindow_destroy(window);return 0;}```在上述代码中,我们定义了窗口的宽度和高度,并通过`sfVideoMode`结构体创建了一个窗口。
然后,我们可以在游戏主循环中添加游戏逻辑。
3. 处理用户输入在游戏中,蛇的移动由玩家通过键盘控制。
我们需要检测玩家按下的键来确定蛇的移动方向。
```csfEvent event;while (sfRenderWindow_pollEvent(window, &event)) {if (event.type == sfEvtClosed) {sfRenderWindow_close(window);}if (event.type == sfEvtKeyPressed) {// 处理玩家输入}}```通过使用`sfRenderWindow_pollEvent`函数,我们可以实时检测用户的输入事件。
c语言贪吃蛇小游戏程序课程设计
void GameOver(); //游戏结束判断函数 void Pause(); //游戏暂停函数 void MyCount1(); //统计边栏,用来做提示 void MyCount2(); //统计边栏,用来做一些统计 void Menu( int ); //开始界面 void Inti_Data(); //初始化数据
3.主函数int main()
int main()
//主函数
{
START:
Inti_Data();
fixConsoleSize(18,15);
Hid_Cursor();
SurFace();
PlaySound(TEXT("m22.wav"), NULL, SND_FILENAME | SND_ASYNC );
2.函数定义和声明
(1)头文件 #include<iostream> #include<windows.h> #include<conio.h> #include<time.h> #include<stdlib.h> #include "mmsystem.h" #pragma comment (lib,"winmm.lib") #include"pcc32.h"
}
}
return 0;
}
4.界面函数Surface()
SurFace()是通过接受按键信息来调用Menu(); SurFace()中给出了四个菜单选项, 上下键实现对菜单的选择, ENTER键实现对菜单的进入; temp用于存放按键信息, keytemp用于记录当前菜单的位置, 实现了在第一个菜单选项按上方向键会走到最后一个菜单选项(keytemp+=4), 在最后一个菜单选项按下方向键会走到第一个菜单选项(keytemp%4)
Win-TC(C语言)贪吃蛇游戏程序设计
Win-TC (C语言)贪吃蛇游戏程序设计贪吃蛇游戏是大家熟悉的一个经典游戏,现在用Win-TC编译环境来实现游戏过程。
游戏功能如下:游戏开始后在屏幕出现一条自由活动的蛇,玩家可通过小键盘的方向功能键来控制蛇的运动方向,系统每间隔10秒钟随机投放一次食物(一颗食用果或毒果)。
蛇每吃到一颗食用果后其身体长度会自动增长一节,玩家得到5分的成绩奖励,当蛇吃到毒果或碰到四周边界和蛇头碰到蛇身的某一部位时,游戏结束。
(更新版本)图1、贪吃蛇游戏效果图游戏源程序清单如下:#include <graphics.h>#include <stdlib.h>#include <time.h>#include <bios.h>#include <dos.h>#include <stdio.h>#define MAXSIZE 1000 /*定义贪吃蛇最大长度*/#define LEFT 75 /*定义方向键左向键盘值*/#define RIGHT 77 /*定义方向键右向键盘值*/#define UP 72 /*定义方向键上向键盘值*/#define DOWN 80 /*定义方向键下向键盘值*/#define WINTOP 120 /*定义游戏区上边界y坐标值*/#define WINDOWN 360 /*定义游戏区下边界y坐标值*/#define WINLEFT 140 /*定义游戏区左边界x坐标值*/ #define WINRIGHT 500 /*定义游戏区右边界x坐标值*/char FILLC[]={0xfe,0x90,0x49,0xa0,0x30,0xc0,0x29,0xc0,0x46,0xa0,0xfe,0x90,0x49,0xa0,0x30,0xc0,0x21,0xc0,0x53,0x20,0x80,0x90,0x10,0x40}; /*恢复屏幕数据*/char RNULL[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; /*头部数据*//*top*/char headt[]={0x00,0x00,0x0f,0x00,0x1f,0x80,0x3f,0xc0,0x26,0x40,0x26,0x40,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x1f,0x80,0x1f,0x80};/*down*/char headd[]={0x1f,0x80,0x1f,0x80,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x26,0x40,0x26,0x40,0x3f,0xc0,0x1f,0x80,0x0f,0x00,0x00,0x00};/*right*/char headr[]={0x00,0x00,0x00,0x00,0x3f,0x80,0xfc,0xc0,0xfc,0xe0,0xff,0xe0,0xff,0xe0,0xfc,0xe0,0xfc,0xc0,0x3f,0x80,0x00,0x00,0x00,0x00};/*left*/char headl[]={0x00,0x00,0x00,0x00,0x1f,0xc0,0x33,0xf0,0x73,0xf0,0x7f,0xf0,0x7f,0xf0,0x73,0xf0,0x33,0xf0,0x1f,0xc0,0x00,0x00,0x00,0x00};/*身体数据*//*left down*/char leftd[]={0x1f,0x80,0x1f,0x80,0x1f,0xc0,0x1f,0xf0,0x1f,0xf0,0x0f,0xf0,0x0f,0xf0,0x07,0xf0,0x01,0xf0,0x00,0x00,0x00,0x00,0x00,0x00};/*right down*/char rightd[]={0x1f,0x80,0x1f,0x80,0x3f,0x80,0xff,0x80,0xff,0x80,0xff,0x00,0xff,0x00,0xfe,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; /*left top*/char leftt[]={0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xf0,0x07,0xf0,0x0f,0xf0,0x0f,0xf0,0x1f,0xf0,0x1f,0xf0,0x1f,0xc0,0x1f,0x80,0x1f,0x80};/*right top*/char rightt[]={0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0xfe,0x00,0xff,0x00,0xff,0x00,0xff,0x80,0xff,0x80,0x3f,0x80,0x1f,0x80,0x1f,0x80};/*top down*/char tp_dn[]={0x1f,0x80,0x1f,0x80,0x1f,0x80,0x1f,0x80,0x1f,0x80,0x1f,0x80,0x1f,0x80,0x1f,0x80,0x1f,0x80,0x1f,0x80,0x1f,0x80,0x1f,0x80}; /*left right*/char lf_rh[]={0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xf0,0xff,0xf0,0xff,0xf0,0xff,0xf0,0xff,0xf0,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00}; /*尾巴数据*//*down*/char re_dn[]={0x09,0x00,0x19,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x1f,0x80,0x1f,0x80,0x1f,0x80,0x1f,0x80,0x1f,0x80}; /*top*/char re_tp[]={0x1f,0x80,0x1f,0x80,0x1f,0x80,0x1f,0x80,0x1f,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x09,0x00}; /*right*/char re_rh[]={0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xf0,0xff,0xf0,0x01,0xf0,0x01,0xf0,0xff,0xf0,0x7f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00}; /*left*/char re_lf[]={0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xe0,0xff,0xf0,0xf8,0x00,0xf8,0x00,0xff,0xf0,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00}; /*食用果数据*/char sfood[]={0x00,0x00,0x0f,0x00,0x1f,0x80,0x3f,0xc0,0x7f,0xe0,0x7f,0xe0,0x7f,0xe0,0x7f,0xe0,0x3f,0xc0,0x1f,0x80,0x0f,0x00,0x00,0x00}; /*毒果数据*/char block[]={0x06,0x00,0x06,0x00,0x0f,0x00,0x0f,0x00,0x3f,0xc0,0x7f,0xe0,0x7f,0xe0,0x3f,0xc0,0x0f,0x00,0x0f,0x00,0x06,0x00,0x06,0x00}; /*定义贪吃蛇数据类型*/typedef struct TANCHISHE{int x;/*每节位置x分量*/int y;/*每节位置y分量*/int ns;/*每节蛇体(位图)状态标识*/int left; /*向左运动标识状态*/int right;/*向右运动标识状态*/int top;/*向上运动标识状态*/int down;/*向下运动标识状态*/}TANCHISHE;/*定义整条蛇的数据类型*/typedef struct{TANCHISHE Snakeh;/*头部数据*/TANCHISHE Snakeb[MAXSIZE];/*刷新蛇体数据*/TANCHISHE old_Snakeb[MAXSIZE];/*保存上一次蛇体数据*/TANCHISHE Snaket;/*尾巴数据*/int cx;/*恢复屏幕数据位置x分量*/int cy;/*恢复屏幕数据位置y分量*/int hx;/*头部位置x分量*/int hy;/*头部位置y分量*/int size;/*每节长度大小*/int front;/*队列头指针*/int rear;/*队列尾指针*/}TCsQueue;static char *TCShead[4]={headt,headd,headl,headr};static char *TCSbody[6]={leftt,leftd,rightt,rightd,lf_rh,tp_dn};static char *TCStail[4]={re_lf,re_rh,re_tp,re_dn};/*定义食物的数据类型*/typedef struct FOOD{int fx;/*食物x坐标位置分量*/int fy;/*食物y坐标位置分量*/int fns;/*食物种类标识符*/int fkey;/*游戏区是否有食物标识符*/int fnew_t;/*投放食物时间分量*/}FOOD;/*设置蛇头运动方向*/void SetSnakeHeadMove(int top,int down,int left,int right,TCsQueue *st) {st->Snakeh.top=top;st->Snakeh.down=down;st->Snakeh.left=left;st->Snakeh.right=right;}/*初始化蛇*/void init_TCs(TCsQueue *st){int nt,sx=320,sy=240,size=12;srand((unsigned) time(NULL));nt=rand()%4;st->front=-1;st->rear=0;st->Snakeh.x=sx;st->Snakeh.y=sy;st->Snakeh.ns=nt;SetSnakeHeadMove(0,0,0,0,st);st->size=size;st->Snakeb[st->rear].left=0;st->Snakeb[st->rear].right=0;st->Snakeb[st->rear].top=0;st->Snakeb[st->rear].down=0;switch(nt){case 0:st->hx=sx;st->hy=sy;st->Snakeh.top=1;st->Snakeb[st->rear].ns=5;st->Snakeb[st->rear].top=1;st->Snakeb[st->rear].x=st->Snakeh.x;st->Snakeb[st->rear].y=st->Snakeh.y+st->size; st->Snaket.ns=2;st->Snaket.x=st->Snakeb[st->rear].x;st->Snaket.y=st->Snakeb[st->rear].y+st->size; st->cx=st->Snaket.x;st->cy=st->Snaket.y+st->size;break;case 1:st->hx=sx;st->hy=sy+size;st->Snakeh.down=1;st->Snakeb[st->rear].ns=5;st->Snakeb[st->rear].down=1;st->Snakeb[st->rear].x=st->Snakeh.x;st->Snakeb[st->rear].y=st->Snakeh.y-st->size; st->Snaket.ns=3;st->Snaket.x=st->Snakeb[st->rear].x;st->Snaket.y=st->Snakeb[st->rear].y-st->size; st->cx=st->Snaket.x;st->cy=st->Snaket.y-st->size;break;case 2:st->hx=sx;st->hy=sy;st->Snakeh.left=1;st->Snakeb[st->rear].ns=4;st->Snakeb[st->rear].left=1;st->Snakeb[st->rear].x=st->Snakeh.x+st->size;st->Snakeb[st->rear].y=st->Snakeh.y;st->Snaket.ns=0;st->Snaket.x=st->Snakeb[st->rear].x+st->size;st->Snaket.y=st->Snakeb[st->rear].y;st->cx=st->Snaket.x+st->size;st->cy=st->Snaket.y;break;case 3:st->hx=sx+size;st->hy=sy;st->Snakeh.right=1;st->Snakeb[st->rear].ns=4;st->Snakeb[st->rear].right=1;st->Snakeb[st->rear].x=st->Snakeh.x-st->size;st->Snakeb[st->rear].y=st->Snakeh.y;st->Snaket.ns=1;st->Snaket.x=st->Snakeb[st->rear].x-st->size;st->Snaket.y=st->Snakeb[st->rear].y;st->cx=st->Snaket.x-st->size;st->cy=st->Snaket.y;break;}st->old_Snakeb[st->rear].ns=st->Snakeb[st->rear].ns;st->old_Snakeb[st->rear].x=st->Snakeb[st->rear].x;st->old_Snakeb[st->rear].y=st->Snakeb[st->rear].y;st->old_Snakeb[st->rear].left=st->Snakeb[st->rear].left;st->old_Snakeb[st->rear].right=st->Snakeb[st->rear].right;st->old_Snakeb[st->rear].top=st->Snakeb[st->rear].top;st->old_Snakeb[st->rear].down=st->Snakeb[st->rear].down; }/*获取键盘按键码*/int get_key(){union REGS rg;rg.h.ah=0;int86(0x16,&rg,&rg);return rg.h.ah;}/*绘制位图*/void DrawBit(int x,int y,char maske[]){int i,j,k,n=2,size=12;for(i=0;i<size;i++)for(j=0;j<n;j++)for(k=0;k<8;k++){if(j&&k>3)break;if(maske[i*n+j]&(0x80>>k)){if(FILLC[i*n+j]&(0x80>>k))putpixel(x+j*8+k,y+i,10);elseputpixel(x+j*8+k,y+i,2);}elseputpixel(x+j*8+k,y+i,0);}}/*绘制蛇体*/void DrawSnake(TCsQueue *st){int i;DrawBit(st->Snakeh.x,st->Snakeh.y,TCShead[st->Snakeh.ns]);for(st->front=0;st->front<=st->rear;st->front++)DrawBit(st->Snakeb[st->front].x,st->Snakeb[st->front].y,TCSbody[st->Snakeb[st->front].ns]);DrawBit(st->Snaket.x,st->Snaket.y,TCStail[st->Snaket.ns]);DrawBit(st->cx,st->cy,RNULL);st->front=-1;for(i=0;i<3;i++){delay(50000);}}/*刷新和保存蛇体运动轨迹数据*/void Set_Snake(int x,int y,int ns,int left,int right,int top,int down,TCsQueue *st){st->Snakeb[0].x=x;st->Snakeb[0].y=y;st->Snakeb[0].ns=ns;st->Snakeb[0].left=left;st->Snakeb[0].right=right;st->Snakeb[0].down=down;for(st->front=1;st->front<=st->rear;st->front++){st->Snakeb[st->front].ns=st->old_Snakeb[st->front-1].ns;st->Snakeb[st->front].x=st->old_Snakeb[st->front-1].x;st->Snakeb[st->front].y=st->old_Snakeb[st->front-1].y;st->Snakeb[st->front].left=st->old_Snakeb[st->front-1].left;st->Snakeb[st->front].right=st->old_Snakeb[st->front-1].right;st->Snakeb[st->front].top=st->old_Snakeb[st->front-1].top;st->Snakeb[st->front].down=st->old_Snakeb[st->front-1].down;}st->cx=st->Snaket.x;st->cy=st->Snaket.y;st->Snaket.x=st->old_Snakeb[st->rear].x;st->Snaket.y=st->old_Snakeb[st->rear].y;if(st->old_Snakeb[st->rear].left)st->Snaket.ns=0;if(st->old_Snakeb[st->rear].right)st->Snaket.ns=1;if(st->old_Snakeb[st->rear].top)st->Snaket.ns=2;if(st->old_Snakeb[st->rear].down)st->Snaket.ns=3;for(st->front=0;st->front<=st->rear;st->front++){st->old_Snakeb[st->front].ns=st->Snakeb[st->front].ns;st->old_Snakeb[st->front].x=st->Snakeb[st->front].x;st->old_Snakeb[st->front].y=st->Snakeb[st->front].y;st->old_Snakeb[st->front].left=st->Snakeb[st->front].left;st->old_Snakeb[st->front].right=st->Snakeb[st->front].right;st->old_Snakeb[st->front].top=st->Snakeb[st->front].top;st->old_Snakeb[st->front].down=st->Snakeb[st->front].down;}st->front=-1;DrawSnake(st);}/*描述蛇体运动轨迹*/void Move_Snake(TCsQueue *st){if(st->Snakeh.top){st->Snakeh.y-=st->size;st->hx=st->Snakeh.x;Set_Snake(st->Snakeh.x,st->Snakeh.y+st->size,5,0,0,1,0,st);}if(st->Snakeh.down){st->Snakeh.y+=st->size;st->hx=st->Snakeh.x;st->hy=st->Snakeh.y+st->size;Set_Snake(st->Snakeh.x,st->Snakeh.y-st->size,5,0,0,0,1,st);}if(st->Snakeh.left){st->Snakeh.x-=st->size;st->hx=st->Snakeh.x;st->hy=st->Snakeh.y;Set_Snake(st->Snakeh.x+st->size,st->Snakeh.y,4,1,0,0,0,st);}if(st->Snakeh.right){st->Snakeh.x+=st->size;st->hx=st->Snakeh.x+st->size;st->hy=st->Snakeh.y;Set_Snake(st->Snakeh.x-st->size,st->Snakeh.y,4,0,1,0,0,st);}}/*输出蛇长度和游戏成绩*/void OutData(TCsQueue *st){char tms[100];setfillstyle(1,8);bar(260,80,330,95);sprintf(tms," %d ",st->rear);outtextxy(265,80,tms);bar(400,80,470,95);sprintf(tms," %d ",st->rear*5);outtextxy(405,80,tms);}/*描述蛇体增长数据*/void InputSnakebody(TCsQueue *st){if(st->rear>MAXSIZE-1)/*判断队列是否有空位*/{Move_Snake(st);setcolor(15);settextstyle(1,0,2);outtextxy(270,240,"Game over!");outtextxy(235,255,"The snake too long!"); outtextxy(235,270,"Press a key to exit");getch();closegraph();exit(0);}else{Move_Snake(st);/*吃掉食物占居食物的位置*/ /*队尾指针后移初始化新蛇体(增长部分)数据尾巴数据连到正确位置*/st->rear++;st->Snakeb[st->rear].left=0;st->Snakeb[st->rear].right=0;st->Snakeb[st->rear].top=0;st->Snakeb[st->rear].down=0;st->Snakeb[st->rear].x=st->Snaket.x;st->Snakeb[st->rear].y=st->Snaket.y;if(st->Snaket.ns==0){st->Snakeb[st->rear].ns=4;st->Snakeb[st->rear].left=1;st->Snaket.x+=st->size;st->cx=st->Snaket.x+st->size;st->cy=st->Snaket.y;}if(st->Snaket.ns==1){st->Snakeb[st->rear].ns=4;st->Snakeb[st->rear].right=1;st->Snaket.x-=st->size;st->cx=st->Snaket.x-st->size;st->cy=st->Snaket.y;}if(st->Snaket.ns==2){st->Snakeb[st->rear].ns=5;st->Snakeb[st->rear].top=1;st->Snaket.y+=st->size;st->cx=st->Snaket.x;st->cy=st->Snaket.y+st->size;}if(st->Snaket.ns==3){st->Snakeb[st->rear].ns=5;st->Snakeb[st->rear].down=1;st->Snaket.y-=st->size;st->cx=st->Snaket.x;st->cy=st->Snaket.y-st->size;}st->old_Snakeb[st->rear].ns=st->Snakeb[st->rear].ns;st->old_Snakeb[st->rear].x=st->Snakeb[st->rear].x;st->old_Snakeb[st->rear].y=st->Snakeb[st->rear].y;st->old_Snakeb[st->rear].left=st->Snakeb[st->rear].left;st->old_Snakeb[st->rear].right=st->Snakeb[st->rear].right;st->old_Snakeb[st->rear].top=st->Snakeb[st->rear].top;st->old_Snakeb[st->rear].down=st->Snakeb[st->rear].down;}OutData(st);}/*根据条件重组蛇体运动轨迹数据*/void SnakeObject(TCsQueue *st,int key){switch(key){case LEFT:if(!st->Snakeh.left&&!st->Snakeh.right){st->Snakeh.ns=2;st->Snakeh.x-=st->size;st->hx=st->Snakeh.x;if(st->Snakeh.top)Set_Snake(st->Snakeh.x+st->size,st->Snakeh.y,2,1,0,0,0,st);if(st->Snakeh.down){st->hy-=st->size;Set_Snake(st->Snakeh.x+st->size,st->Snakeh.y,3,1,0,0,0,st);}SetSnakeHeadMove(0,0,1,0,st);}break;case RIGHT:if(!st->Snakeh.left&&!st->Snakeh.right){st->Snakeh.ns=3;st->Snakeh.x+=st->size;st->hx=st->Snakeh.x+st->size;if(st->Snakeh.top)Set_Snake(st->Snakeh.x-st->size,st->Snakeh.y,0,0,1,0,0,st); if(st->Snakeh.down){st->hy-=st->size;Set_Snake(st->Snakeh.x-st->size,st->Snakeh.y,1,0,1,0,0,st); }SetSnakeHeadMove(0,0,0,1,st);}break;case UP:if(!st->Snakeh.top&&!st->Snakeh.down){st->Snakeh.ns=0;st->Snakeh.y-=st->size;st->hy=st->Snakeh.y;if(st->Snakeh.left)Set_Snake(st->Snakeh.x,st->Snakeh.y+st->size,1,0,0,1,0,st); if(st->Snakeh.right){st->hx-=st->size;Set_Snake(st->Snakeh.x,st->Snakeh.y+st->size,3,0,0,1,0,st); }SetSnakeHeadMove(1,0,0,0,st);}break;case DOWN:if(!st->Snakeh.top&&!st->Snakeh.down){st->Snakeh.ns=1;st->Snakeh.y+=st->size;st->hy=st->Snakeh.y+st->size;if(st->Snakeh.left)Set_Snake(st->Snakeh.x,st->Snakeh.y-st->size,0,0,0,0,1,st); if(st->Snakeh.right){st->hx-=st->size;Set_Snake(st->Snakeh.x,st->Snakeh.y-st->size,2,0,0,0,1,st); }SetSnakeHeadMove(0,1,0,0,st);}break;}}/*判断蛇是否触到边界或触到身体和触到毒果如果是结束游戏退出*/int GameOver(TCsQueue *st,FOOD *ft){int qt=0;if(st->hx<WINLEFT||st->hx==WINRIGHT)qt=1;if(st->hy<WINTOP||st->hy==WINDOWN)qt=1;for(st->front=0;st->front<=st->rear;st->front++){if(st->Snakeh.top){if(st->hx==st->Snakeb[st->front].x&&st->hy==st->Snakeb[st->front].y+st->size) qt=1;if(st->hx==st->Snaket.x&&st->hy==st->Snaket.y+st->size)qt=1;}if(st->Snakeh.left){if(st->hx==st->Snakeb[st->front].x+st->size&&st->hy==st->Snakeb[st->front].y) qt=1;if(st->hx==st->Snaket.x+st->size&&st->hy==st->Snaket.y)qt=1;}if(st->Snakeh.right||st->Snakeh.down){if(st->hx==st->Snakeb[st->front].x&&st->hy==st->Snakeb[st->front].y)qt=1;if(st->hx==st->Snaket.x&&st->hy==st->Snaket.y)qt=1;}}if(ft->fkey&&!ft->fns){if(st->Snakeh.top||st->Snakeh.down){if(st->hx==ft->fx){if(st->hy==ft->fy+st->size||st->hy==ft->fy)qt=1;}}if(st->Snakeh.left||st->Snakeh.right){if(st->hy==ft->fy){if(st->hx==ft->fx+st->size||st->hx==ft->fx)qt=1;}}}if(qt){setcolor(15);settextstyle(1,0,2);outtextxy(270,240,"Game over!");outtextxy(235,255,"Press a key to exit");}return qt;}/*显示帮助信息*/void GameHelp(){char ts[2];setfillstyle(1,7);bar(200,70,408,210);setcolor(6);outtextxy(280,80,"HELP");sprintf(ts,"%c",24);outtextxy(210,100,"Press the key ");outtextxy(325,100,ts);outtextxy(340,100,"to UP");sprintf(ts,"%c",25);outtextxy(210,120,"Press the key ");outtextxy(325,120,ts);outtextxy(340,120,"to DOWN");sprintf(ts,"%c",26);outtextxy(210,140,"Press the key ");outtextxy(325,140,ts);outtextxy(340,140,"to RIGHT");sprintf(ts,"%c",27);outtextxy(210,160,"Press the key ");outtextxy(325,160,ts);outtextxy(340,160,"to LEFT");outtextxy(230,190,"Press a key to game ");setcolor(15);line(200,90,408,90);line(200,180,408,180);getch();setfillstyle(1,8);bar(200,70,408,210);}/*绘制游戏窗口平台*/void GameWindow(){setfillstyle(1,1);bar(75,20,565,460);setfillstyle(1,8);bar(78,55,562,425);setcolor(6);rectangle(78,55,562,425);setcolor(9);rectangle(75,20,565,460);setcolor(15);outtextxy(80,35,"Game snake");GameHelp();outtextxy(150,80,"Snake length ");outtextxy(350,80,"Score ");setfillstyle(1,6);bar(128,108,512,372);setfillstyle(1,0);bar(139,119,500,360);setcolor(14);rectangle(139,119,500,360);}/*获取食物,蛇体增长一节,玩家得到5分成绩*/ void GetFood(FOOD *ft,TCsQueue *st){if(ft->fkey&&ft->fns){if(st->Snakeh.top||st->Snakeh.down){if(st->hx==ft->fx){if(st->hy==ft->fy+st->size||st->hy==ft->fy)InputSnakebody(st),ft->fkey=0;}}if(st->Snakeh.left||st->Snakeh.right){if(st->hy==ft->fy){if(st->hx==ft->fx+st->size||st->hx==ft->fx)InputSnakebody(st),ft->fkey=0;}}}}/*安放食物(先判断蛇体以外的空地然后随机放置食物,10秒钟投放一次,如果蛇没吃到食物,先清除原来的食物然后在新的位置安放食物。
(完整word版)贪吃蛇游戏程序设计一课程设
贪吃蛇游戏程序设计__一、课程设.txt同志们:别炒股,风险太大了,还是做豆腐最安全!做硬了是豆腐干,做稀了是豆腐脑,做薄了是豆腐皮,做没了是豆浆,放臭了是臭豆腐!稳赚不亏呀!贪吃蛇游戏程序设计一、课程设计任务贪吃蛇小游戏程序设计二、设计要求通过游戏程序设计,提高编程兴趣与编程思路,巩固C语言中所学的知识,合理的运用资料,实现理论与实际相结合。
(1).收集资料,分析课题,分解问题,形成总体设计思路;(2).对于设计中用到的关键函数,要学会通过查资料,弄懂其用法,要联系问题进行具体介绍;(3).上机调试,查错,逐步分析不能正常运行的原因,确保所设计的程序正确,并且能正常运行;(4).完成课程设计报告,并进行答辩三、需求分析3.1、程序功能贪吃蛇游戏是一个经典小游戏,一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。
3.2、设计思想程序关键在于表示蛇的图形及蛇的移动。
用一个小矩形快表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用俩节表示。
移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新蛇的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后一节用背景色覆盖。
食物的出现与消失也是画矩形块和覆盖矩形块。
为了便于理解,定义两个结构体:食物与蛇。
3.3、流程图开始初始化界面和蛇身放置食物蛇开始运动蛇吃到食?蛇长大蛇死亡?继续?退出界面NYNY游戏者按键选择Y四、设计的具体实现(1)函数定义函数定义是对各个基础函数的定义,并且设置需要运用的信息,便于调用#define N 200#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 0x011bint 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();//输出成绩(2)主函数main( ) 主函数是程序的主流程,首先定义使用到的常数、全局变量及函数原型说明,然后初始化图形系统,调用函数DrawK()画出开始画面,调用函数GamePlay(),即玩游戏的具体过程,游戏结束后调用Close()关闭图形系统,结束程序void main()//主函数{Init();//图形驱动DrawK();//开始画面GamePlay();//玩游戏的具体过程Close();//图形结束}void Init()//图形驱动{int gd=DETECT,gm;initgraph(&gd,&gm," ");/*此处为turboc的路径,读者可以根据自己的电脑而改*/cleardevice();}(3)画界面函数DrawK( )主界面是一个封闭的围墙,用两个循环语句分别在水平和垂直方向输出连续的宽度和高度均的矩形方块,表示围墙,为了醒目,设置为白色。
JAVA课程设计贪吃蛇小程序附代码
Part Two
JAVA贪吃蛇小程序 代码解析
游戏界面实现
游戏窗口:设置游戏窗口大小和位置
游戏背景:设置游戏背景颜色和图片 游戏元素:设置蛇、食物、障碍物等 元素的位置和样式
游戏控制:设置键盘控制和鼠标控制, 实现游戏的开始、暂停和结束
游戏得分:显示游戏得分和等级,以 及游戏结束提示
游戏音效:设置游戏音效和背景音乐, 增加游戏的趣味性和沉浸感
重新开始:提供重新开始游 戏的选项,重新开始游戏时, 重置游戏界面和蛇的位置
游戏控制实现
键盘控制:通过键盘输入控制蛇的移动方向 游戏循环:通过循环实现游戏的持续运行 蛇的移动:通过改变蛇的位置实现蛇的移动 食物生成:随机生成食物,增加游戏的挑战性 碰撞检测:检测蛇与食物或边界的碰撞,实现游戏的结束或重新开始
Part Four
总结
JAVA贪吃蛇小程序的特点和亮点
添加标题
简单易用:界面简洁,操作简单,适合初学者使用
添加标题
功能丰富:支持多种游戏模式,如经典模式、挑战模式等
添加标题
性能优化:采用高效的算法和优化技术,提高游戏运行速度和稳定性
添加标题
扩展性强:支持自定义皮肤、背景音乐等,满足不同用户的需求
程序实现原理
贪吃蛇游戏是一种经典的游戏,通过控制蛇的移动来获取食物,同时避免撞到墙壁或自己的身 体。
JAVA贪吃蛇小程序的实现原理主要是通过JAVA语言编写程序,实现蛇的移动、食物的生成、 碰撞检测等功能。
蛇的移动是通过改变蛇头的位置来实现的,食物的生成则是随机生成在屏幕上的某个位置。
碰撞检测则是通过判断蛇头是否与墙壁或自己的身体发生碰撞来实现的。
游戏界面: 显示贪吃 蛇和食物
游戏操作: 通过键盘 控制贪吃 蛇移动
C语言程序设计课程设计(论文)-贪吃蛇
C语言程序设计课程设计(论文)-贪吃蛇------------ 大学C语言程序设计课程设计(论文)题目: 贪吃蛇院(系):专业班级:学号:学生姓名:指导教师:教师职称:起止时间:课程设计(报告)任务及评语院(系): 教研室:学号学生姓名专业班级程序设计(报告)贪吃蛇题目程序设计的任务与要求:(1)掌握C语言编程的基础知识。
(2)较熟练地编写C语言应用程序。
(3)了解C语言的常用标准函数、编程技巧、异常处理。
程序(5)联系已学过的内容,巩固所学的理论,增强独立工作能力。
设(6)通过设计主要使学生有一个独立编写程序的过程,对理论学习及动手能计)力都有一个很大的提高。
报告(7)通过本次设计,进一步培养学生热爱专业的思想,同时对本专业综合素) 质的提高起一个积极的推动作用。
任务课程设计过程中,要严格遵守实践环节的时间安排,听从指导教师的指导。
正确地完成上述内容,记录实习日记,规范完整地撰写出课程设计报告。
指导教师评语及成绩成绩: 指导教师签字:2011年 1 月 4 日辽宁工业大学 C 语言课程设计说明书(论文)目录第1章 C语言课程设计的实训目的与要求 (1)1.1 C语言课程设计目的 (1)1.2 C语言课程设计的实验环境 (1)1.3 C语言课程设计的预备知识 (1)1.4 C语言课程设计要求 .................................................. 1 第2章 C语言课程设计内容 .. (2)2.1程序功能介绍 (2)2.2程序整体设计说明 (2)2.2.1设计思路 ......................................................22.2.2数据结构设计及用法说明 ........................................32.2.4各模块的功能及程序说明 ........................................72.2.5程序结果 ......................................................82.3程序源代码及注释 (10)第3章 C语言课程设计总结 .................................................. 17 参考资料.. .................................................................20辽宁工业大学 C 语言课程设计说明书(论文)第1章 C语言课程设计的目的与要求 1.1 C语言课程设计目的本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完《程序设计语言(C)》课程后进行的一次全面的综合练习。
贪吃蛇小游戏编程实现
贪吃蛇小游戏编程实现贪吃蛇(Snake)游戏是一种经典的益智游戏,原理是控制一个蛇在有限的游戏区域中移动并吃食物,蛇的身体随着吃的食物长度增加,游戏目标是使蛇吃到尽可能多的食物并避免撞到边界或自身身体。
本文将介绍如何使用编程语言实现一个贪吃蛇小游戏。
一、游戏环境设置为了实现贪吃蛇小游戏,我们首先需要创建一个游戏环境。
游戏环境可以是一个矩形区域,根据游戏需求,可以自定义其大小。
在游戏环境中,我们需要绘制蛇、食物以及游戏得分等元素。
二、蛇的移动控制实现贪吃蛇游戏的关键是控制蛇的移动。
蛇的移动通常由用户输入的方向控制,例如使用键盘的上、下、左、右键控制蛇的移动方向。
在每一次蛇的移动中,我们需要更新蛇的位置并判断是否吃到了食物或者撞到了边界或自身身体。
三、食物的生成与吃掉在游戏中,随机生成食物是必要的。
当蛇吃到食物时,蛇的长度会增加,并且在游戏区域中生成一个新的食物。
为了触发吃食物的事件,我们需要判断蛇的头部是否与食物的位置重合,如果重合则表示蛇吃到了食物。
四、游戏结束条件判断游戏在满足某些条件下结束,例如蛇撞到了边界或自身的身体。
当蛇的头部位置超过了游戏区域或者与自己的身体发生碰撞时,游戏结束,玩家可以选择重新开始游戏或者退出游戏。
五、计分系统为了增加游戏的挑战性,我们可以加入计分系统。
在每次吃到食物时,玩家得分增加,并在游戏界面显示得分。
可以根据得分的高低设置等级,并随着游戏的进行提高速度或其他难度。
六、游戏界面设计为了提升游戏的体验,我们可以对游戏界面进行设计美化。
可以使用不同颜色和图案来绘制游戏元素,使游戏界面更加美观。
同时,我们还可以为游戏界面添加音效或背景音乐,增加游戏的趣味性。
七、总结通过编程实现贪吃蛇小游戏,我们可以提升自己的编程能力,并享受自己设计的游戏带来的乐趣。
贪吃蛇小游戏不仅简单有趣,而且可以帮助我们锻炼思维敏捷性和逻辑思维能力。
希望本文对你有所帮助,让你更好地实现贪吃蛇小游戏的编程实现。
C语言贪吃蛇全部程序及说明Word版
#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <string.h>#include <time.h>const int H = 8; //地图的高const int L = 16; //地图的长char GameMap[H][L]; //游戏地图int key; //按键保存int sum = 1, over = 0; //蛇的长度, 游戏结束(自吃或碰墙)int dx[4] = {0, 0, -1, 1}; //左、右、上、下的方向int dy[4] = {-1, 1, 0, 0};struct Snake //蛇的每个节点的数据类型{int x, y; //左边位置int now; //保存当前节点的方向, 0,1,2,3分别为左右上下}Snake[H*L];const char Shead = '@'; //蛇头const char Sbody = '#'; //蛇身const char Sfood = '*'; //食物const char Snode = '.'; //'.'在地图上标示为空void Initial(); //地图的初始化void Create_Food(); //在地图上随机产生食物void Show(); //刷新显示地图void Button(); //取出按键,并判断方向void Move(); //蛇的移动void Check_Border(); //检查蛇头是否越界void Check_Head(int x, int y); //检查蛇头移动后的位置情况int main(){Initial();Show();return 0;}void Initial() //地图的初始化{int i, j;int hx, hy;system("title 贪吃蛇"); //控制台的标题memset(GameMap, '.', sizeof(GameMap)); //初始化地图全部为空'.' system("cls");srand(time(0)); //随机种子hx = rand()%H; //产生蛇头hy = rand()%L;GameMap[hx][hy] = Shead;Snake[0].x = hx; Snake[0].y = hy;Snake[0].now = -1;Create_Food(); //随机产生食物for(i = 0; i < H; i++) //地图显示{for(j = 0; j < L; j++)printf("%c", GameMap[i][j]);printf("\n");}printf("\n小小C语言贪吃蛇\n");printf("按任意方向键开始游戏\n");getch(); //先接受一个按键,使蛇开始往该方向走Button(); //取出按键,并判断方向}void Create_Food() //在地图上随机产生食物{int fx, fy;while(1){fx = rand()%H;fy = rand()%L;if(GameMap[fx][fy] == '.') //不能出现在蛇所占有的位置{GameMap[fx][fy] = Sfood;break;}}}void Show() //刷新显示地图{int i, j;while(1){_sleep(500); //延迟半秒(1000为1s),即每半秒刷新一次地图Button(); //先判断按键在移动Move();if(over) //自吃或碰墙即游戏结束{printf("\n**游戏结束**\n");printf("你的得分:%d\n",sum=10*(sum-1));getchar();break;}system("cls"); //清空地图再显示刷新吼的地图for(i = 0; i < H; i++){for(j = 0; j < L; j++)printf("%c", GameMap[i][j]);printf("\n");}printf("\n小小C语言贪吃蛇\n");printf("按任意方向键开始游戏\n");}}void Button() //取出按键,并判断方向{if(kbhit() != 0) //检查当前是否有键盘输入,若有则返回一个非0值,否则返回0 {while(kbhit() != 0) //可能存在多个按键,要全部取完,以最后一个为主key = getch(); //将按键从控制台中取出并保存到key中switch(key){ //左case 75: Snake[0].now = 0;break;//右case 77: Snake[0].now = 1;break;//上case 72: Snake[0].now = 2;break;//下case 80: Snake[0].now = 3;break;}}}void Move() //蛇的移动{int i, x, y;int t = sum; //保存当前蛇的长度//记录当前蛇头的位置,并设置为空,蛇头先移动x = Snake[0].x; y = Snake[0].y; GameMap[x][y] = '.';Snake[0].x = Snake[0].x + dx[ Snake[0].now ];Snake[0].y = Snake[0].y + dy[ Snake[0].now ];Check_Border(); //蛇头是否越界Check_Head(x, y); //蛇头移动后的位置情况,参数为: 蛇头的开始位置if(sum == t) //未吃到食物即蛇身移动哦for(i = 1; i < sum; i++) //要从蛇尾节点向前移动哦,前一个节点作为参照{if(i == 1) //尾节点设置为空再移动GameMap[ Snake[i].x ][ Snake[i].y ] = '.';if(i == sum-1) //为蛇头后面的蛇身节点,特殊处理{Snake[i].x = x;Snake[i].y = y;Snake[i].now = Snake[0].now;}else //其他蛇身即走到前一个蛇身位置{Snake[i].x = Snake[i+1].x;Snake[i].y = Snake[i+1].y;Snake[i].now = Snake[i+1].now;}GameMap[ Snake[i].x ][ Snake[i].y ] = '#'; //移动后要置为'#'蛇身}}void Check_Border() //检查蛇头是否越界{if(Snake[0].x < 0 || Snake[0].x >= H|| Snake[0].y < 0 || Snake[0].y >= L)over = 1;}void Check_Head(int x, int y) //检查蛇头移动后的位置情况{if(GameMap[ Snake[0].x ][ Snake[0].y ] == '.') //为空GameMap[ Snake[0].x ][ Snake[0].y ] = '@';elseif(GameMap[ Snake[0].x ][ Snake[0].y ] == '*') //为食物{GameMap[ Snake[0].x ][ Snake[0].y ] = '@';Snake[sum].x = x; //新增加的蛇身为蛇头后面的那个Snake[sum].y = y;Snake[sum].now = Snake[0].now;GameMap[ Snake[sum].x ][ Snake[sum].y ] = '#';sum++;Create_Food(); //食物吃完了马上再产生一个食物}elseover = 1;}。
贪吃蛇一般流程设计
贪吃蛇一般流程设计:
开始
变量定义及初始化
设置图形模式
绘制初始界面
游戏结束办理
游戏结束
延时办理
按键判断及办理
依据按键状况绘制
游戏下一状态
能否切合某一
游戏规则
按游戏规则办理
贪吃蛇实例程序剖析:
开始
变量定义及初始化
设置图形模式
():全局变量赋值
游戏结束()
按键判断及办理
延时办理
设置图形编写页并清屏
暂停办理
()
()
显示目前页
变量及其含义:
[ ] :贪吃蛇数据构造
、:蛇头、尾数组地点
、:蛇头目前坐标
、:红块坐标
:得分
[] :不一样速度等级的延时价
:速度等级(级)
:能否吃到
:游戏状态
:蛇的运动方向(上下左右)
:循环变量,用于实现延时
游戏结束办理
(())
(剖析贪吃蛇行进一步后的各
种状况并设置相应数据)
(在目前编写页绘制最新游戏
状态)。
贪吃蛇程序设计说明书
贪吃蛇程序设计说明书贪吃蛇游戏程序设计说明书题目:贪吃蛇游戏学校:系别:专业班级:姓名:学号:指导老师:日期:一、设计题目:贪吃蛇是一款经典的休闲游戏,一条蛇在密闭的围墙内,随机出现一个食物,通过控制方向键操作小蛇不停的朝着食物前进,直到吃掉食物。
每吃一个食物,小蛇都会长长一截,随之难度增大;当小蛇头撞到墙或自己时,小蛇死亡。
二、功能设计:本游戏要求实现以下几个功能:(1)用上、下、左、右键控制游戏区蛇的运动方向,使之吃食而使身体变长;(2)用户可以调节蛇的运行速度来选择不同的难度;(3)游戏分多个难度级别;(4)用户可自选颜色;(5)记录成绩前五名的游戏玩家;(6)增加背景音乐;(7)提高障碍物和游戏级别。
三、程序模块图:贪吃蛇游戏初始化图模块控制模块设置模块帮助模块墙体蛇身食物移动食物死亡变长绩等级音效四、算法流程图:是否否是否是开始初始化界面和蛇身放置食物获取按键开始运动碰到边界蛇吃到食蛇长大蛇死亡继续结束五、函数原型与功能1.主函数:void main()启动程序,触动其他函数。
2.初始化:void init ()设置背景框大小、蛇体初始值,随机产生食物。
3.随机产生食物:void setfoodcrd()设置食物生成坐标,0表示食物被吃。
4.画食物:void showfood()用矩形框来画食物5.画蛇:void showsnake()根据蛇的坐标和节数,循环用矩形框来画蛇。
6.蛇移动:void snakemove()根据按键,重设坐标7.改变蛇的方向:void changeskdir()响应用户的运动方向8.判断蛇是否死亡:void judgeslod判断蛇是否碰到自己或墙。
9.判断蛇是否吃到食物:void judgefood()判断是否吃到食物,吃食后变0,蛇增长一节。
10.结束游戏:void gameover()结束话语,并执行下一步。
六、基本代码#include#include#include#pragma comment(lib,"Winmm.lib")#include "MyTimer.h"#define SIZEMAX 100 /*蛇最大长度*/#define SPEED 100 /*初始速度*/#define len 20 /*蛇宽度*/#define lm 10 /*蛇每次移动距离*/#define initlen 600 /*初始化窗口正方形的长度*/ #define Min_snakelen 2 /*蛇的最小长度*/ typedef struct {int x,y;}DIR;int snakelen=Min_snakelen; /*蛇的长度*/int isfood=1; /*食物状态*/int isover=0; /*游戏状态*/int ispause=1; /*暂停状态*/int ismusic=1; /*音乐播放状态*/char dir; /*记录蛇运动的方向*/char c='d';DIR snake[500],food; /*定义蛇节点和食物的类型*/int speed=SPEED;void drawmap() /*画地图函数*/ {IMAGE img;char str[10];loadimage(&img,"贪吃蛇.jpg"); /*游戏界面*/ putimage(0,0,&img);loadimage(&img,"7.jpg"); /*侧栏提示*/putimage(600,0,&img);sprintf(str,"%d",snakelen);setfont(30,0,"宋体");setbkmode(TRANSPARENT);outtextxy(620,10,"操作说明:");setfont(20,0,"宋体");outtextxy(615,50,"awsd控制方向键");outtextxy(615,80,"p键暂停");outtextxy(615,110,"o键继续");outtextxy(615,200,"esc键退出");outtextxy(615,140,"l键暂停音乐");outtextxy(615,170,"k键继续播放");outtextxy(730,250,str);outtextxy(620,250,"蛇当前长度");}void init() /*初始化蛇函数*/ {int i;IMAGE img;snake[0].x=9*len+lm;snake[0].y=4*len+lm;loadimage(&img,"1.jpg");putimage(snake[0].x-lm,snake[0].y-lm,&img); for(i=1;i<snakelen;i++)< p="">{snake[i].x=len*(9-i)+lm;snake[i].y=len*4+lm;loadimage(&img, "2.jpg");putimage(snake[i].x-lm,snake[i].y-lm, &img); }}void showsnake() /*画蛇函数*/{int i;IMAGE img;loadimage(&img, "1.jpg");putimage(snake[0].x-lm,snake[0].y-lm , &img); loadimage(&img, "2.jpg");for(i=1;i<snakelen;i++)< p="">putimage(snake[i].x-lm,snake[i].y-lm, &img); }void snakemove() /*画动蛇函数*/{int i;int mx=snake[0].x;int my=snake[0].y;switch(dir){case 'a':mx-=len;break;case 'd':mx+=len;break;case 'w':my-=len;break;case 's':my+=len;break;default:break;}for(i=snakelen-1;i>=0;i--){snake[i+1].x=snake[i].x;snake[i+1].y=snake[i].y;}snake[0].x=mx;snake[0].y=my;showsnake();}int ceshiover() /*检测游戏结束函数*/{int i;if(snake[0].x<0||snake[0].x>30*len-lm||snake[0].y<0||snake[0].y>30*len-lm) return 1;for(i=1;i<snakelen;i++)< p="">{if(snake[0].x==snake[i].x&&snake[0].y==snake[i].y) return 1;}return 0;}int foodinsnake() /*检测食物是否在蛇上函数*/ {for(int i=0;i<snakelen;i++)< p="">if(food.x==snake[i].x&&food.y==snake[i].y)return 1;elsereturn 0;}void showfood() /*画食物函数*/{IMAGE img;do{food.x=(rand()%30)*len+lm;food.y=(rand()%30)*len+lm;}while(foodinsnake());loadimage(&img, "3.jpg");putimage(food.x-lm,food.y-lm , &img);isfood=0;}void kmusic(){if(ismusic==0)mciSendString("pause mymusic",NULL,0,NULL);if(ismusic==1)mciSendString("resume mymusic",NULL,0,NULL);}void playbkmusic() /*播放背景音乐函数*/{mciSendString("open 超级玛丽.mp3 alias mymusic", NULL, 0, NULL);mciSendString("play mymusic repeat", NULL, 0, NULL);}void playgame() /*玩游戏函数*/{c='d'; //蛇开始向右移动isover=0;snakelen=Min_snakelen;dir='d';IMAGE img;MyTimer t; //定义精确延时对象int T=200; // 延长时间drawmap(); //画游戏地图init(); //画小蛇初始位置while(!isover){if(ispause){snakemove();FlushBatchDraw(); //批量绘图EndBatchDraw(); //结束批量绘图if(snake[0].x==food.x&&snake[0].y==food.y){ snakelen++;isfood=1;}if(isfood)showfood();if(snakelen<35)T=200-3*snakelen;t.Sleep(T);BeginBatchDraw(); // 开始批量绘图模式,防止闪烁问题drawmap();loadimage(&img, "3.jpg"); // 加载食物图片putimage(food.x-lm,food.y-lm , &img);};//按键控制if(kbhit())c=getch();switch(c){case 'a':if(dir!='d'){dir=c;}break;case 'd':if(dir!='a'){dir=c;}break;case 'w':if(dir!='s'){dir=c;}break;case 's':if(dir!='w'){dir=c;}break;case 27: exit(0); break; //游戏退出case 'p': ispause=0;break; //p暂停case 'o': ispause=1;break; //o继续游戏case 'l': ismusic=0;break; //l暂停音乐case 'k': ismusic=1;break; //k继续播放default:break;}kmusic(); //音乐控制播放//判断游戏结束if(ceshiover())isover=1;//判断是否重新再来HWND wnd = GetHWnd(); //获取窗口句柄if(isover)if (MessageBox(wnd, "游戏结束。
贪吃蛇开发文档
【名称】贪吃蛇开发文档【日期】2011-1-24 星期一1【需求文档】1.1 主界面1.2 菜单游戏菜单【开始】:重新开始。
【暂停、开始】:停止一下游戏,游戏开始。
【退出】:退出程序。
帮助菜单【关于】弹出关于对话框1.3 游戏界面【蛇】:蛇头黑色,蛇身白色,蛇每吃一次食物,蛇身就变长一格。
【食物】:黑色一点,每次被蛇吃掉,就在游戏界面上随机产生。
1.4 右边界面得分:每吃一个食物加一分。
游戏说明:上:W键下:S键左:A键右:D键暂停:空格键1.5 关于对话框2【全中文建模】2.1 类图1.蛇2.食物3.主窗口4.关于窗口5.得分2.2.1蛇2.2.2食物2.2.4主窗口2.2.5关于窗口2.3 序列图2.4 伪代码伪代码编写原理:你按照序列图去做伪代码,序列图怎么相互调用就怎么写函数。
2.4.1显示游戏流程主界面::显示(){蛇.得到坐标();食物.得到坐标();得分.得到坐标();}2.4.2蛇移动流程主界面::开始菜单(){键盘消息();}主界面::键盘消息(){蛇.移动();}蛇::移动(){食物.吃掉();得分.设置得分();}食物::吃掉(){产生();}2.4.3关于对话框流程主界面::关于菜单(){关于对话框.显示();}3【全英文建模】3.1 类图3.2 用例图3.3 序列图3.4 伪代码3.4.1显示游戏流程CMainDialog::Show(){CSnake.GetPoint();CFood.GetPoint();CScore.GetScore();}3.4.2蛇移动流程CMainDialog::StartMenu(){KeyboardMessage();}CMainDialog::KeyboardMessage() {CSnake.Move();}CSnake::Move(){CFood.Eat();CScore.SetScore();}CFood::Eat(){Make();}3.4.3关于对话框流程CMainDialog::AboutMenu(){CAboutDialog.Show();}4【真正代码】。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
srand((unsigned)clock());//设定随机数种子
food[0]=(rand()%28)*2+2;
food[1]=rand()%29+1;//随机产生食物坐标
//检测食物的坐标是否与蛇身体重复,如果是,则重新生成食物
do{
if (food[0]==temp->x&&food[1]==temp->y)
//|---------------------------------------------------------|
//|原作者:Blue_Sky 修改:crisy991 |
//|---------------------------------------------------------|
mkfood(p);
temp=temp->next;
} while(temp!=NULL);
}
//画图函数
void drawmap(struct snk *p#34;);
/*画出框架图*/
int x=0,y=1;
while(x<=60){
}
return turn;
}
//蛇移动函数
struct snk * mvsnk(struct snk *p)//更新蛇的坐标
{
//在蛇的头部添加一个节点
struct snk *newhead=(struct snk *)malloc(sizeof(struct snk));
turn=keydown();
if(turn==27)
break;
else if(turn==5){
get_xy(30,15);
printf("暂停");
getch();
#include <stdio.h>
#include <windows.h>
#include <conio.h>
#include <time.h>
#include <malloc.h>
struct snk{//蛇身体
int x;
int y;
struct snk *next;
case 4:newhead->y+=1;break;
}
//判断移动方向是否碰到身体
struct snk *temp=p;
while(temp!=NULL){
if (newhead->x==temp->x&&newhead->y==temp->y)
system("mode con cols=63 lines=30");//窗口宽度高度
system("color 20");
printf("w-->上 s-->下 a-->左 d-->右 空格暂停");
Sleep(3000);
struct snk *snake;
newhead->x=p->x;
newhead->y=p->y;
newhead->next=p;
switch(turn){
case 1:newhead->x-=2;break;
case 2:newhead->x+=2;break;
case 3:newhead->y-=1;break;
snake->next->x=10;snake->next->y=9;
snake->next->next=NULL;
//游戏主循环 -----------------------------------------|
while(life){
int temp_z=turn;
struct snk * mvsnk(struct snk *p);//更新蛇的坐标
void mkfood(struct snk *p);//产生食物
int food[2]={20,15};
int main()
{
system("title 贪吃蛇");//设置cmd窗口标题
case 'D':
case 'd':if(turn!=1)turn=2;break;
case 'W':
case 'w':if(turn!=4)turn=3;break;
case 'S':
printf("口");
p=p->next;
}
}
//得到位置函数
void get_xy(int x, int y){
COORD pos = {x,y};
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOut, pos);
//声明两个个链表节点为初始的两节蛇身体
snake=(struct snk *)malloc(sizeof(struct snk));
snake->x=10;snake->y=10;
snake->next=(struct snk *)malloc(sizeof(struct snk));
};
bool life=true;//生命
int turn=4;//方向
int speed=0;//速度
void get_xy(int x, int y);//选定光标位置
void drawmap(struct snk *p);//里用上面两个函数画地图食物和蛇
int keydown();//获取输入
get_xy(x,0);
printf("口");
get_xy(x,29);
printf("口");
x+=2;
}
while(y<30){
get_xy(0,y);
printf("口");
get_xy(60,y);
printf("口");
y+=1;
}
/*画出食物*/
get_xy(food[0],food[1]);
printf("口");
/*画出蛇*/
while(p!=NULL){
get_xy(p->x,p->y);
p=p->next;
temp=p->next;
p->next=NULL;
free(temp);
}
return newhead;
}
//生成食物函数
void mkfood(struct snk *p)
{
struct snk *temp;
life=false;
temp=temp->next;
}
//判断移动方向是否碰到墙壁
if (newhead->x>58||newhead->y>29||newhead->x<1||newhead->y<1)
life=false;
case 's':if(turn!=3)turn=4;break;
case 'E':
case ' ':turn=5;break;
default :break;
}
if(ch==27)turn=27;
//如果吃到食物则不删除最后一个节点
if (newhead->x==food[0]&&newhead->y==food[1]){
speed+=20;
mkfood(newhead);
}
else{
while(p->next->next!=NULL)//寻找倒数第二个节点
}
turn=temp_z;
}
snake=mvsnk(snake);
drawmap(snake);
Sleep(300-speed);
}
get_xy(30,15);
printf("Game Over!!!");
return 0;
}
//获取输入函数
int keydown(){
char ch;
if(kbhit()){
ch=getch();
switch(ch){
case 'A':
case 'a':if(turn!=2)turn=1;break;