STM32课程设计贪吃蛇

合集下载

c语言贪吃蛇课程设计

c语言贪吃蛇课程设计

c语言贪吃蛇课程设计一、教学目标本课程旨在通过学习C语言实现贪吃蛇游戏,让学生掌握C语言编程的基本技能,培养学生的逻辑思维能力和问题解决能力。

具体的教学目标如下:1.理解C语言的基本语法和数据类型。

2.掌握C语言的运算符和表达式。

3.学习C语言的控制结构,包括条件语句和循环语句。

4.了解C语言的函数和数组。

5.能够使用C语言编写简单的程序。

6.能够使用C语言实现贪吃蛇游戏的基本功能,包括蛇的移动、食物的生成和 collision检测。

7.能够优化代码,提高游戏的性能和可读性。

情感态度价值观目标:1.培养学生的团队合作意识和沟通能力,通过小组合作完成游戏项目。

2.培养学生的创新思维和问题解决能力,鼓励学生进行游戏的创意设计和优化。

3.培养学生的学习兴趣和自信心,通过完成游戏项目感受到编程的乐趣和成就感。

二、教学内容根据课程目标,本课程的教学内容主要包括C语言的基本语法和数据类型、运算符和表达式、控制结构、函数和数组。

具体的教学大纲如下:1.第一章:C语言概述•C语言的发展历史和特点•C语言的基本语法和结构2.第二章:数据类型和运算符•基本数据类型和变量•运算符和表达式3.第三章:控制结构4.第四章:函数和数组•函数的定义和调用•一维数组和多维数组5.第五章:贪吃蛇游戏实现•蛇的移动和食物的生成•collision检测和游戏结束条件•游戏界面的设计和美化三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用多种教学方法,包括讲授法、讨论法、案例分析法和实验法。

1.讲授法:通过教师的讲解和演示,向学生传授C语言的基本语法和编程技巧。

2.讨论法:通过小组讨论和分享,培养学生的团队合作意识和沟通能力。

3.案例分析法:通过分析具体的贪吃蛇游戏案例,引导学生思考和解决问题。

4.实验法:通过编写代码和调试程序,培养学生的动手能力和问题解决能力。

四、教学资源为了支持教学内容和教学方法的实施,本课程将准备以下教学资源:1.教材:《C语言程序设计》2.参考书:《C语言编程实例解析》3.多媒体资料:PPT课件、视频教程4.实验设备:计算机、编程环境(如Visual Studio、Code::Blocks等)通过以上教学资源的使用,将丰富学生的学习体验,提高学生的学习效果。

stm32贪食蛇程序

stm32贪食蛇程序

