导航:首页 > 操作系统 > 基于52单片机贪吃蛇游戏

基于52单片机贪吃蛇游戏

发布时间:2022-08-08 13:45:26

⑴ 贪吃蛇游戏----《C程序设计课程设计》

// Snake.h : main header file for the SNAKE application
//

#if !defined(AFX_SNAKE_H__2EBD7F04_452B_11D7_B6CA_0050BAE90E03__INCLUDED_)
#define AFX_SNAKE_H__2EBD7F04_452B_11D7_B6CA_0050BAE90E03__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#ifndef __AFXWIN_H__
#error include 'stdafx.h' before including this file for PCH
#endif

#include "resource.h" // main symbols

/////////////////////////////////////////////////////////////////////////////
// CSnakeApp:
// See Snake.cpp for the implementation of this class
//

class CSnakeApp : public CWinApp
{
public:
CSnakeApp();

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CSnakeApp)
public:
virtual BOOL InitInstance();
//}}AFX_VIRTUAL

// Implementation
//{{AFX_MSG(CSnakeApp)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_SNAKE_H__2EBD7F04_452B_11D7_B6CA_0050BAE90E03__INCLUDED_)

这只是个一部分!以前我写过的!你还要写出相对的main和frm等等!

⑵ 求大神指教,写一个用PC键盘控制单片机的贪吃蛇游戏,或者提示一下需要怎样去写

给你一个单片机和上位机的例程,你试一下吧

⑶ 简单的汇编语言贪吃蛇

正在编制...

能提高悬赏更好,不能提高,我也会继续编制,只是这个题目确有难度,累得我头晕眼花。

⑷ 毕业设计做了个单片机的贪吃蛇的游戏机 但是不知道答辩时老师能问什么 因为硬件太简单了

他会问你,右上角的电路图不错哦,怎么画的。还有就是,你能吃到多少分撞墙,哈哈
有可能会问功率多大,你设计的电池容量多大,我做毕业设计的时候就被问到了电路耗电量,我勒个去

⑸ 求单片机学习板上贪吃蛇c 源代码

/***********************************************************************************
/* 文件名称: SNAKE.c
/* 功 能: 贪吃蛇游戏代码
/* 署 名: 张先永(原作者)
/* 时 间: 2009年10月11日
/* 备 注:
/* 游戏按键由于需要快速的响应,所有按键通过线与扩展为中断按键
/* LCD 液晶显示器在PO口 需要上拉电阻
/***********************************************************************************/

#include <reg52.H>
#include <KEY_SWEEP.H>
#include"9325tp.h"
#include "SNAKE.h"

#define uchar unsigned char
//=================================================================
// 使用结构体定义变量 使程序的名称更加的清楚
//=================================================================
struct
{
uchar X;
uchar Y;
uchar Yes;
}Food; //食物结构体

#define SNAKE_Max_Long 20 //最大长度
struct
{
uchar X[SNAKE_Max_Long];
uchar Y[SNAKE_Max_Long];
uchar Long;
uchar Life;
uchar Score; //蛇的分数
uchar Level; //蛇的等级
}Snake; //蛇结构体

uchar Key_V_temp=0; //取出上次按键值

//=================================================================
//函数功能:1ms延时函数
//晶 振:11.0592 M
//入口参数:n
//出口参数:无
//=================================================================
void Delay_1mS(unsigned int n)
{
unsigned int i;
unsigned char j;

for(i=0;i<n;i++)
for(j=0;j<120;j++) ;
}

//=================================================================
//函数名称:void Init_time0 (void)
//函数功能:初始化定时器1 用于产生随机数种子 ,用于放置实物
//入口参数:无
//出口参数:无
//=================================================================
void Init_time0 (void)
{
EA=1;
ET1=1;
TMOD|=0x10;
TH1=0X00;
TL1=0X00;
TR1=1;
}
void time1 (void) interrupt 3
{
TH1=0X00;
TL1=0X00;
}

//=================================================================
//函数名称:Trun_On_Point Trun_Off_Point (uchar x,uchar y)
//函数功能:点亮或者熄灭 一个点。用于显示蛇身体
//入口参数:无
//出口参数:无
//特别说明:此 Trun_On,函数换成其他的就可以兼容其他的液晶
// 入8*8 点阵 12864 等
//=================================================================
void Trun_On_Point (uchar x,uchar y,uchar color)
{
Bar((4*(x+2)),(4*(y+2)),(4*(x+3)),(4*(y+3)),color);
}

