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. 调试与优化:- 使用调试工具进行程序调试。

c程序课程设计贪吃蛇

c程序课程设计贪吃蛇

c程序课程设计贪吃蛇一、教学目标本章节的教学目标是让学生掌握C程序设计的基本知识,学会使用C语言编写简单的程序,并通过编写“贪吃蛇”游戏,提高学生的编程能力和逻辑思维能力。

1.掌握C语言的基本语法和数据类型。

2.学会使用C语言进行控制结构和函数的编写。

3.了解C语言的面向对象编程思想。

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

5.能够运用面向对象编程思想进行程序设计。

6.能够独立完成“贪吃蛇”游戏的编写。

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

2.培养学生解决问题的能力和团队协作精神。

3.培养学生遵守编程规范和道德准则的意识。

二、教学内容本章节的教学内容主要包括C语言的基本语法、数据类型、控制结构、函数和面向对象编程思想。

通过编写“贪吃蛇”游戏,让学生将这些知识点运用到实际编程中。

1.C语言的基本语法和数据类型。

2.控制结构的使用和面向对象编程思想。

3.函数的编写和调用。

4.“贪吃蛇”游戏的编写和调试。

教材章节:《C程序设计原理与应用》(第1章至第4章)三、教学方法本章节的教学方法采用讲授法、案例分析法和实验法相结合的方式。

1.讲授法:通过讲解C语言的基本语法、数据类型、控制结构和函数等内容,使学生掌握C语言的基础知识。

2.案例分析法:通过分析“贪吃蛇”游戏的编程案例,使学生了解如何将所学知识点运用到实际编程中。

3.实验法:让学生动手编写“贪吃蛇”游戏,提高学生的编程能力和解决问题的能力。

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

1.教材:《C程序设计原理与应用》2.参考书:《C语言程序设计》3.多媒体资料:C语言编程教程视频4.实验设备:计算机、编程软件(如Visual Studio、Code::Blocks等)五、教学评估本章节的评估方式包括平时表现、作业和考试三个方面,以保证评估的客观性和公正性,全面反映学生的学习成果。

1.平时表现:通过课堂参与、提问、小组讨论等方式评估学生的学习态度和积极性。

单片机课程设计贪吃蛇说明书

单片机课程设计贪吃蛇说明书

