⑴ 貪吃蛇游戲----《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,加速減速,設置刷新休眠時間實現。