#include<stm32f10x_lib.h>#include"delay.h"#include"sys.h"#include"tft.h"#include"timer.h"#include"tackle.h"#define key1 PAin(0) //按键1#define key2 PAin(15) //按键2#define WinBoot 34 //上下界限#define WinBorder 29 //左右界限#define level1 400 //9种等级的延时时间#define level2 300#define level3 200#define level4 100#define level5 90#define level6 80#define level7 70#define level8 60#define level9 50extern const unsigned char picture[];u16 num = 0;u8 level = 1;u16 mscnt = 0, mscnt0 = 0; //时标u8 PressFlag = 0; //按键按下标志u16 delay_time = 0;u8 Goalx, Goaly;u8 HeadPoint_x, HeadPoint_y, TailPoint_x, TailPoint_y; u8 TurnPoint_x[100];u8 TurnPoint_y[100];u8 PointNum = 0;u8 dir = 0; //0:向右1:向左2:向上3:向下u8 GetGoal = 0;void JudgeDir(void);void JudgeGameOver(void);void JudgeGoal(void);void DisSnake(void);void CleanSnake(void);void Init(void);u16 SelectWin(void);void window(u16 xsta, u16 ysta, u16 xend, u16 yend);void desk1(u16, u16, u16);u16 desk0(u16);void Task0_MovePoint(void);void Task1_KeyScan1(void);void Task1_KeyScan2(void);int main(void){Init();while(1){if (mscnt == mscnt0){//此处无定义任何语句只是为了好看~ }else{mscnt0 = mscnt;Task0_MovePoint();Task1_KeyScan1();Task1_KeyScan2();}}}void Task1_KeyScan2(void){static u8 delay_2 = 0;static u8 stss = 0;delay_2++;switch (stss){case 0:if (!key2)stss = 1;delay_2 = 0;break;case 1:if (delay_2 > 5){if (!key2){stss = 2;PressFlag = 2;}elsestss = 0;}break;case 2:if (key2)stss = 0;delay_2 = 0;break;}}void Task1_KeyScan1(void){static u8 delay_1 = 0;static u8 sts = 0;delay_1++;switch (sts){case 0:if (key1)sts = 1;delay_1 = 0;break;case 1:if (delay_1 > 5){if (key1){sts = 2;PressFlag = 1;}elsests = 0;}break;case 2:if (!key1)sts = 0;delay_1 = 0;break;}}void Task0_MovePoint(void){static u16 delay_0 = 0;delay_0++;if(delay_0 > delay_time){delay_0 = 0;CleanSnake();JudgeDir();JudgeGoal();if (GetGoal == 1){Goalx = mscnt % (WinBorder);Goaly = mscnt % (WinBoot);DrawPoint2(Goalx*8, Goaly*8, OnePoint, 0xf801);GetGoal = 0;}DisSnake();JudgeGameOver();}}void CleanSnake(void){u8 i;if (PointNum == 0)CleanLinePoint(HeadPoint_x, HeadPoint_y, TailPoint_x, TailPoint_y);else{for (i = 0; i <= PointNum; i++){if (i == 0)CleanLinePoint(TurnPoint_x[0], TurnPoint_y[0], TailPoint_x, TailPoint_y);else if (i == PointNum)CleanLinePoint(HeadPoint_x, HeadPoint_y, TurnPoint_x[i - 1], TurnPoint_y[i - 1]);elseCleanLinePoint(TurnPoint_x[i], TurnPoint_y[i], TurnPoint_x[i - 1], TurnPoint_y[i - 1]);}}}void JudgeGoal(void){if(Goalx == HeadPoint_x && Goaly == HeadPoint_y){GetGoal = 1;if (dir == 0)HeadPoint_x++;else if(dir == 1)HeadPoint_x--;else if(dir == 2)HeadPoint_y--;elseHeadPoint_y++;num++;dis_num(42, 290, 0xf00f, 0xffff, num / 100);dis_num(50, 290, 0xf00f, 0xffff, num % 100 / 10);dis_num(58, 290, 0xf00f, 0xffff, num % 10);if (num%10 == 0){level++;if (level == 1)delay_time = level2;else if (level == 2)delay_time = level3;else if (level == 3)delay_time = level4;else if (level == 4)delay_time = level5;else if(level == 5)delay_time = level6;else if (level == 6)delay_time = level7;else if (level == 7)delay_time = level8;else if (level == 8)delay_time = level9;dis_num(178, 290, 0xf00f, 0xffff, level);}}}void JudgeGameOver(void){u16 color;if (HeadPoint_x == WinBorder + 1 || HeadPoint_y == WinBoot + 1 || HeadPoint_x == 0xff || HeadPoint_y == 0xff){LCD_Clear(0xffff);dis_str(80, 140, 0xf0ff, 0xffff, "Game Over");}if (dir == 0){color = read_point((HeadPoint_x + 1)* 8, HeadPoint_y * 8);if (color == 0xf800){LCD_Clear(0xffff);dis_str(80, 140, 0xf0ff, 0xffff, "Game Over");}}else if (dir == 1){color = read_point((HeadPoint_x - 1)* 8, HeadPoint_y * 8);if (color == 0xf800){LCD_Clear(0xffff);dis_str(80, 140, 0xf0ff, 0xffff, "Game Over");}}else if (dir == 2){color = read_point(HeadPoint_x*8, (HeadPoint_y - 1)*8);if (color == 0xf800){LCD_Clear(0xffff);dis_str(80, 140, 0xf0ff, 0xffff, "Game Over");}}else if (dir == 3)color = read_point(HeadPoint_x*8, (HeadPoint_y + 1)* 8);if (color == 0xf800){LCD_Clear(0xffff);dis_str(80, 140, 0xf0ff, 0xffff, "Game Over");}}}void DisSnake(void){u8 i = 0;if (PointNum == 0)LinePoint(HeadPoint_x, HeadPoint_y, TailPoint_x, TailPoint_y);else{for (i = 0; i <= PointNum; i++){if (i == 0)LinePoint(TurnPoint_x[0], TurnPoint_y[0], TailPoint_x, TailPoint_y);else if (i == PointNum)LinePoint(HeadPoint_x, HeadPoint_y, TurnPoint_x[i - 1], TurnPoint_y[i - 1]);elseLinePoint(TurnPoint_x[i], TurnPoint_y[i], TurnPoint_x[i - 1], TurnPoint_y[i - 1]);}}}void JudgeDir(void){u8 i = 0;if (PressFlag == 1){if (dir == 0 || dir == 1)dir = 2;else if (dir == 2 || dir == 3)dir = 1;TurnPoint_x[PointNum] = HeadPoint_x;TurnPoint_y[PointNum] = HeadPoint_y;PointNum++;PressFlag = 0;if (PressFlag == 2){if (dir == 0 || dir == 1)dir = 3;else if (dir == 2 || dir == 3)dir = 0;TurnPoint_x[PointNum] = HeadPoint_x;TurnPoint_y[PointNum] = HeadPoint_y;PointNum++;PressFlag = 0;}if (dir == 0){HeadPoint_x++;if(PointNum == 0){TailPoint_x++;}else{if (TurnPoint_x[0] == TailPoint_x){if (TurnPoint_y[0] > TailPoint_y){TailPoint_y++;if (TailPoint_y == TurnPoint_y[0]){for (i = 0; i < PointNum; i++){TurnPoint_x[i] = TurnPoint_x[i + 1];TurnPoint_y[i] = TurnPoint_y[i+ 1];}PointNum--;}}else{TailPoint_y--;if (TailPoint_y == TurnPoint_y[0]){for (i = 0; i < PointNum; i++){TurnPoint_x[i] = TurnPoint_x[i + 1];TurnPoint_y[i] = TurnPoint_y[i+ 1];}PointNum--;}}}else if (TurnPoint_y[0] == TailPoint_y){if (TurnPoint_x[0] > TailPoint_x){TailPoint_x++;if (TailPoint_x == TurnPoint_x[0]){for (i = 0; i < PointNum; i++){TurnPoint_x[i] = TurnPoint_x[i + 1];TurnPoint_y[i] = TurnPoint_y[i+ 1];}PointNum--;}}else{TailPoint_x--;if (TailPoint_x == TurnPoint_x[0]){for (i = 0; i < PointNum; i++){TurnPoint_x[i] = TurnPoint_x[i + 1];TurnPoint_y[i] = TurnPoint_y[i+ 1];}PointNum--;}}}}}if (dir == 1){HeadPoint_x--;if (PointNum == 0)TailPoint_x--;else{if (TurnPoint_x[0] == TailPoint_x){if (TurnPoint_y[0] > TailPoint_y){TailPoint_y++;if (TailPoint_y == TurnPoint_y[0]){for (i = 0; i < PointNum; i++){TurnPoint_x[i] = TurnPoint_x[i + 1];TurnPoint_y[i] = TurnPoint_y[i+ 1];}PointNum--;}}else{TailPoint_y--;if (TailPoint_y == TurnPoint_y[0]){for (i = 0; i < PointNum; i++){TurnPoint_x[i] = TurnPoint_x[i + 1];TurnPoint_y[i] = TurnPoint_y[i+ 1];}PointNum--;}}}else if (TurnPoint_y[0] == TailPoint_y){if (TurnPoint_x[0] > TailPoint_x){TailPoint_x++;if (TailPoint_x == TurnPoint_x[0]){for (i = 0; i < PointNum; i++){TurnPoint_x[i] = TurnPoint_x[i + 1];TurnPoint_y[i] = TurnPoint_y[i+ 1];}PointNum--;}}else{TailPoint_x--;if (TailPoint_x == TurnPoint_x[0]){for (i = 0; i < PointNum; i++){TurnPoint_x[i] = TurnPoint_x[i + 1];TurnPoint_y[i] = TurnPoint_y[i+ 1];}PointNum--;}}}}}if (dir == 2){HeadPoint_y--;if (PointNum == 0)TailPoint_y--;else{if (TurnPoint_x[0] == TailPoint_x){if (TurnPoint_y[0] > TailPoint_y){TailPoint_y++;if (TailPoint_y == TurnPoint_y[0]){for (i = 0; i < PointNum; i++){TurnPoint_x[i] = TurnPoint_x[i + 1];TurnPoint_y[i] = TurnPoint_y[i+ 1];}PointNum--;}}else{TailPoint_y--;if (TailPoint_y == TurnPoint_y[0]){for (i = 0; i < PointNum; i++){TurnPoint_x[i] = TurnPoint_x[i + 1];TurnPoint_y[i] = TurnPoint_y[i+ 1];}PointNum--;}}}else if (TurnPoint_y[0] == TailPoint_y){if (TurnPoint_x[0] > TailPoint_x){TailPoint_x++;if (TailPoint_x == TurnPoint_x[0]){for (i = 0; i < PointNum; i++){TurnPoint_x[i] = TurnPoint_x[i + 1];TurnPoint_y[i] = TurnPoint_y[i+ 1];}PointNum--;}}else{TailPoint_x--;if (TailPoint_x == TurnPoint_x[0]){for (i = 0; i < PointNum; i++){TurnPoint_x[i] = TurnPoint_x[i + 1];TurnPoint_y[i] = TurnPoint_y[i+ 1];}PointNum--;}}}}}if (dir == 3){HeadPoint_y++;if (PointNum == 0)TailPoint_y++;else{if (TurnPoint_x[0] == TailPoint_x){if (TurnPoint_y[0] > TailPoint_y){TailPoint_y++;if (TailPoint_y == TurnPoint_y[0]){for (i = 0; i < PointNum; i++){TurnPoint_x[i] = TurnPoint_x[i + 1];TurnPoint_y[i] = TurnPoint_y[i+ 1];}PointNum--;}}else{TailPoint_y--;if (TailPoint_y == TurnPoint_y[0]){for (i = 0; i < PointNum; i++){TurnPoint_x[i] = TurnPoint_x[i + 1];TurnPoint_y[i] = TurnPoint_y[i+ 1];}PointNum--;}}}else if (TurnPoint_y[0] == TailPoint_y){if (TurnPoint_x[0] > TailPoint_x){TailPoint_x++;if (TailPoint_x == TurnPoint_x[0]){for (i = 0; i < PointNum; i++){TurnPoint_x[i] = TurnPoint_x[i + 1];TurnPoint_y[i] = TurnPoint_y[i+ 1];}PointNum--;}}else{TailPoint_x--;if (TailPoint_x == TurnPoint_x[0]){for (i = 0; i < PointNum; i++){TurnPoint_x[i] = TurnPoint_x[i + 1];TurnPoint_y[i] = TurnPoint_y[i+ 1];}PointNum--;}}}}}}void Init(void){Stm32_Clock_Init(9);delay_init(72);init_lcd();init_key();init_timer(7199, 10);delay_time = SelectWin();LCD_Clear(0xffff);HeadPoint_x = 3;HeadPoint_y = 0;TailPoint_x = 0;TailPoint_y = 0;Goalx = mscnt % (WinBorder);Goaly = mscnt % (WinBoot);DrawPoint2(Goalx*8, Goaly*8, OnePoint, 0xf801);LinePoint(HeadPoint_x, HeadPoint_y, TailPoint_x, TailPoint_y);DrawLine(280, 0xf00f);dis_str(10, 290, 0xf00f, 0xffff, "num:000");dis_str(130, 290, 0xf00f, 0xffff, "level:");dis_num(178, 290, 0xf00f, 0xffff, level);mscnt = mscnt0;}u16 SelectWin(void){u16 time;u16 col;u8 desk = 0;u8 sel = 0;u16 h;u16 level_x = 70, level_y = 35;col = picture[8]+ (picture[8 + 1] << 8);h = desk0(col);DrawPoint2(80, h + 15, OnePoint,0xf800);time = level1;while(1){if (desk == 0){if (key1){delay_ms(5);if (key1){while(key1);if (sel%2 == 0)break;else{desk1(col, level_x, level_y);desk = 1;}}}if (!key2){delay_ms(5);if (!key2){while(!key2);sel++;if (sel%2 == 1){DrawPoint2(80, h + 45, OnePoint, 0xf800);DrawPoint2(80, h + 15, OnePoint, col);}else{DrawPoint2(80, h + 15, OnePoint, 0xf800);DrawPoint2(80, h + 45, OnePoint, col);}}}}else{if (key1){delay_ms(5);if (key1){while(key1)desk = 0;desk0(col);DrawPoint2(80, h + 15, OnePoint,0xf800);sel = 0;}}if (!key2){delay_ms(5);if (!key2){while(!key2);DrawPoint2(level_x, level_y, OnePoint, col);level_y = level_y + 30;if (level_y > 280)level_y = 35;DrawPoint2(level_x, level_y, OnePoint, 0xf800);if (level_y == 35){time = level1;level = 1;}else if (level_y == 65){time = level2;level = 2;}else if (level_y == 95){time = level3;level = 3;}else if (level_y == 125){time = level4;level = 4;}else if (level_y == 155){time = level5;level = 5;}else if (level_y == 185){time = level6;level = 6;}else if (level_y == 215){time = level7;level = 7;}else if (level_y == 245){time = level8;level = 8;}else if (level_y == 275){time = level9;level = 9;}}}}}return time;}u16 desk0(u16 col){u16 w, h;LCD_Clear(col);w = picture[2] + (picture[3] << 8);h = picture[4] + (picture[5] << 8);window(45, 0, 45 + w, 0 + h);dis_str(100, h + 10, 0x0000, col, "Start");dis_str(100, h + 40, 0x0000, col, "Level");return h;}void desk1(u16 col, u16 level_x, u16 level_y){LCD_Clear(col);dis_str(90, 30, 0x0000, col, "Level1");dis_str(90, 60, 0x0000, col, "Level2");dis_str(90, 90, 0x0000, col, "Level3");dis_str(90, 120, 0x0000, col, "Level4");dis_str(90, 150, 0x0000, col, "Level5");dis_str(90, 180, 0x0000, col, "Level6");dis_str(90, 210, 0x0000, col, "Level7");dis_str(90, 240, 0x0000, col, "Level8");dis_str(90, 270, 0x0000, col, "Level9");DrawPoint2(level_x, level_y, OnePoint, 0xf800);}void window(u16 xsta, u16 ysta, u16 xend, u16 yend){u16 i, j, x = 0;u16 col;for (j = ysta; j < yend; j++){wr_reg(0x0020, xsta);wr_reg(0x0021, j);wr_com(0x22);for (i = xsta; i < xend; i++){col = picture[8 + x]+ (picture[8 + x + 1] << 8);wr_da(col);x = x + 2;}}}void TIM3_IRQHandler(void) {if (TIM3->SR & (1 << 0)){mscnt++;TIM3->SR &= ~(1 << 0);}}。