void Trun_Off_Point (uchar x,uchar y)
{
Bar((4*(x+2)),(4*(y+2)),(4*(x+3)),(4*(y+3)),0xBE5F);
}

//=================================================================
//函数名称:void Init_SNAKE(void)
//函数功能:绘制游戏界面,初始化游戏等级等参数
//入口参数:无
//出口参数:无
//=================================================================
void Init_SNAKE(void)
{
uchar i;

Init_time0();
//***********绘制游戏界面********************//
CLR_Screen(0xBE5F);
Rectangle(8,8-1,85,120,0xaa);//绘制一个矩形框, 0-127
LCD_PutString(88,8,"Score",0x00ff,0xBE5F);
LCDShow_uCharNumber(96,24,Snake.Score,0x00ff,0xBE5F);
LCD_PutString(88,81,"LEVEL",0x00ff,0xBE5F);
LCDShow_uCharNumber(96,97,Snake.Level,0x00ff,0xBE5F);

//***********初始化蛇参数********************//
Snake.Long=2; //定义初始化蛇的长度
Snake.Life=0; //初始化蛇还活着
Snake.Score=0;
Food.Yes=1;
Key_Value=0;
Key_V_temp=0;

for(i=0;i<Snake.Long;i++) //将蛇给赋值
{
Snake.X[i]=i+2;
Snake.Y[i]=2;
}
for(i=0;i<Snake.Long;i++) //将蛇给画出来
{
Trun_On_Point(Snake.X[i],Snake.Y[i],0xaa);
}
}
//=================================================================
//函数名称:void Display_dead(uchar i)
//函数功能:显示死亡界面
//入口参数:无
//出口参数:无
//=================================================================
void Display_dead(void)
{

LCD_PutString(10,40,"GAME OVER",0x00ff,0xBE5F);
while(Key_Value!=Key_Enter)
{
Key();
}
Init_SNAKE();
}

//=================================================================
//函数名称:void Display_Pass(uchar i)
//函数功能:显示过关界面
//入口参数:无
//出口参数:无
//=================================================================
void Display_Pass(void)
{
Snake.Level++;
LCD_PutString(18,40,"You are",0xcc88,0xBE5F);
LCD_PutString(34,56,"WIN!",0xcc88,0xBE5F);
while(Key_Value!=Key_Enter)
{
Key();
}
Init_SNAKE();
}
//=================================================================
//函数名称:void Run_SNAKE(void)
//函数功能:蛇运动函数 (游戏精华)
//入口参数:无
//出口参数:无
//=================================================================
void Run_SNAKE(void)
{
uchar i=0;

/*********************根据按键选择蛇的运动方向*******************/
if((Key_Value==Key_Right&&Key_V_temp!=Key_Left)||(Key_Value==Key_Left&&Key_V_temp==Key_Right))
{
Trun_Off_Point(Snake.X[0],Snake.Y[0]); //先把蛇尾给熄灭掉

for(i=0;i<Snake.Long-1;i++) //蛇身都是它前一段的蛇身的位置
{
Snake.X[i]=Snake.X[i+1];
Snake.Y[i]=Snake.Y[i+1];
}

Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+1;
Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+0; //蛇头向你要求的方向移动

for(i=0;i<Snake.Long;i++) //这个让蛇显示出来的函数
{
Trun_On_Point(Snake.X[i],Snake.Y[i],0xaa);
}
Key_V_temp=Key_Right;
}

if((Key_Value==Key_Left&&Key_V_temp!=Key_Right)||(Key_Value==Key_Right&&Key_V_temp==Key_Left))
{

Trun_Off_Point(Snake.X[0],Snake.Y[0]); //先把蛇尾给熄灭掉

for(i=0;i<Snake.Long-1;i++) //蛇身都是它前一段的蛇身的位置
{
Snake.X[i]=Snake.X[i+1];
Snake.Y[i]=Snake.Y[i+1];
}

Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]-1;
Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+0; //蛇头向你要求的方向移动

for(i=0;i<Snake.Long;i++) //这个让蛇显示出来的函数
{
Trun_On_Point(Snake.X[i],Snake.Y[i],0xaa);
}
Key_V_temp=Key_Left;
}
if(( Key_Value==Key_Up&&Key_V_temp!=Key_Down)||( Key_Value==Key_Down&&Key_V_temp==Key_Up))
{
Trun_Off_Point(Snake.X[0],Snake.Y[0]); //先把蛇尾给熄灭掉

for(i=0;i<Snake.Long-1;i++) //蛇身都是它前一段的蛇身的位置
{
Snake.X[i]=Snake.X[i+1];
Snake.Y[i]=Snake.Y[i+1];
}

Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+0;
Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]-1; //蛇头向你要求的方向移动