单片机课程实训作品说明书姓名:李兆基完成时间:2016年7月3日一、 作品说明介绍1. 作品名称:贪吃蛇简易游戏机2. 作品实现功能:a) 按上、下、左、右键控制蛇身改变方向;b) 蛇头与食物碰撞时“吃掉”食物,使蛇身变长; c) 复位键使游戏重新开始;d) 暂停/继续键可以暂停、继续游戏3. 选择目的:巩固单片机课程所学知识,真正做到学有所用二、 作品操作介绍1. 作品外观图① ②点阵屏:显示地图、蛇以及食物③STC12C5A60S2单片机:控制整个作品,可以烧录不同的程序 ④微动开关1:向上的按键,用于改变蛇的方向 ⑤微动开关2:向下的按键,用于改变蛇的方向 ⑥微动开关3:向左的按键,用于改变蛇的方向①②③④⑤⑥⑦ ⑧ ⑨⑩ ⑪⑫⑬⑭⑮⑦微动开关4:向右的按键,用于改变蛇的方向⑧微动开关5:复位按键,按下后游戏复位,重新开始⑨微动开关6:暂停/继续按键,控制游戏暂停/继续⑩自锁开关:实现整体的电源总控制(断负)⑪晶振、电容:用于单片机起振,单片机的最小时钟电路⑫排针:用于连接电源正负极以及RXD和TXD⑬电源指示灯:通电时点亮⑭8个1KΩ电阻:限制电流大小⑮10个0Ω电阻:做跳线用2.作品功能介绍及操作说明a)给游戏机上电①将电源正极接在排针处标有VCC的位置②将电源负极接在排针处标有GND的位置③按下自锁开关完成上电b)让贪吃蛇改变方向①按向上键:蛇身向上②按向下键:蛇身向下③按向左键:蛇身向左④按向右键:蛇身向右c)游戏暂停/继续、复位①按暂停/继续键:游戏暂停/继续②按复位键:游戏复位,重新开使三、作品制作说明1.电路原理图2.3.PCBa)正面图(见附录1)b)F5图(见附录2)c)F6图(见附录3)四、产品控制顺序/*******************************************名称:贪吃蛇简易游戏机制作人:李兆基制作时间:2016.6.28修改时间:2016.7.1 (加入吃食物蛇身变长功能)2016.7.3 (处理程序兼容细节)*******************************************/#include<stc12c5a60s2.h>#include<stdlib.h>unsigned char map[16]; //定义一个MAP地图unsigned char line; //列unsigned char snake[45][2]; //定义蛇的大小unsigned char game_reset; //游戏复位unsigned char foodx,foody; //食物的位置sbit Key_left=P3^2; //左sbit Key_up=P3^3; //上sbit Key_down=P3^4; //下sbit Key_right=P3^5; //右sbit Key_start=P3^7; //开始/暂停sbit Key_reset=P3^6; //复位/****************按键所对应的位置***************/void CreateFood(){unsigned char i;i=0;RESET:foodx=rand()%6+1;//rand()函数随即产生食物的横坐标(1~6)foody=rand()%14+1;//rand()函数随即产生食物的纵坐标(1~14)while(!(snake[i][0]==snake[i][1]&&snake[i][0]==44)) //找蛇尾(遍历蛇){if(snake[i][0]==foodx&&snake[i][1]==foody)goto RESET;//如果产生的食物在蛇的节点上,则重新生成食物i++;}}/*********构造食物********/void ClearMap(){unsigned char i;for(i=0;i<16;i++)map[i]=0x81; //清空地图map[0]=map[15]=0xff; //构造墙}/**********初始化地图**********/void ClearSnake(){unsigned char i;for(i=0;i<45;i++)snake[i][0]=snake[i][1]=0x00; //清空蛇节点snake[0][0]=5;snake[0][1]=10; //构造蛇头snake[1][0]=5;snake[1][1]=11;snake[2][0]=5;snake[2][1]=12; //构造蛇身snake[3][0]=44;snake[3][1]=44; //构造蛇尾}/************初始化蛇节点************/void SnakeToMap(void){unsigned int i;ClearMap();i=0x80>>foodx; //获取食物的横坐标map[foody]|=i; //将其横坐标和纵坐标对应的点显示在地图上i=0;while(!(snake[i][0]==snake[i][1]&&snake[i][0]==44)){map[snake[i][1]]|=0x80>>snake[i][0];i++;} //将蛇节点全部显示在地图上}/**********************将蛇以及食物显示在地图上***********************/void Move(unsigned char fx)//fx参数(0为上,1为下,2为左,3右){unsigned char i,snakewx,snakewy;snakewx=snakewy=i=0;while(!(snake[i][0]==snake[i][1]&&snake[i][0]==44))i++;snakewx=snake[i-1][0];snakewy=snake[i-1][1]; //扫描蛇节点并且得到尾巴的位置(横纵坐标)switch(fx){case 0:while(!(snake[i][0]==snake[i][1]&&snake[i][0]==44))i++; //扫描蛇节点得到节点数for(i--;i>0;i--){snake[i][0]=snake[i-1][0];snake[i][1]=snake[i-1][1];} //后节点朝着前节点方向移动snake[0][0]--; //移动蛇头break;case 1:while(!(snake[i][0]==snake[i][1]&&snake[i][0]==44))i++; //扫描蛇节点得到节点数for(i--;i>0;i--){snake[i][0]=snake[i-1][0];snake[i][1]=snake[i-1][1]; //后节点朝着前节点方向移动}snake[0][0]++; //移动蛇头break;case 2:while(!(snake[i][0]==snake[i][1]&&snake[i][0]==44))i++;for(i--;i>0;i--){snake[i][0]=snake[i-1][0];snake[i][1]=snake[i-1][1];}snake[0][1]--;break;case 3:while(!(snake[i][0]==snake[i][1]&&snake[i][0]==44))i++;for(i--;i>0;i--){snake[i][0]=snake[i-1][0];snake[i][1]=snake[i-1][1];}snake[0][1]++;break;}if(snake[0][0]==foodx&&snake[0][1]==foody) //蛇吃食物(蛇头的坐标与食物坐标重合){while(!(snake[i][0]==snake[i][1]&&snake[i][0]==44))i++;snake[i][0]=snakewx;snake[i][1]=snakewy;snake[i+1][0]=snake[i+1][1]=44; //重新添加(定义)蛇尾CreateFood(); //创建食物}}/************************蛇的移动(按键的方向改变)************************/void delay(unsigned int i){unsigned int j;while(i--)for(j=600;j>0;j--);}/*********************延时函数(接近与1毫秒)*********************/void donghua(void){unsigned int i;for(i=0;i<16;i++){if(i<8){P2=0xff;P1=~(0x80>>i);}else{P1=0xff; //第一块点阵屏亮P2=~(0x80>>(i-8));}P0=0xff;delay(20);}P1=P2=P0=0x00;for(i=0;i<16;i++){if(i<8){P1=0xff;P2=~(0x01<<i);}else{P2=0xff;P1=~(0x01<<(i-8));} //第二块点阵屏亮P0=0xff;delay(20);}}/********开机动画********/bit IsOver(){unsigned char i;game_reset=0;i=0;while(!(snake[i][0]==snake[i][1]&&snake[i][0]==44))i++;for(i--;i>0;i--){if(snake[0][0]==snake[i][0]&&snake[0][1]==snake[i][1]){game_reset=1;break;} //遍历蛇节点是否蛇头和蛇身重合}if(snake[0][0]==0||snake[0][0]==7||snake[0][1]==0||snake[0][1]==15) //判断蛇头是否撞墙game_reset=1;return game_reset;}/*********************判断蛇的状态(死亡条件)**********************/void init(void){P0M0=0xff;P0M1=0x00;//PO为强推模式TMOD=0X01;//设定时/计数器方式EA=1; //开启中断ET0=1; //开启定时计数器0TH0=(65536-1000)/256;TL0=(65536-1000)%256; //设置计数初值为1毫秒TR0=1; //开启定时/计数软开关ClearMap(); //初始化地图ClearSnake(); //初始化蛇}/**********初始化函数**********/void main(void){unsigned char fx,i,newfx; //定义方向,新方向,以及变量iunsigned char isStart; //开始/暂停变量newfx=fx=2; //初始化方向donghua();delay(100);i=0;isStart=1;init();CreateFood();while(1){for(i=0;i<20;i++){delay(10);if(fx!=1&&!Key_up&&isStart)//蛇向下移动则向上按键无效{newfx=0;}if(fx!=0&&!Key_down&&isStart) //蛇向上移动则向下按键无效{newfx=1;}if(fx!=3&&!Key_left&&isStart) //蛇向左移动则向右按键无效{newfx=2;}if(fx!=2&&!Key_right&&isStart) //蛇向右移动则向左按键无效{newfx=3;} //按键改变newfx,默认向fx移动if(!Key_start){delay(20);if(!Key_start)if(isStart==1)isStart=0;else if(isStart==0)isStart=1; //暂停/继续改变isStart状态while(!Key_start);delay(20);}if(!Key_reset){delay(20);if(!Key_reset)game_reset=1;while(!Key_reset);delay(20);if(game_reset)return; //复位}if(!isStart)i--; //暂停状态时所执行的死循环delay(10);}if(fx==0&&newfx==1||fx==2&&newfx==3)newfx=fx;elsefx=newfx; //方向冲突时按新方向移动,避免按的太快Move(fx); //移动while(IsOver()){if(!Key_reset){delay(20);if(!Key_reset)game_reset=1;while(!Key_reset);delay(20);if(game_reset)return;}if(!isStart)i--;delay(10);} //当蛇死亡只能激活复位按钮SnakeToMap(); //将蛇显示在地图}}/******主函数******/void display(void) interrupt 1{TR0=0; //关闭软开关TH0=(65536-1000)/256;TL0=(65536-1000)%256; //计数赋值if(line<8){P2=0xff;P1=~(0x80>>line); //选列}else{P1=0xff;P2=~(0x80>>(line-8)); //选列} //两块点阵屏的对接P0=map[line]; //送行line++;if(line==16)line=0;TR0=1; //开启软开关}/********显示函数********/。