贪吃蛇c语言课程设计

贪吃蛇c语言课程设计

贪吃蛇c语言课程设计一、课程目标知识目标:1. 让学生掌握C语言的基本语法和编程结构,能独立编写简单的贪吃蛇游戏程序。

2. 使学生理解贪吃蛇游戏的逻辑和算法,并能运用所学知识对其进行分析和优化。

3. 帮助学生了解计算机图形处理原理,学会使用C语言进行简单的图形绘制。

技能目标:1. 培养学生运用C语言进行问题求解的能力,特别是针对游戏编程的逻辑思维和算法设计能力。

2. 提高学生分析问题和解决问题的能力,通过编写贪吃蛇游戏,熟练运用循环、条件判断等基本编程结构。

3. 培养学生团队协作和沟通能力,能够在小组合作中共同完成课程设计任务。

情感态度价值观目标:1. 激发学生对计算机编程的兴趣和热情,培养良好的编程习惯和严谨的科学态度。

2. 培养学生面对困难和挑战时,勇于尝试、不断探索的精神,增强自信心和自我成就感。

3. 通过课程设计,引导学生体验编程带来的快乐,培养学生积极向上的学习态度和团队精神。

课程性质分析:本课程设计以实践为主,注重培养学生的动手能力和编程思维,结合贪吃蛇游戏这一趣味性课题,提高学生对C语言的兴趣。