for(i=0;i<Snake.Long;i++) //这个让蛇显示出来的函数
{
Trun_On_Point(Snake.X[i],Snake.Y[i],0xaa);
}
Key_V_temp=Key_Up;
}
if(( Key_Value==Key_Down&&Key_V_temp!=Key_Up)||( Key_Value==Key_Up&&Key_V_temp==Key_Down))
{
Trun_Off_Point(Snake.X[0],Snake.Y[0]); //先把蛇尾给熄灭掉

for(i=0;i<Snake.Long-1;i++) //蛇身都是它前一段的蛇身的位置
{
Snake.X[i]=Snake.X[i+1];
Snake.Y[i]=Snake.Y[i+1];
}

Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+0;
Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+1; //蛇头向你要求的方向移动

for(i=0;i<Snake.Long;i++) //这个让蛇显示出来的函数
{
Trun_On_Point(Snake.X[i],Snake.Y[i],0xaa);
}
Key_V_temp=Key_Down;
}

/****************根据按键选择蛇的运动程序结束*******************/
/////////////////////////////////////////////////////////////////

/************************判断蛇是否死亡***********************/
if(Snake.X[Snake.Long-1]>=19||Snake.Y[Snake.Long-1]>=28)//判蛇头是否撞到墙壁
{
Snake.Life=1;
}
for(i=3;i<Snake.Long;i++)//从第三节开始判断蛇头是否咬到自己
{
if(Snake.X[i]==Snake.X[0]&&Snake.Y[i]==Snake.Y[0])
{
Snake.Life=1;
}
}
if(Snake.Life==1) //if the snake over
{

Display_dead();
}
/******************判断蛇是否死亡程序结束***********************/
/////////////////////////////////////////////////////////////////

/************************判断蛇是否最长了**********************/
if(Snake.Long==SNAKE_Max_Long)
{

Display_Pass();
}
/////////////////////////////////////////////////////////////////

/*************************判蛇是否吃到食物**********************/
if(Snake.X[Snake.Long-1]==Food.X&&Snake.Y[Snake.Long-1]==Food.Y)//
{
//Trun_Off_Point(Food.X,Food.Y); //消隐食物
Snake.Long++;//蛇节数加1
Snake.X[Snake.Long-1]=Food.X;
Snake.Y[Snake.Long-1]=Food.Y;
Snake.Score+=10;
LCDShow_uCharNumber(96,24,Snake.Score,0x00ff,0xBE5F);
Food.Yes=1; //食物标志置1
}
/////////////////////////////////////////////////////////////////

/***************************放果子程序*************************/
if(Food.Yes==0)
{
Trun_On_Point(Food.X,Food.Y,0xaa);
}
if(Food.Yes==1)
{
while(1)
{
Food.X=((TL1&0X24)>>1); //获得随机数
Food.Y=TL1&0X1B;

for(i=0;i<Snake.Long;i++) //判断产生的食物坐标是否和蛇身重合
{
if((Food.X==Snake.X[i])&&(Food.X==Snake.Y[i]))
break;
}
if(i==Snake.Long)
{
Food.Yes=0;
break; //产生有效的食物坐标
}
}
}
/////////////////////////////////////////////////////////////////

/**************************延时用于调整游戏速度************************/
Delay_1mS(300-Snake.Level*50);
/////////////////////////////////////////////////////////////////

/**************************************************************************

mini80 或者 mini80E 按键,上 s6,下 s14,左 s11, 右 s9, s4 重新开始

可以按照自己需要重新定义键盘扫描程序中的值,在key_sweep.h 中

****************************************************************************/