c课课程设计贪吃蛇

c课课程设计贪吃蛇

c课课程设计贪吃蛇一、教学目标本课程的教学目标是让学生了解并掌握“贪吃蛇”游戏的基本原理和编程技巧。

知识目标包括理解贪吃蛇游戏的基本规则、掌握游戏编程的基本概念和方法。

技能目标则侧重于培养学生运用编程语言实现贪吃蛇游戏的能力。

情感态度价值观目标则是培养学生对计算机科学的兴趣,增强其创新意识和团队协作能力。

二、教学内容教学内容主要包括贪吃蛇游戏的基本原理、编程语言的选择和运用、游戏的实现和优化等。

具体包括以下几个部分:1.贪吃蛇游戏概述:介绍贪吃蛇游戏的基本规则和发展历程。

2.编程语言选择:介绍常用的编程语言,如Python、C++等,并分析其在贪吃蛇游戏编程中的优缺点。

3.游戏实现:讲解如何使用编程语言实现贪吃蛇游戏的基本功能,包括游戏界面、游戏逻辑、碰撞检测等。

4.游戏优化:介绍如何对贪吃蛇游戏进行性能优化和用户体验优化。

三、教学方法本课程采用讲授法、案例分析法和实验法相结合的教学方法。

讲授法用于讲解贪吃蛇游戏的基本原理和编程概念;案例分析法用于分析典型的贪吃蛇游戏案例,让学生了解游戏的实现过程;实验法则用于让学生动手编写和调试贪吃蛇游戏,提高其实际操作能力。

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