学生特点分析:考虑到学生所在年级,已具备一定的C语言基础,但编程实践能力和问题求解能力有待提高,因此课程设计需兼顾知识巩固和技能提升。

教学要求:课程设计应注重理论与实践相结合,充分调动学生的主观能动性,鼓励学生自主探究和团队合作,以提高学生的编程能力和综合素质。

二、教学内容1. C语言基础知识回顾:变量、数据类型、运算符、控制结构(循环、分支)等基本概念。

2. 函数的定义和使用:重点复习和巩固函数的定义、调用、参数传递等知识,为编写模块化程序打下基础。

3. 数组和字符串操作:学习数组的使用,了解字符串处理的基本方法,为处理游戏中的数据结构做准备。

4. 指针的概念和应用:理解指针的基本概念,掌握指针在数组、字符串等中的应用。

5. 图形编程基础:介绍C语言图形库的使用,学习基本的图形绘制函数,如画点、画线等。

嵌入式课设实验报告——贪吃蛇

嵌入式课设实验报告——贪吃蛇

题目:贪吃蛇游戏设计专业:电子信息工程班级:姓名:、成绩:导师签字:年月日任务书题目:贪吃蛇游戏设计参数:供电电源电压3.3V矩形墙壁的位置坐标(20,20)(200,200)蛇的初始位置坐标(40,20)(30,20)(20,20)蛇的每一节为边长为10的矩形要求:利用嵌入式开发系统设计一个贪吃蛇的小游戏。

开始显示为初始界面,然后开始进行游戏。

游戏开始出现3节的蛇,一个食物,右边显示得分。

当进入游戏后,蛇自动向右前行。

通过按键上下左右来控制蛇前行的方向,当蛇吃到食物后,得分加100分,蛇身体变长一节。

当蛇在游行过程中撞到墙壁或者自身则游戏结束。

日程安排:6月30日:选择课设题目、查阅资料、完成第一步。

7月1、2日:完成方案设计。

即提出设计思路与软硬件的设计方案。

7月3、4日:学习硬件原理7月7、8、9日:根据软件设计方案做软件。

7月10日:测试7月11日:完成论文目录第一章课题研究······························· 1.1研究目的······································ 1.2研究背景······································ 1.3主要研究内容··································第二章设计思路及方案设计····················· 2.1设计思路······································ 2.1.1实现功能································· 2.1.2各功能的实现方法························· 2.1.3硬件说明································· 2.1.4软件说明································· 2.2硬件设计······································ 2.3软件设计······································第三章硬件设计······························· 3.1处理器最小系统································ 3.2硬件基本电路··································3.2.1按键····································· 3.2.2 LCD····································· 3.2.3 USB接口与电源···························第四章软件设计·······························第五章调试与测试·····························5.1调试··········································5.2测试··········································第六章结论···································参考文献······································第一章课题研究1.1研究目的为了巩固所学嵌入式系统的基础知识,加强实际应用和动手实践能力,开始为期2周的课程设计。

单片机课程设计(贪吃蛇)

单片机课程设计(贪吃蛇)

单片机课程设计报告(贪吃蛇)院校:专业:班级:姓名:学号:指导老师:设计日期:一、选题的背景与意义单片微型机简称单片机,它是在一片芯片上集成了中央处理部件,存储器、定时器/计数器和各种输入输出设备等接口部件。

单片机是微机发展的一个重要的分支,自问世以来,性能不断地改善和提高,加之单片机具有集成度高、功能强、速度快、体积小、功耗小、使用方便、性能可靠、价格便宜等优点,故在工业控制、数据采集和处理、通信系统、家用电器等领域的应用日益广泛。

国内虽然起步较晚,但单片机的潜力越来越被人们所重视,尤其在工业控制、自动化仪器仪表、计算机系统接口、智能化外设等应用领域发展很快。

它的应用对于产品升级换代、机电一体化都具有重要的意义,在工业生产中,电流、电压、温度、压力、流量、流速和开关量都是常用的主要被控参数,被用于各种不同产品的生产。

在通信行业更为广泛利用,手机从只能基本通话,到现在一台手机拥有各种不同的功能,单片机得到了广泛的应用。

手机可以听音乐,听收音机,玩游戏,照相片等等,比较流行的手机游戏贪吃蛇就能用单片机实现。

二、研究的基本内容与拟解决的主要问题贪吃蛇游戏设计主要硬件由单片机最小系统,8*8点阵,4个方向按键,7805稳压电路,整个的游戏设计外围电路比较少,主要核心在于游戏的程序设计,本设计的游戏规则也参照现在手机流行的贪吃蛇游戏的规则去设计,当蛇吃到食物时,蛇身就会自动增加一格,食物随机出现在屏幕上,当蛇碰到墙壁时,游戏结束。

本设计需要考虑的问题有以下几个:1.8*8点阵的选择2.保证游戏的流畅性和及时响应性3.游戏的设计应该接近人性化贪吃蛇初始化子程序流程图贪吃蛇运行子程序是整个程序设计的核心,首先由系统检测是否有按键按下,确定有按键按下后,外部中断程序自动执行,开始扫描矩阵键盘,得到键值,根据键值判断贪吃蛇要走的方向。

在游戏运行的期间,系统不断检测蛇是否死亡,蛇是否已经最长,蛇是否吃到了食物。

若蛇已经死亡,则蛇的死亡标记位被置位,跳转到死亡界面,检测是否有按键按下,有就跳转到游戏开始界面,重新开始游戏,无则等到有任意键按下。

贪吃蛇游戏c课程设计