#include "reg52.h"
#include "KEY_SWEEP.H"
#include "SNAKE.h"
#include "9325tp.h"

//=========================================主程序========================================//
main()
{
ILI9325_Initial();
Init_SNAKE();
while(1)
{
Run_SNAKE();
Key();
}
}

#include <reg52.h>
#include <KEY_SWEEP.H>

unsigned char Key_Value=0;
unsigned char Key_flag =0;

/*
void Interrupt0_Key (void)
{
IT0=1; //设置下降沿中触发
EA=1; //开总中断
EX0=1; //开外部中断
Key_Port=0X0f;
}
*/
unsigned char code Key_code[]=
{
//p0 p1 p2 p3
0xee,0xed,0xeb,0xe7, //p4
0xde,0xdd,0xdb,0xd7, //p5
0xbe,0xbd,0xbb,0xb7, //p6
0x7e,0x7d,0x7b,0x77 //p7
};

//以上为键码,换他们排列顺序就可以坏氐
void Key (void)
{
unsigned char KeyV_l,KeyV_h,KeyV,i;

if(Key_Port!=0X0f) //0000 1111 有按键的时候就可能是0000 1110;
{
//Delay();
if(Key_Port!=0X0f) //0000 1111 有按键的时候就可能是0000 1110;
{
KeyV_l=Key_Port&0x0f; //取出键码的 低4位
Key_Port=0XF0;
KeyV_h=Key_Port&0xf0; //取出键码的 高4位
KeyV=KeyV_h+KeyV_l; //合并键码

/*************************************
按键编码 对应 键值
Ee ed eb e7 1 5 9 13
De dd db d7 2 6 10 14
Be bd bb b7 3 7 11 15
7e 7d 7b 77 4 8 12 16
*************************************/
for(i=0;i<16;i++) //利用键码查找键值
{
if(Key_code[i]==KeyV)
Key_Value=(i+1);
}
Key_Port=0X0f;
}
}

Key_flag =1;
}

⑹ 用51单片机做个贪吃蛇游戏。

呵呵 一般用点阵式 我用的是12864 你也可以用12232 只要是点阵都可以 但是1602就不行了

⑺ 利用单片机制作贪吃蛇游戏的概要设计中有个限制条件这个项目,请问怎么写,给个范例最好,谢谢。

说明对本程序进行单体测试的计划,包括对测试的技术要求、输入数据、预期结

果、进度安排、人员职责、设备条件驱动程序及桩模块等的规定。

⑻ c语言 贪吃蛇 程序

基本思路:

蛇每吃一个食物蛇身子就增加一格,用UP, DOWN, LEFT, RIGHT控制蛇头的运动,而蛇身子跟着蛇头走,每后一格蛇身子下一步走到上一格蛇身子的位置,以此类推。

#include <stdio.h>

#include <conio.h>

#include <windows.h>

#define BEG_X 2

#define BEG_Y 1

#define WID 20

#define HEI 20

HANDLE hout;

typedef enum {UP, DOWN, LEFT, RIGHT} DIR;

typedef struct Snake_body

{

COORD pos;//蛇身的位置

struct Snake_body *next;//下一个蛇身

struct Snake_body *prev;//前一个蛇身

}SNAKE, *PSNAKE;

PSNAKE head = NULL;//蛇头

PSNAKE tail = NULL;//蛇尾

//画游戏边框的函数

void DrawBorder()

{

int i, j;

COORD pos = {BEG_X, BEG_Y};

for(i = 0; i < HEI; ++i)

{

SetConsoleCursorPosition(hout, pos);

for(j = 0; j < WID; ++j)

{

if(i == 0)//第一行

{

if(j == 0)

printf("┏");

else if(j == WID - 1)

printf("┓");

else

printf("━");

}

else if(i == HEI - 1)//最后一行

{

if(j == 0)

printf("┗");

else if(j == WID - 1)

printf("┛");

else

printf("━");

}

else if(j == 0 || j == WID - 1)//第一列或最后一列

printf("┃");

else

printf(" ");

}

++pos.Y;

}

}

//添加蛇身的函数

void AddBody(COORD pos)