教材和参考书用于为学生提供系统的理论知识;多媒体资料则用于辅助讲解和展示游戏案例;实验设备则用于让学生进行实际操作和调试。

同时,还可以利用网络资源,如在线编程平台,让学生在线编写和运行贪吃蛇游戏,提高其学习兴趣和主动性。

五、教学评估本课程的评估方式包括平时表现、作业、考试等多个方面,以全面客观地评价学生的学习成果。

平时表现主要评估学生在课堂上的参与程度、提问和回答问题的表现等。

作业方面,要求学生完成一定数量的编程练习和项目任务,以巩固所学知识。

考试则分为期中考试和期末考试,期中考试主要评估学生对贪吃蛇游戏原理的理解,期末考试则侧重于评估学生编程实现的能力。

六、教学安排本课程的教学进度共安排16周,每周2课时。

贪吃蛇c课程设计

贪吃蛇c课程设计

贪吃蛇c 课程设计一、教学目标本课程旨在让学生了解并掌握“贪吃蛇”游戏的编程原理和技巧,培养学生的计算机编程兴趣和能力。

具体目标如下:知识目标:使学生了解“贪吃蛇”游戏的基本原理和编程方法,包括游戏循环、事件处理、图形绘制等;理解并掌握面向对象编程的基本概念,如类、对象、属性、方法等。

技能目标:培养学生运用Python编程语言编写“贪吃蛇”游戏的能力,提高学生的编程实践能力;培养学生运用编程思维解决实际问题的能力,提高学生的创新意识和动手能力。

情感态度价值观目标:培养学生对计算机编程的兴趣,激发学生主动探索科学知识的欲望;培养学生团队合作精神,学会在实践中互相学习、互相帮助,培养良好的职业道德和行为规范。

二、教学内容本课程的教学内容主要包括以下几个部分:1.Python编程基础:介绍Python编程语言的基本语法和操作,如变量、数据类型、运算符、控制结构等。

2.面向对象编程:讲解类、对象、属性、方法等基本概念,并通过实例让学生掌握面向对象编程的方法。

3.“贪吃蛇”游戏原理:介绍游戏循环、事件处理、图形绘制等基本原理,使学生了解游戏开发的本质。

4.“贪吃蛇”游戏编程实践:引导学生动手编写游戏代码,让学生在实践中掌握编程技巧和方法。

5.游戏优化与调试:讲解如何对游戏进行优化和调试,提高游戏的性能和可玩性。

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

1.讲授法:用于讲解编程基础知识,使学生掌握Python编程语言的基本语法和操作。

2.讨论法:针对游戏编程中的问题,学生进行讨论,培养学生的团队合作精神和解决问题的能力。

3.案例分析法:分析经典游戏案例,使学生了解游戏开发的原理和方法。

4.实验法:引导学生动手编写游戏代码,培养学生的实践能力和创新意识。

四、教学资源为了支持本课程的教学内容和教学方法,我们将准备以下教学资源:1.教材:《Python编程:从入门到实践》等,用于引导学生学习编程基础知识。

贪吃蛇c课课程设计

贪吃蛇c课课程设计

贪吃蛇c 课课程设计一、教学目标本节课的教学目标是让学生掌握贪吃蛇游戏的基本原理和编程技巧。