贪吃蛇游戏c课程设计

贪吃蛇游戏c 课程设计一、教学目标本课程旨在通过学习贪吃蛇游戏的设计与实现,让学生掌握C语言编程的基本语法和逻辑结构,培养学生的编程思维和问题解决能力。

具体目标如下:1.掌握C语言的基本语法和数据类型。

2.理解函数的定义和调用。

3.学习控制流程和数组的使用。

4.了解面向对象编程的基本概念。

5.能够运用C语言编写简单的程序。

6.具备分析和解决问题的能力。

7.能够独立完成贪吃蛇游戏的设计和实现。

情感态度价值观目标:1.培养学生的创新意识和团队合作精神。

2.增强学生对计算机科学的兴趣和热情。

3.培养学生的自主学习和持续学习的能力。

二、教学内容本课程的教学内容主要包括C语言的基本语法、数据类型、函数、控制流程和数组等。

具体安排如下:1.C语言的基本语法和数据类型:介绍C语言的基本结构和数据类型,包括变量、常量、运算符等。

2.函数的定义和调用:学习函数的声明、定义和调用,包括返回值和参数传递等。

3.控制流程:掌握条件语句、循环语句和开关语句的使用,学会编写分支和循环结构程序。

4.数组的使用:学习一维和多维数组的定义和操作,掌握数组的遍历和排序等基本操作。

5.面向对象编程:引入面向对象编程的基本概念,学习类的定义和对象的创建,掌握封装、继承和多态等特性。

6.贪吃蛇游戏的设计和实现:通过项目实践,引导学生运用所学知识设计和实现一个简单的贪吃蛇游戏,培养学生的编程能力和问题解决能力。

三、教学方法本课程采用讲授法、案例分析法和实验法等多种教学方法,以激发学生的学习兴趣和主动性。

1.讲授法:通过教师的讲解和演示,系统地传授C语言的基本语法和编程技巧。

2.案例分析法:通过分析典型案例,让学生理解和掌握C语言编程的关键点。

3.实验法:通过编写和调试程序,让学生亲自动手实践,培养学生的编程能力和问题解决能力。

四、教学资源本课程的教学资源包括教材、参考书、多媒体资料和实验设备等。

1.教材:选择一本适合学生水平的C语言教材,作为学习的基础资源。

贪吃蛇课程设计

贪吃蛇课程设计

贪吃蛇课程设计一、课程设计任务贪吃蛇程序设计二、设计要求通过游戏程序设计,提高编程兴趣与编程思路,巩固C语言中所学的知识(1).收集资料,分析课题,分解问题,形成总体设计思路;(2).对于设计中用到的关键函数,要学会通过查资料,弄懂其用法,要联系问题进行具体介绍;(3).上机调试,查错,逐步分析不能正常运行的原因,确保所设计的程序正确,并且能正常运行;(4).完成课程设计报告三、需求分析3.1、程序功能贪吃蛇游戏是一个经典小游戏,一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。

3.2、设计思想程序关键在于表示蛇的图形及蛇的移动。

用一个小矩形快表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用俩节表示。

移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新蛇的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后一节用背景色覆盖。

食物的出现与消失也是画矩形块和覆盖矩形块。

为了便于理解,定义两个结构体:食物与蛇。

3.3、流程图四、设计的具体实现#define N 200#include <graphics.h>#include <stdlib.h>#include <dos.h>#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800#define ESC 0x011bint i,key;int score=0;/*得分*/int gamespeed=50000;/*游戏速度自己调整*/ struct Food{int x;/*食物的横坐标*/int y;/*食物的纵坐标*/int yes;/*判断是否要出现食物的变量*/}food;/*食物的结构体*/struct Snake{int x[N];int y[N];int node;/*蛇的节数*/int direction;/*蛇移动方向*/int life;/* 蛇的生命,0活着,1死亡*/}snake;void Init(void);/*图形驱动*/void Close(void);/*图形结束*/void DrawK(void);/*开始画面*/void GameOver(void);/*结束游戏*/void GamePlay(void);/*玩游戏具体过程*/ void PrScore(void);/*输出成绩*//*主函数*/void main(void){Init();/*图形驱动*/DrawK();/*开始画面*/GamePlay();/*玩游戏具体过程*/Close();/*图形结束*/}/*图形驱动*/void Init(void){int gd=DETECT,gm;initgraph(&gd,&gm,"c:\\tc");cleardevice();}/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/ void DrawK(void){/*setbkcolor(LIGHTGREEN);*/setcolor(11);setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/for(i=50;i<=600;i+=10)/*画围墙*/{rectangle(i,40,i+10,49); /*上边*/rectangle(i,451,i+10,460);/*下边*/}for(i=40;i<=450;i+=10){rectangle(50,i,59,i+10); /*左边*/rectangle(601,i,610,i+10);/*右边*/}}/*玩游戏具体过程*/void GamePlay(void){randomize();/*随机数发生器*/food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/snake.life=0;/*活着*/snake.direction=1;/*方向往右*/snake.x[0]=100;snake.y[0]=100;/*蛇头*/snake.x[1]=110;snake.y[1]=100;snake.node=2;/*节数*/PrScore();/*输出得分*/while(1)/*可以重复玩游戏,压ESC键结束*/{while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/{if(food.yes==1)/*需要出现新食物*/{food.x=rand()%400+60;food.y=rand()%350+60;/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/while(food.x%10!=0)food.x++;while(food.y%10!=0)food.y++;food.yes=0;/*画面上有食物了*/}if(food.yes==0)/*画面上有食物了就要显示*/{setcolor(GREEN);rectangle(food.x,food.y,food.x+10,food.y-10);}/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/for(i=snake.node-1;i>0;i--){snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1];}/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/switch(snake.direction){case 1:snake.x[0]+=10;break;case 2: snake.x[0]-=10;break;case 3: snake.y[0]-=10;break;case 4: snake.y[0]+=10;break;}/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/ for(i=3;i<snake.node;i++){if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0]){GameOver();/*显示失败*/snake.life=1;break;}}if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||snake.y[0]>455)/*蛇是否撞到墙壁*/{GameOver();/*本次游戏结束*/snake.life=1; /*蛇死*/}if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/ break;if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/{setcolor(0);/*把画面上的食物东西去掉*/rectangle(food.x,food.y,food.x+10,food.y-10);snake.x[snake.node]=-20;snake.y[snake.node]=-20;/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/snake.node++;/*蛇的身体长一节*/food.yes=1;/*画面上需要出现新的食物*/score+=10;PrScore();/*输出新得分*/}setcolor(4);/*画出蛇*/for(i=0;i<snake.node;i++)rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10);delay(gamespeed);setcolor(0);/*用黑色去除蛇的的最后一节*/rectangle(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);} /*endwhile(!kbhit)*/if(snake.life==1)/*如果蛇死就跳出循环*/break;key=bioskey(0);/*接收按键*/if(key==ESC)/*按ESC键退出*/break;elseif(key==UP&&snake.direction!=4)/*判断是否往相反的方向移动*/snake.direction=3;elseif(key==RIGHT&&snake.direction!=2)snake.direction=1;elseif(key==LEFT&&snake.direction!=1)snake.direction=2;elseif(key==DOWN&&snake.direction!=3)snake.direction=4;}/*endwhile(1)*/}/*游戏结束*/void GameOver(void){cleardevice();PrScore();setcolor(RED);settextstyle(0,0,4);outtextxy(200,200,"GAME OVER");getch();}/*输出成绩*/void PrScore(void){char str[10];setfillstyle(SOLID_FILL,YELLOW);bar(50,15,220,35);setcolor(6);settextstyle(0,0,2);sprintf(str,"score:%d",score);outtextxy(55,20,str);}/*图形结束*/void Close(void){getch();closegraph();}五、调试及解决方法可以按照程序运行的错误提示对原程序进行修改,在调试过程中有时也会遇到不懂的问题,我们去图书馆或上网查阅一些资料也解决了序一一修改直到运行成功。