{

PSNAKE pnew = (PSNAKE)calloc(1, sizeof(SNAKE));

pnew->pos = pos;

if(!head)

{

head = tail = pnew;

}

else

{

pnew->next = head;//新创建蛇身的next指向原先的蛇头

head->prev = pnew;//原先的蛇头的prev指向新创建的蛇身

head = pnew;//把新创建的蛇身作为新的蛇头

}

SetConsoleCursorPosition(hout, head->pos);

printf("◎");

}

//蛇身移动的函数

void MoveBody(DIR dir)

{

PSNAKE ptmp;

COORD pos = head->pos;

switch(dir)

{

case UP:

if(head->pos.Y > BEG_Y + 1)

--pos.Y;

else

return;

break;

case DOWN:

if(head->pos.Y < BEG_Y + HEI - 2)

++pos.Y;

else

return;

break;

case LEFT:

if(head->pos.X > BEG_X + 2)

pos.X -= 2;

else

return;

break;

case RIGHT:

if(head->pos.X < BEG_X + (WID - 2) * 2)

pos.X += 2;

else

return;

break;

}

AddBody(pos);//添加了一个新的蛇头

ptmp = tail;//保存当前的蛇尾

tail = tail->prev;

if(tail)

tail->next = NULL;

SetConsoleCursorPosition(hout, ptmp->pos);

printf(" ");

free(ptmp);

}

int main()

{

int ctrl;

DIR dir = RIGHT;//初始蛇的方向是向右的

COORD pos = {BEG_X + 2, BEG_Y + HEI / 2};

system("color 0E");

system("mode con cols=90 lines=30");

hout = GetStdHandle(STD_OUTPUT_HANDLE);

printf(" ------------贪吃蛇的移动------------");

DrawBorder();

//自定义几个蛇的身体

AddBody(pos);

pos.X += 2;

AddBody(pos);

pos.X += 2;

AddBody(pos);

pos.X += 2;

AddBody(pos);

pos.X += 2;

AddBody(pos);

pos.X += 2;

AddBody(pos);

pos.X += 2;

AddBody(pos);

//控制蛇的移动

while(ctrl = getch())

{

switch(ctrl)

{

case 'w':

if(dir == DOWN)

continue;

dir = UP;

break;

case 's':

if(dir == UP)

continue;

dir = DOWN;

break;

case 'a':

if(dir == RIGHT)

continue;

dir = LEFT;

break;

case 'd':

if(dir == LEFT)

continue;

dir = RIGHT;

break;

case 'q':

return 0;

}

MoveBody(dir);

}

return 0;

}

(8)基于52单片机贪吃蛇游戏扩展阅读:

实现逻辑

1,可以设置光标,就能实现制定位置打印制定符号。

2,涉及一个结构体,包含两个元素坐标元素和一个结构体指针。

3,结构体串联形成链表,遍历获取成员坐标,打印符号得到蛇身。

4,不断的加头,去尾,重新遍历坐标,再打印形成蛇的移动。

5,食物产生的位置判定,不能越界,也不能与蛇身体重合。

6,蛇的转向判定,一条规则,不允许倒退。

7,转向的实现,跟行进方向决定新的关节坐标(当前头的上下左右)

8,死亡检测,是否头节点坐标是否与墙壁重合,是否与身体其他关节重合。

9,加速减速,设置刷新休眠时间实现。

阅读全文

与基于52单片机贪吃蛇游戏相关的资料

热点内容
没学历的怎么学编程 浏览:893
华为的隐藏相册无法加密 浏览:774
联通套餐app怎么设置 浏览:748
关于删除链表的算法描述 浏览:889
标准盘和压缩盘的区别 浏览:42
银行存款验证码JAVA编程 浏览:106
word转pdf软件免费版 浏览:137
公主连结安卓台服怎么下载 浏览:540
注册江苏银行app怎么注册 浏览:796
中兴怎么下载app视频 浏览:673
服务器审计是什么 浏览:514
华为删除的app怎么彻底卸载 浏览:570
编程时调试快捷键 浏览:4
安卓手机玩亚服怎么下载 浏览:337
思域压缩机多少钱 浏览:691
程序员代码合适吗 浏览:286
复利计算法律保护 浏览:741
代号f2服务器连接失败怎么搞 浏览:960
旋律云我的世界服务器靠谱吗 浏览:67
pdf降低大小 浏览:235