導航:首頁 > 操作系統 > 基於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單片機貪吃蛇游戲相關的資料

熱點內容
怎麼下郵政銀行app 瀏覽:244
不背單詞app單詞怎麼學習 瀏覽:479
程序員日常操作搞笑 瀏覽:379
android檢查是否安裝 瀏覽:373
蘋果手機編輯pdf文件 瀏覽:458
android系統名字 瀏覽:969
安卓手機如何進去有求必應屋 瀏覽:432
指數除法運演算法則底數不同 瀏覽:894
90壓縮干糧09壓縮干糧 瀏覽:516
android線程池框架 瀏覽:481
手機自帶解壓能解壓哪些文件 瀏覽:804
linux安裝hba驅動 瀏覽:119
java構造函數new 瀏覽:668
怎麼查家裡電器耗電量app 瀏覽:506
原神一直顯示重新連接伺服器怎麼辦 瀏覽:826
一般用途軸流式壓縮機 瀏覽:926
沒學歷的怎麼學編程 瀏覽:901
華為的隱藏相冊無法加密 瀏覽:782
聯通套餐app怎麼設置 瀏覽:752
關於刪除鏈表的演算法描述 瀏覽:894