c程序贪吃蛇课程设计

c程序贪吃蛇课程设计

c程序贪吃蛇课程设计一、课程目标知识目标:1. 学生能理解C语言中数组、函数、循环和条件语句的基本概念及应用。

2. 学生能够运用C语言编写简单的贪吃蛇游戏,理解游戏逻辑和程序结构。

3. 学生了解如何在C程序中处理键盘输入和图形界面输出。

技能目标:1. 学生掌握利用C语言进行结构化编程,培养解决问题的能力。

2. 学生能够运用调试工具检查和修正程序中的错误,提高程序调试能力。

3. 学生通过团队协作完成项目,提高沟通与协作能力。

情感态度价值观目标:1. 学生培养对编程的兴趣,激发学习计算机科学的热情。

2. 学生通过编写游戏程序,体会编程的乐趣和挑战,形成积极的学习态度。

3. 学生在团队协作中学会相互尊重、支持和鼓励,培养集体荣誉感。

课程性质分析:本课程为实践性较强的课程设计,通过贪吃蛇游戏的开发,让学生将所学的C 语言知识应用于实际项目中,提高编程能力和实际问题解决能力。

学生特点分析:考虑到学生为初学者,课程设计将从简单到复杂逐步引导,使学生在已有知识基础上,逐步掌握C语言的高级应用。

教学要求:1. 教师应注重理论与实践相结合,指导学生完成课程设计。

2. 教学过程中,强调学生自主探究和团队协作,培养学生独立思考和解决问题的能力。

3. 教师应及时给予反馈,帮助学生不断调整和完善课程设计,提高学习效果。

二、教学内容1. C语言基础知识复习:数组、函数、指针、循环和条件语句等基本概念。

相关教材章节:第1章-第4章2. 游戏逻辑设计:- 蛇的移动原理。

- 食物的随机生成。

- 判断撞墙和自撞逻辑。

相关教材章节:第6章-第7章3. 图形界面输出:- 使用标准库函数进行图形界面输出。

- 蛇和食物的图形表示。

相关教材章节:第9章4. 键盘输入处理:- 键盘事件监听。

- 响应按键改变蛇的移动方向。

相关教材章节:第8章5. 程序结构设计:- 模块化编程,划分功能函数。

- 程序流程控制。

相关教材章节:第5章6. 调试与优化:- 使用调试工具进行程序调试。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

STM32大作业报告学生:学号:所在院系:光电信息与计算机工程学院专业班级:授课教师:完成时间:2016年前言随着科学技术的不断进步,嵌入式近些年来逐渐兴起,其领域比较新,发展非常迅速,由于它属于新兴领域,接触的人并不是很多,但是嵌入式在各种电子设备上的应用越来越越广泛,并且各种电子设备也在朝着嵌入式微系统,智能化的方向前进。

STM32系列是基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M核。

作为21世纪的人才,为了与社会实际需要相衔接,提高我们的学习兴趣,利用STM32系列单片机进行了一次嵌入式系统设计。

摘要在本次作业中采用STM32系列中的STM32F103RCT6微控制器芯片,采用ALIENTEK战舰STM32开发板,使用MiniSTM32开发板上的LCD 接口,来点亮TFTLCD,实现触摸屏功能。

一、课程设计任务要求本次的课程设计目的是实现一个经典的贪吃蛇游戏,整个游戏实现功能分别为:1、初始化程序。

2、随机红点、左转、右转、判断边框。

二、系统硬件设计硬件设计原理图根据此硬件设计图再结合软件设计就能做出此游戏。

三、系统软件实现此次的课程设计在于开发个贪吃蛇游戏,其流程图如下图所示。

程序流程图为方便介绍,此软件实现只给出主要程序部分:1、本例程提供了硬件平台的初始化GPIO是常规输入/输出端口,STM32F103RCT6有PA、PB、PC、PD、PE 共5个16位的GPIO。

STM32的GPIO都可编程,具有很多复用功能。

GPIO 可以配置为很多总模式,这些模式有:输入浮空、输入上拉、输入下拉、模拟输入、开漏输入、推挽输出、推挽复用、开漏复用。

通过对GPIO寄存器编程,可以设置每个端口的工作模式。

24C02 EEPROM是开发板板载的2Kbit(256 个字节)EEPROM ,型号为:24C02,用于掉电数据保存。

因为STM32 部没有EEPROM,所开发板外扩了24C02,用于存储重要数据,用来做IIC 实验,该芯片直接挂在STM32 的IO 口上。

IIC(Inter-Integrated Circuit)总线是一种由PHILIPS 公司开发的两线式串行总线,用于连接微控制器及其外围设备。

它是由数据线SDA 和时钟SCL 构成的串行总线,可发送和接收数据。

在CPU 与被控IC 之间、IC 与IC 之间进行双向传送,高速IIC 总线一般可达400kbps 以上。

IIC 总线在传送数据过程中共有三种类型信号,它们分别是:开始信号、结束信号和应答信号。

开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。

结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。

应答信号:接收数据的IC 在接收到8bit 数据后,向发送数据的IC 发出特定的低电平脉冲,表示已收到数据。

CPU 向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU 接收到应答信号后,根据实际情况作出是否继续传递信号的判断。

若未收到应答信号,由判断为受控单元出现故障。