知识目标包括了解贪吃蛇游戏的历史和发展,理解游戏的基本逻辑和算法,掌握使用C语言编写贪吃蛇游戏的方法。

技能目标包括培养学生运用C语言进行程序设计的能力,提高学生的逻辑思维和问题解决能力。

情感态度价值观目标包括培养学生对计算机科学的兴趣和热情,培养学生勇于探索和创新的精神。

二、教学内容本节课的教学内容主要包括贪吃蛇游戏的基本原理、游戏逻辑和算法,以及使用C语言编写贪吃蛇游戏的方法。

首先,介绍贪吃蛇游戏的历史和发展,使学生对游戏有一个整体的认识。

然后,讲解游戏的基本逻辑和算法,包括蛇的移动、食物的生成和消亡、游戏结束条件等。

最后,通过实例演示和代码解析,引导学生掌握使用C语言编写贪吃蛇游戏的方法。

三、教学方法为了达到本节课的教学目标,将采用多种教学方法相结合的方式进行教学。

首先,使用讲授法向学生讲解贪吃蛇游戏的基本原理和编程技巧。

其次,通过讨论法引导学生进行思考和交流,提高学生的理解能力和问题解决能力。

此外,还采用案例分析法和实验法,让学生通过分析实例和动手实践,进一步巩固所学知识。

四、教学资源为了支持本节课的教学内容和教学方法的实施,将准备以下教学资源。

首先,教材和参考书,为学生提供理论知识的学习材料。

其次,多媒体资料,包括课件、视频等,用于辅助讲解和演示。

最后,实验设备,如计算机、网络等,用于学生动手实践和编写代码。

五、教学评估本节课的教学评估将采用多元化方式进行,以全面、客观地评价学生的学习成果。

评估方式包括平时表现、作业、考试等。

平时表现主要考察学生的课堂参与度、提问回答等情况,以评价学生的学习态度和积极性。

作业包括课后练习和编程任务,以巩固学生对贪吃蛇游戏原理和编程技巧的理解。

考试则是对学生综合运用所学知识进行编程的能力的测试。

通过这些评估方式,能够全面反映学生的学习成果,同时也为教师提供及时的反馈信息,以便调整教学方法和策略。

嵌入式实训贪吃蛇报告

嵌入式实训贪吃蛇报告

嵌入式系统在现代科技中扮演着越来越重要的角色,嵌入式开发已经成为计算机科学与技术专业的重要课程。

为了提高学生对嵌入式系统的理解与应用能力,我们开展了嵌入式实训课程,本次实训课题为贪吃蛇游戏设计。

贪吃蛇游戏是一款经典的休闲游戏,具有较高的趣味性和挑战性。

通过本次实训,我们旨在让学生掌握嵌入式系统原理及程序编写,提高学生的编程能力,并培养学生的团队协作精神。

二、实验目的1. 熟悉嵌入式系统原理及程序编写。

2. 掌握嵌入式系统开发环境的使用。

3. 提高编程能力,培养创新意识。

4. 培养团队协作精神。

三、实验内容及要求1. 实验环境:基于ARM处理器的嵌入式开发板,例如STM32、ESP32等。

2. 实验工具:Keil uVision、IAR EWARM、Code::Blocks等。

3. 实验内容:(1)设计贪吃蛇游戏界面,包括蛇、食物、分数等元素。

(2)实现蛇的移动、食物的生成、分数的计算等功能。

(3)实现游戏结束、重新开始等操作。

(4)优化游戏性能,提高用户体验。

4. 实验要求:(1)使用C语言或C++进行编程。

(2)遵循模块化设计原则,提高代码可读性。

(3)编写详细注释,便于他人阅读。

(4)提交实验报告,包括实验目的、内容、过程、结果及心得体会。

1. 确定游戏界面首先,我们需要设计贪吃蛇游戏界面,包括蛇、食物、分数等元素。

在嵌入式开发板屏幕上,我们可以使用字符图形或图形库来绘制界面。

2. 编写蛇的移动函数蛇的移动可以通过计算蛇头的新坐标来实现。

根据用户输入的方向键,我们可以改变蛇头的移动方向,并更新蛇的身体坐标。

3. 实现食物的生成食物的生成可以通过随机生成食物的坐标来实现。

当蛇头与食物坐标重合时,蛇的身体长度增加,分数增加。