/********************************************************************* 名称:AT24CXX_Init(void)* 功能:初始化IIC接口********************************************************************///初始化IIC接口void AT24CXX_Init(void){IIC_Init();}void IIC_Init(void){GPIO_InitTypeDef GPIO_InitStructure;//RCC->APB2ENR|=1<<4;//先使能外设IO PORTC时钟RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE );GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);IIC_SCL=1;IIC_SDA=1;}/******************************************************************** 名称:void CMLCD_Init(void)* 功能:初始化触摸屏的硬件接口********************************************************************/void CMLCD_Init(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能PORTC时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_3|GPIO_Pin_13;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置成推免输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC 0 3 13GPIO_InitStructure.GPIO_Pin =GPIO_Pin_2|GPIO_Pin_1; //初始化GPIOC 2 1 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);TPEN=1;}2、贪吃蛇功能控制SPI是串行外设端口,是一种同步串行外设端口,它可以使MCU与各种外围设备以串行方式进行通信、交换信息。

STM32的SPI支持全双工同步传输,可选择以8或16位传输帧格式进行传输,支持多种模式。

USART为STM32的同步异步接收器。

它提供了一种灵活的方法与使用异步串行数据格式的外部设备之间进行全双工数据交换。

USART利用分数波特率发生器提供宽围的波特率选择。

另外,它还允许多处理器通信。

USART也可以使用DMA方式直接将接受的数据存储到存或从存中批量发送数据,也支持多种中断方式。

TFT-LCD 即薄膜晶体管液晶显示器。

其英文全称为:Thin Film Transistor-Liquid CrystalDisplay。

TFT-LCD 与无源TN-LCD、STN-LCD 的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。

TFT-LCD 也被叫做真彩液晶显示器。

ALIENTEK 提供的2.8寸TFTLCD 模块,其驱动芯片有很多种类型,比如有:ILI9341/ILI9325/RM68042/RM68021/ILI9320/ILI9328/LGDP4531/LGD P4535/SPFD5408/SSD1289/1505/B505/C505/NT35310/NT35510 等。

LED(DS0 和DS1)。

其电路在ALIENTEK MiniSTM32开发板上默认是已经连接好了的。

DS0接PA8,DS1接PD2。

/********************************************************************* 名称:int main(void)* 功能:主函数********************************************************************/ #include "led.h"#include "delay.h"#include "sys.h"#include "usart.h"#include "lcd.h"#include "tanchishe.h"#include "cmlcd.h"#include "timeit.h"#include "stdlib.h"//画一个大点(2*2的点)//x,y:坐标//color:颜色void TP_Draw_Big_Point(u16 x,u16 y,u16 color){POINT_COLOR=color;LCD_DrawPoint(x,y);//中心点LCD_DrawPoint(x+1,y);LCD_DrawPoint(x,y+1);LCD_DrawPoint(x+1,y+1);}int main(void){u8 sta,sta1;u16 rand_color;delay_init(); //延时函数初始化uart_init(9600); //串口初始化为9600LED_Init(); //初始化与LED连接的硬件接口LCD_Init();time_init();CMLCD_Init(); // 触摸屏初始化AT24CXX_Init(); //eeprom 初始化sta1=TP_Get_Adjdata();if(!sta1){sta=CMLCD_Adjust();if(sta){TP_Save_Adjdata(); //校准成功就保存参数LCD_ShowString(40,40,100,16,16,"SUCCESSFUL!");}else{LCD_ShowString(40,40,100,16,16,"NO SUCCESSFUL!");}}TABCHISHE_Init();while(1){delay_ms(500);//产生随机坐标if(snake.eat_sta){snake.eat_sta=0;snake.rand_x=8*(1+(int)(29.0*rand()/(RAND_MAX+1.0)));snake.rand_y=8*(1+(int)(34.0*rand()/(RAND_MAX+1.0)));rand_color=LCD_ReadPoint(snake.rand_x,snake.rand_y);while(rand_color==BLUE) //随机点不能是蛇身上的点{snake.rand_x=8*(1+(int)(29.0*rand()/(RAND_MAX+1.0)));snake.rand_y=8*(1+(int)(34.0*rand()/(RAND_MAX+1.0)));rand_color=LCD_ReadPoint(snake.rand_x,snake.rand_y);}LCD_Fill(snake.rand_x,snake.rand_y,snake.rand_x+snake.size,snake.rand_y+snake.size,RED);}LED0=!LED0;TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE ); //关中断防止中断服务函数对显示坐标的影响snake.eat_sta=show(snake.d1);disappear(snake.d2,turn);TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //开中断}}/******************************************************************** 名称:void TABCHISHE_Init(void)* 功能:贪吃蛇初始化********************************************************************/void TABCHISHE_Init(void){Shuzu_Init(turn); // 转向数组初始化LCD_Clear(WHITE);POINT_COLOR=RED;LCD_DrawLine(0,282, 240, 282);LCD_DrawLine(120,280, 120, 320);LCD_ShowString(20,290,72,12,12,"left/down");LCD_ShowString(20,303,36,12,12,"score:");LCD_ShowString(140,290,64,12,12,"right/up");// 以下为贪吃蛇程序初始化LCD_Fill(120,160,136,168,BLUE); //一开始蛇长度为2个SIZEsnake.eat_sta=0;snake.length=2;LCD_ShowxNum(56,303,snake.length,3,12,0x80);snake.max=MAX;snake.size=8;snake.d1=0;snake.d2=0;snake.x1=128;snake.x2=snake.x1+snake.size;snake.y1=160;snake.y2=snake.y1 +snake.size;snake.X1=112;snake.X2=snake.X1+snake.size;snake.Y1=160;snake.Y2=snake.Y1+s nake.size;snake.rand_x=8*(1+(int)(29.0*rand()/(RAND_MAX+1.0)));snake.rand_y=8*(1+(int)(34.0*rand()/(RAND_MAX+1.0)));LCD_Fill(snake.rand_x,snake.rand_y,snake.rand_x+snake.size,snake.rand_y+snake.si ze,RED);}/******************************************************************** 名称:void disappear(u8 d,u16 turn[MAX][3])* 功能:贪吃蛇移动尾部消失格子********************************************************************///新消失的一格//参数:往左消失,往右消失void disappear(u8 d,u16 turn[MAX][3]){int i=0;if(d==0) //默认方向为从左到右{snake.X1=snake.X1+snake.size;snake.X2=snake.X2+snake.size;LCD_Fill(snake.X1,snake.Y1,snake.X2,snake.Y2,WHITE); //新显示的一格}else if(d==1) //方向为下到上{snake.Y1=snake.Y1-snake.size;snake.Y2=snake.Y2-snake.size;LCD_Fill(snake.X1,snake.Y1,snake.X2,snake.Y2,WHITE); //新显示的一格}else if(d==2) //方向为右到左{snake.X1=snake.X1-snake.size;snake.X2=snake.X2-snake.size;LCD_Fill(snake.X1,snake.Y1,snake.X2,snake.Y2,WHITE); //新显示的一格}else if(d==3) //方向为上到下{snake.Y1=snake.Y1+snake.size;snake.Y2=snake.Y2+snake.size;LCD_Fill(snake.X1,snake.Y1,snake.X2,snake.Y2,WHITE); //新显示的一格}for(i=0;i<MAX;i++) //先判断是否是转方向点{if(snake.X1==turn[i][0]&&snake.Y1==turn[i][1]){snake.d2=turn[i][2];turn[i][0]=400; //转向完毕清除记录的坐标(将坐标变为LCD以外区域)turn[i][1]=400;break;}}}/******************************************************************** 名称:u8 show(u8 d)* 功能:贪吃蛇移动前部新增格子********************************************************************///新显示的一格//参数:往左显示,往右显示u8 show(u8 d){static u8 i=0;u16 color,color1;//判断是否撞到自己的身体if(d==0){color=LCD_ReadPoint(snake.x2+4,snake.y2-4);color1=LCD_ReadPoint(snake.x2+3,snake.y2-3);if(color==BLUE&&color1==BLUE){LCD_ShowString(40,40,100,16,16,"NO SUCCESSFUL!");printf("color%x color1%x\r\n",color,color1);printf("shezhuangziji0\r\n");delay_ms(5000);TABCHISHE_Init();d=snake.d1;}}else if(d==1){color=LCD_ReadPoint(snake.x1+4,snake.y1-4);color1=LCD_ReadPoint(snake.x1+3,snake.y1-3);if(color==BLUE&&color1==BLUE){LCD_ShowString(40,40,100,16,16,"NO SUCCESSFUL!");printf("color%x color1%x\r\n",color,color1);printf("shezhuangziji1%d %d %d\r\n",snake.d1,snake.d2,d);delay_ms(5000);TABCHISHE_Init();d=snake.d1;printf("%d %d %d\r\n",snake.d1,snake.d2,d);}}else if(d==2){color=LCD_ReadPoint(snake.x1-4,snake.y1+4);color1=LCD_ReadPoint(snake.x1-3,snake.y1+3);if(color==BLUE&&color1==BLUE){LCD_ShowString(40,40,100,16,16,"NO SUCCESSFUL!");printf("color%x color1%x\r\n",color,color1);printf("shezhuangziji2\r\n");delay_ms(5000);TABCHISHE_Init();d=snake.d1;}}else if(d==3){color=LCD_ReadPoint(snake.x2-4,snake.y2+4);color1=LCD_ReadPoint(snake.x2-3,snake.y2+3);if(color==BLUE&&color1==BLUE){LCD_ShowString(40,40,100,16,16,"NO SUCCESSFUL!");printf("color%x color1%x\r\n",color,color1);printf("shezhuangziji3\r\n");delay_ms(5000);TABCHISHE_Init();d=snake.d1;}}if((snake.y1==0&&d==1)||(snake.x1==0&&d==2)||(snake.y2==280&&d==3)|| (snake.x2==240&&d==0)) //蛇撞到墙了{LCD_ShowString(40,40,100,16,16,"NO SUCCESSFUL!");printf("shezhuangqiang\r\n");delay_ms(5000);TABCHISHE_Init();d=snake.d1;}if(snake.rand_x==snake.x1&&snake.rand_y==snake.y1) //判断是否增加长度即碰到随机点{i=1;if(snake.d2==0){snake.X1-=16;snake.X2-=16;} //在尾端增加一格else if(snake.d2==1){snake.Y1+=16;snake.Y2+=16;}else if(snake.d2==2){snake.X1+=16;snake.X2+=16;}else if(snake.d2==3){snake.Y1-=16;snake.Y2-=16;}snake.length++;LCD_ShowxNum(56,303,snake.length,3,12,0x80);}if(d==0) //默认方向为从左到右{snake.x1=snake.x1+snake.size;snake.x2=snake.x2+snake.size;LCD_Fill(snake.x1,snake.y1,snake.x2,snake.y2,BLUE); //新显示的一格}else if(d==1) //方向为下到上{snake.y1=snake.y1-snake.size;snake.y2=snake.y2-snake.size;LCD_Fill(snake.x1,snake.y1,snake.x2,snake.y2,BLUE); //新显示的一格}else if(d==2) //方向为右到左{snake.x1=snake.x1-snake.size;snake.x2=snake.x2-snake.size;LCD_Fill(snake.x1,snake.y1,snake.x2,snake.y2,BLUE); //新显示的一格}else if(d==3) //方向为上到下{snake.y1=snake.y1+snake.size;snake.y2=snake.y2+snake.size;LCD_Fill(snake.x1,snake.y1,snake.x2,snake.y2,BLUE); //新显示的一格}if(i==1){ i=0;return 1;}return 0;}/******************************************************************** 名称:void CM_Scan()* 功能:触摸屏扫描函数********************************************************************/void CM_Scan(){static u8 times=0;static u8 i=0;if(TPEN==0&&!times){times=1;if(CMLCD_GetLCD()) //取坐标成功后再选择是否转向{if(cmlcdxy.X>=0&&cmlcdxy.X<=120&&cmlcdxy.Y>=280&&cmlcdxy.Y<=320) {if(snake.d1==0||snake.d1==2)snake.d1=3;else if(snake.d1==1||snake.d1==3)snake.d1=2;turn[i][0]=snake.x1; //第i次转弯坐标turn[i][1]=snake.y1;turn[i][2]=snake.d1; //第i次转弯方向i++;if(i>MAX-1)i=0;}elseif(cmlcdxy.X>=121&&cmlcdxy.X<=240&&cmlcdxy.Y>=280&&cmlcdxy.Y<=320) {if(snake.d1==0||snake.d1==2)snake.d1=1;else if(snake.d1==1||snake.d1==3)snake.d1=0;turn[i][0]=snake.x1; //第i次转弯坐标turn[i][1]=snake.y1; //第i次转弯方向turn[i][2]=snake.d1;i++;if(i>MAX-1)i=0;}}}else if(TPEN==1) times=0;}四、系统调试及实验结果调试过程:在测试过程中出现了一些问题,点触的时候点不准确,我觉得可以加上触屏校准,使其精准。

相关文档
最新文档