4. 计算分数分数的计算可以通过设置一个变量来记录蛇吃掉食物的次数,每次吃掉食物,分数加1。

5. 实现游戏结束、重新开始等操作当蛇头与蛇身或墙壁碰撞时,游戏结束。

此时,我们可以提供一个重新开始的按钮或按键,让用户重新开始游戏。

STM32贪吃蛇游戏

STM32贪吃蛇游戏

本人移植的STM32贪吃蛇游戏,亲测可行,以下为贪吃蛇驱动snake.c与snake.h,还有main.c,希望能对大家有点帮助。

/*snake.c*******************************************/#include "SNAKE.h"#include "lcd.h"#include "key.h"//#include "stdlib.h"#include "delay.h"u8 Key_V_temp=0; //取出上次按键值u8 Key_Value=0; //取出上次按键值//=================================================================// 使用结构体定义变量使程序的名称更加的清楚//================================================================= struct{u8 X;u8 Y;u8 Yes;}Food; //食物结构体#define SNAKE_Max_Long 10 //最大长度struct{u8 X[SNAKE_Max_Long];u8 Y[SNAKE_Max_Long];u8 Long;u8 Life;u8 Score; //蛇的分数u8 Level; //蛇的等级}Snake; //蛇结构体//=================================================================//函数名称:Trun_On_Point Trun_Off_Point (u8 x,u8 y)//函数功能:点亮或者熄灭一个点。

用于显示蛇身体//入口参数:无//出口参数:无//特别说明:此Trun_On,函数换成其他的就可以兼容其他的液晶// 入8*8 点阵12864 等//=================================================================void Trun_On_Point (u8 x,u8 y){LCD_Fill((u16)(x*8),(u16)(y*8),(u16)(x*8+8),(u16)(y*8+8),RED);}void Trun_Off_Point (u8 x,u8 y){LCD_Fill((u16)(x*8),(u16)(y*8),(u16)(x*8+8),(u16)(y*8+8),BLACK);}//=================================================================//函数名称:void Init_SNAKE(void)//函数功能:绘制游戏界面,初始化游戏等级等参数//入口参数:无//出口参数:无//================================================================= void Init_SNAKE(void){u8 i;POINT_COLOR=WHITE; //画笔颜色BACK_COLOR=BLACK; //背景色//***********绘制游戏界面********************//LCD_Fill(0,0,8,280,DARKBLUE);//Rectangle(8,8-1,85,120,0xaa);//绘制一个矩形框, 0-127 LCD_Fill(232,0,240,280,DARKBLUE);//LCD_Fill(0,0,240,8,DARKBLUE);//LCD_Fill(0,272,240,280,DARKBLUE);//LCD_ShowString(0,280,200,16,16,"Score");//Show ScoreLCD_ShowString(0,300,200,16,16,"LEVEL");//Show LevelLCD_ShowNum(50,280,(u32)Snake.Score,4,16);LCD_ShowNum(50,300,(u32)Snake.Level,4,16);//LCDShow_u8Number(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+14;Snake.Y[i]=17;}for(i=0;i<Snake.Long;i++) //将蛇给画出来{Trun_On_Point(Snake.X[i],Snake.Y[i]);}}//=================================================================//函数名称:void Display_dead(u8 i)//函数功能:显示死亡界面//入口参数:无//出口参数:无//================================================================= void Display_dead(void){LCD_Clear(BLACK);LCD_Fill(0,0,8,280,DARKBLUE);//Rectangle(8,8-1,85,120,0xaa);//绘制一个矩形框, 0-127 LCD_Fill(232,0,240,280,DARKBLUE);//LCD_Fill(0,0,240,8,DARKBLUE);//LCD_Fill(0,272,240,280,DARKBLUE);//LCD_ShowString(0,280,200,16,16,"GAME OVER! ");LCD_ShowString(0,300,200,16,16,"PRESS ENTER TO RESTART");while(Key_Value!=KEY_DOWN){Key_Value=KEY_Scan(0);;}LCD_Clear(BLACK);Init_SNAKE();}//=================================================================//函数名称:void Display_Pass(u8 i)//函数功能:显示过关界面//入口参数:无//出口参数:无//================================================================= void Display_Pass(void){Snake.Level++;LCD_Clear(BLACK);LCD_Fill(0,0,8,280,DARKBLUE);//Rectangle(8,8-1,85,120,0xaa);//绘制一个矩形框, 0-127 LCD_Fill(232,0,240,280,DARKBLUE);//LCD_Fill(0,0,240,8,DARKBLUE);//LCD_Fill(0,272,240,280,DARKBLUE);//LCD_ShowString(0,280,200,16,16,"YOU ARE WIN!");LCD_ShowString(0,300,200,16,16,"PRESS ENTER TO CONTINUE");while(Key_Value!=KEY_DOWN){Key_Value=KEY_Scan(0);;}LCD_Clear(BLACK);Init_SNAKE();}//=================================================================//函数名称:void Run_SNAKE(void)//函数功能:蛇运动函数(游戏精华)//入口参数:无//出口参数:无//================================================================= void Run_SNAKE(void){u8 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]);}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]);}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]);}Key_V_temp=KEY_UP;}if(( Key_Value==KEY_DOWN&&Key_V_temp!=KEY_UP)||( Key_Value==KEY_UP&&K ey_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]);}Key_V_temp=KEY_DOWN;}/****************根据按键选择蛇的运动程序结束*******************///////////////////////////////////////////////////////////////////************************判断蛇是否死亡***********************/if(Snake.X[Snake.Long-1]<=0||Snake.X[Snake.Long-1]>=30||Snake.Y[Snake.Long-1]<=0||S nake.Y[Snake.Long-1]>=33)//判蛇头是否撞到墙壁{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++;//蛇节数加1Snake.X[Snake.Long-1]=Food.X;Snake.Y[Snake.Long-1]=Food.Y;Snake.Score+=10;LCD_ShowNum(50,280,(u32)Snake.Score,4,16);Food.Yes=1; //食物标志置1}//////////////////////////////////////////////////////////////////***************************放果子程序*************************/if(Food.Yes==0){Trun_On_Point(Food.X,Food.Y);}if(Food.Yes==1){while(1){Food.X=rand()%28+1; //获得随机数Food.Y=rand()%28+1;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_ms(100-Snake.Level*10);/////////////////////////////////////////////////////////////////}/*snake.h*******************************************/ #include "stm32f10x.h"#ifndef __SNAKE_H__#define __SNAKE_H__#ifndef uchar#define uchar unsigned char#endif#ifndef uint#define uint unsigned int#endifvoid Init_SNAKE(void);void Run_SNAKE(void);void Display_Pass(void);void Display_dead(void);void Trun_On_Point (u8 x,u8 y);void Trun_Off_Point (u8 x,u8 y);extern u8 Key_V_temp; //取出上次按键值extern u8 Key_Value; //取出上次按键值//extern void Trun_On_Point (uchar x,uchar y,uchar color);#endif/*main.h*******************************************/#include "led.h"#include "delay.h"#include "key.h"#include "sys.h"#include "lcd.h"#include "usart.h"#include "snake.h"//ALIENTEK战舰STM32开发板实验13//TFTLCD显示实验//技术支持://广州市星翼电子科技有限公司void Key(){u8 t;t=KEY_Scan(0); //得到键值if(t){switch(t){case KEY_UP: //控制蜂鸣器LED0=!LED0;Display_Pass();break;case KEY_LEFT: //控制LED0翻转LED1=!LED1;Display_dead();break;case KEY_DOWN: //控制LED1翻转LED2=!LED2;break;case KEY_RIGHT: //同时控制LED0,LED1翻转LED3=!LED3;break;}}else delay_ms(10);}int main(void){u8 x=Mode_Set;u8 mode=1;u8 lcd_id[12]; //存放LCD ID字符串delay_init(); //延时函数初始化NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级uart_init(9600); //串口初始化为9600LED_Init(); //LED端口初始化KEY_Init(); //初始化与按键连接的硬件接口LCD_Init();POINT_COLOR=RED;sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);//将LCD ID打印到lcd_id数组。

基于STM32μCOS_II贪吃蛇的课程设计报告

基于STM32μCOS_II贪吃蛇的课程设计报告

学院课程设计题目基于STM32--“C/OS-II贪吃蛇的设计学生028解斐025朱利昭002徐雷指导教师志来讲师年级2012级专业电子信息工程二级学院(系、部)信息工程学院学院信息工程学院(系、部)word格式.2015年7月基于STM32 —“C/OS-II贪吃蛇的设计摘要进入新世纪的TFT液晶显示屏的技术和产业都取得了长足的发展,作为重要的现代信息,发布媒体之一TFT液晶显示屏在证券交易、金融、交通、体育、广告等领域被广泛的应用。

伴随社会化信息的推进,TFT液晶屏技术也在不斷地推出新,应用领域愈加广泛。

现基于STM32的TFT液晶显示可以更好的满足各种需求,也更便于操作和实现。

基于STM32在TFT 液晶屏幕上可显示文本及图形,包括汉字和时钟显示。

关键词:TFT液晶显示STM32开发板“C/OS-11贪吃蛇word格式.摘要 (1)前言 (3)1背景介绍 (3)1.1选题背景 (3)1.2MiniSTM32开发板介绍 (3)2系统硬件设计 (4)2.1开发板简介 (4)2.2 LED 灯 (6)2. 3按键 (10)2.4 TFTLCI)模块 (10)3系统软件设计 (14)&1 LED 驱动 (14)3.2按键驱动 (14)3.3TFT-LCI)驱动 (16)3.4贪吃蛇实现C语言代码 (18)3・5 uC/OS-II软件设计 (23)结论 (27)参考文献 (28)word格式.前言目前已有超过85%的无线通信设备采用了ARM技术,ARM以其高性能和低成本,在该领域的地位日益巩固。

ARM在此方面的应用如:手提式计算机、移动、PDA等。

随着宽带技术的推广,采用ARM技术的ADSL芯片正逐步获得竞争优势。

此外,ARM在语音及视频处理上进行了优化,并获得广泛支捋。

UC/OS-II由Micriuni公司提供,是一个可移植、可固化的、可裁剪的、占先式多任务实时核,它适用于多种微处理器,微控制器和数字处理芯片(已经移植到超过100种以上的微处理器应用中)。

STM32实现贪吃蛇

STM32实现贪吃蛇

STM32实现贪吃蛇STM32学习笔记二竹天笑题记:离写第一篇学习笔记,已经好久了,那时还在学校,而我已经离开那个使我忧伤使我愁的地方。

走的时候,荷花差不多谢了,西大的荷花花期是那么长,而总是要谢了。

花看了三年,只是离开的时候想再看看,却没有了。

来公司快两个星期了,上班下班办手续,洗被子洗衣服,订门窗理柜子。

哎,没心没肺的,匆匆忙忙的过完一天又一天,还没来得及伤感,就赶上了忙碌。

工作就黑压压的埋过来来了,好在晚上还不要加班。

乘晚上还有点空,就把这个在学ucgui的时候想测试ucgui各函数功能的东西,花了一个晚上写完,写到12点多,只好做了简单的测试,没问题,算是半实验品吧,里面肯定存在很多问题,纯属自娱自乐。

呵呵,界面非常简单要点:1、触摸屏校准信息保存在SD卡,不必每次开机都校准。

(读写SD卡,请参阅野火SD的教程,触摸屏校准信息保存在SD卡,请参阅定点原子SD的教程。

)2、随机函数的实现,一般都是用定时器实现随机种子,我用的是时钟实现随机种子。

(请百度随机函数。

)3、蛇的算法。

(自己想的,可能有BUG,每次移动时候,头移动,尾消去,中间的不变。

)4、触摸按键的实现。

(按键检测本来想放在外部中断中(触摸中断),但是发现怎么也搞不定,最后只好放在延时程序中,求大神指教。

)5、测试用:截屏函数的实现。

(请参照野火SD的教程,本人用的是红牛三代的屏,如果屏要读屏数据点的话,初始化的读数据时序要放长一些,不然会读出花点,如果只是显示,那么写时序可以短一点。

)6、画界面:界面的范围是x:0-239,y:0-239。

由于蛇点的大小是4*4个像素点组成,因此,将坐标缩小到x/y:0-59。

除去外框0和59,因此蛇可以出现的位置是x/y:1-58。

同样随机点(是不是应该称为食物?)出现的位置是x/y:1-58。

废话少说,还是直接上程序。

随机函数:uint8_t rand_dot(void){uint8_t r;srand(RTC_GetCounter()); //产生随机种子,实现真正的随机函数,如果没有此句就是伪随机函数。

  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;}四、系统调试及实验结果调试过程:在测试过程中出现了一些问题,点触的时候点不准确,我觉得可以加上触屏校准,使其精准。

相关文档
最新文档