贪吃蛇
贪吃蛇教案6篇

贪吃蛇教案6篇教师制定教案是备课工作中不可或缺的组成部分,创意十足的教案设计能够让学生在学习过程中体验到探索的乐趣,作者今天就为您带来了贪吃蛇教案6篇,相信一定会对你有所帮助。
贪吃蛇教案篇1要求:1、学会与同伴分享故事的乐趣。
2、学习运用多种颜色来绘画,进一步感受颜色的美。
准备:变色龙模型,玩具车、恐龙涂案、蜡笔等建议:1、以神秘口吻引入,激发幼儿倾听故事兴趣。
2、借助教具,生动地讲述故事《贪吃的变色龙》,让幼儿初步了解故事的内容。
3、提问:故事名称?故事中有什么?4、引导幼儿说说变色龙吃了那些东西?身体都发生了什么变化?5、玩“恐龙变色”的游戏:让幼儿自由选择两种以上的颜色给恐龙图案进行重叠涂染活动。
6、提要求:(1)、任选两种颜色进行重叠涂染。
(2)、做到“三轻”,保持桌面整洁、干净。
7、幼儿自由涂染活动,师重点指导幼儿要在恐龙图案上重叠涂染。
8、幼儿互相交流、欣赏作品。
活动反思:孩子在玩中学,学中玩,兴趣浓浓。
在孩子们的自由作画时间了,老师巡回指导,发现较好或有自己创意的孩子就进行及时表扬,孩子们互相学习,很好的完成了作品。
根据小班幼儿的年龄,设计了有趣的教学用具和游戏设计,整个活动,幼儿在愉快的气氛中获得初浅的社会经验,体验了解他人的快乐。
效果好。
贪吃蛇教案篇2活动目标:1、获得听故事的乐趣。
2、学习翻阅图书的顺序。
3、运用材料进行创作。
4、引导幼儿在故事和游戏中学习,感悟生活。
5、鼓励幼儿大胆的猜猜、讲讲、动动。
活动准备:1、故事:《贪吃的变色龙》2、透明片,油性笔活动过程:1、讲述故事《贪吃的变色龙》2、教师讲故事时,要求幼儿跟随老师讲的内容翻阅幼儿用书。
3、用提问帮助幼儿理解故事内容。
师:请小朋友说说恐龙吃了什么改变了颜色?4、教师用油性笔在透明片上示范画图,画好后贴在玻璃窗上,请幼儿欣赏。
5、给幼儿一人一张透明片,请幼儿自由创作。
6、完成的作品,贴在窗户上,让大家欣赏。
活动反思:贪吃的变色龙》是一个生动、有趣的故事,深受孩子们的喜爱。
贪吃蛇进化论玩的技巧

贪吃蛇进化论玩的技巧贪吃蛇进化论是一款经典的街机游戏,玩家需要控制蛇头的方向,吃到食物使蛇身变长,并避免蛇头碰到蛇身或者边界。
在游戏中,玩家可以采取一些技巧来提高得分和生存时间。
下面我将分享一些贪吃蛇进化论的玩法技巧。
1. 规划行动路线:在开始游戏之前,先设定一个行动路线是非常重要的。
首先,确定蛇头的移动方向,然后按照这个方向来移动。
在贪吃蛇进化论中,你可以控制蛇头向上、向下、向左或向右移动。
了解蛇头移动的规律以及不同情况下的最佳路线是至关重要的。
2. 利用墙壁:边界是贪吃蛇进化论中的一个重要元素。
当你的贪吃蛇靠近边界时,它会以相反的方向穿过边界出现在另一侧。
利用这个特点,你可以更好地规划你的行动路线,并避免碰撞到蛇身或者边界。
3. 利用大蛇身部分:当你的贪吃蛇的身体变得很长时,尽量利用它来围住食物或其他小贪吃蛇。
当你的贪吃蛇围住了食物或其他小贪吃蛇时,它们将变得更加容易被吃掉。
这是一种创造机会的策略,通过吃掉其他小贪吃蛇来获得更多的食物。
4. 观察食物的生成位置:食物的生成位置在游戏中是随机的,但是有一定的规律可循。
在贪吃蛇进化论中,食物通常生成在远离贪吃蛇头部的地方,而且会随着游戏的进行而变得越来越远。
因此,当你吃到食物后,尽可能地马上去远离蛇头的地方,以便在食物生成时更容易到达。
5. 注意其他玩家的行动:贪吃蛇进化论是一款多人在线游戏,你将与其他玩家同时进行游戏。
观察其他玩家的行动是非常重要的,因为你可以通过他们的行为来获取更多的信息,并规划自己的行动策略。
例如,当其他玩家蛇身很长时,你可以尝试追逐它们,吃掉它们,从而获得更多的食物。
6. 注意游戏的时机:在贪吃蛇进化论中,时机掌握得当是非常重要的。
当你的贪吃蛇靠近其他玩家或者食物时,你需要判断是否有足够的时间吃完它们并躲避碰撞。
如果你认为时机不对或者有潜在的危险,不要贸然行动,相反,退后并等待更好的时机。
7. 设定目标和策略:在贪吃蛇进化论中,设定目标和制定策略是至关重要的。
贪吃蛇总结

贪吃蛇总结贪吃蛇,作为一款经典的游戏,拥有着无数的粉丝和玩家。
这个简洁而有趣的游戏,能够牵动人们的心弦,让人陷入其中忘乎所以。
我也是其中的一员,经过数小时的努力和探索,我对贪吃蛇有了更深入的理解和总结。
一、游戏规则及策略贪吃蛇的规则非常简单明了,控制蛇的移动,不断吃食物以增长自身长度,同时要避免撞到自己或撞到墙壁。
然而,要在这个简单的背景下取得高分却并非易事。
在游戏中,玩家需要注意自己的行动,合理规划蛇的移动路线。
最重要的一点是避免贪婪,蛇一味地追求食物可能会导致撞到自己或者墙壁。
因此,玩家需要思考每一步的落脚点,保持冷静和耐心。
另外,观察屏幕上的食物分布也是非常重要的策略,合理选择食物的吃取顺序和路径,能够帮助蛇更好地生长。
二、心态和技巧贪吃蛇虽然规则简单,但是对于玩家的心态和技巧有一定的要求。
在游戏中,玩家需要保持冷静的心态,不能因为一时的疏忽或者错误而心急如焚。
只有保持清醒和镇定的头脑,才能更好地处理突发情况,并做出正确的决策。
在技巧方面,玩家需要掌握好方向键的操作,不要随意乱按。
合理控制蛇的移动速度和方向,能够更好地避免蛇头与身体相撞,并确保蛇的生存时间更长。
另外,利用边界也是一项重要的技巧,不仅能够帮助蛇更好地躲避自己,还可以利用墙壁将食物集中在一侧,提升吃食物的效率。
三、游戏带来的益处贪吃蛇不仅是一款有趣的游戏,还带来了一些不可忽视的益处。
首先,贪吃蛇培养了玩家的观察力和反应能力。
在游戏中,玩家需要随时观察屏幕上的食物分布和蛇的状态,做出快速的决策。
这种训练有助于提升我们在现实生活中的观察力和反应能力。
其次,贪吃蛇也可以培养玩家的耐心和坚持不懈的精神。
在游戏中,玩家可能会遇到一些挫折和失败,但是只要坚持下去,并不断总结经验和改进策略,就有机会取得更好的成绩。
这种精神在现实生活中同样重要,无论是学习还是工作,都需要我们保持耐心和坚持。
最后,贪吃蛇还可以帮助玩家放松心情,减压释放压力。
游戏过程中,玩家可以暂时抛开繁重的任务和事务,投入到游戏中,享受游戏带来的快乐和放松。
贪吃蛇大作战攻略

贪吃蛇大作战攻略介绍贪吃蛇大作战是一款基于经典贪吃蛇游戏的多人在线对战游戏。
与传统贪吃蛇游戏不同的是,贪吃蛇大作战允许多个玩家在同一地图上同时游戏,并且可以相互攻击。
玩家需要通过控制自己的蛇头来吃掉地图上的食物,让自己的蛇变得更长,并且要小心其他玩家的攻击,避免被击败。
在这个攻略中,我们将分享一些贪吃蛇大作战的游戏技巧和策略,帮助你在游戏中取得更好的成绩。
游戏基础在贪吃蛇大作战中,玩家通过键盘或其他控制设备控制自己的蛇头移动,蛇头会不断前进,只能通过左右转向来改变移动方向。
地图上会随机生成食物,玩家需要通过控制蛇头吃掉食物,使自己的蛇身变得更长。
同时,玩家还可以通过攻击其他玩家的蛇来消灭对手,击败对手可以吃掉对手的蛇身,使自己变得更长。
游戏的目标是生存下来,击败其他玩家,成为最长的蛇。
游戏技巧和策略1. 持续吃食物在贪吃蛇大作战中,吃食物是增长长度的关键。
尽量保持蛇头不断吃食物,可以让你的蛇变得更长,增加存活的机会。
同时,吃掉食物可以让你的分数增加,排名也会上升。
优先选择吃离你位置较近的食物,但要注意周围其他玩家的威胁。
2. 注意观察地图观察地图是游戏中非常重要的技巧。
可以通过观察地图来找到食物的位置和其他玩家的动向。
特别是在人数较多的房间中,要时刻关注周围的情况,避免突然受到攻击。
观察地图还可以判断自己与其他玩家的相对位置,有助于做出合理的攻击策略。
3. 避免撞墙和自己的身体在贪吃蛇大作战中,撞墙和撞到自己的身体都会导致失败。
要时刻注意蛇头的位置,避免让自己撞到墙壁或自己的身体。
在移动时要谨慎选择方向,避免陷入死胡同。
4. 分散注意力在游戏中,分散注意力可以增加存活的机会。
不要只关注自己的蛇头,要时刻留意周围其他玩家的位置和动向。
可以选择远离其他玩家的区域,或者通过观察其他玩家的战斗来获取机会。
同时,要注意自己的蛇身和其他玩家的蛇身,避免被吃掉。
5. 攻击其他玩家贪吃蛇大作战中,击败其他玩家是一种策略,可以让自己的蛇变得更长。
贪吃蛇吃辣椒飞天模式200关

贪吃蛇吃辣椒飞天模式200关
【最新版】
目录
1.贪吃蛇游戏简介
2.辣椒飞天模式的特点
3.通过 200 关的技巧和策略
4.游戏带来的乐趣和挑战
正文
1.贪吃蛇游戏简介
贪吃蛇是一款经典的游戏,其玩法简单易上手,深受广大玩家喜爱。
游戏中,玩家需要操控一条蛇不断地吃掉地图上的食物,同时增长自身的长度。
随着时间的推移,地图上的食物会变得越来越小,难度逐渐增加。
贪吃蛇游戏的目标是在保证自身安全的前提下,尽可能地吃掉更多的食物,挑战更高的分数。
2.辣椒飞天模式的特点
辣椒飞天模式是贪吃蛇游戏的一个特殊玩法。
在这个模式下,地图上的食物会变成辣椒,而蛇在吃到辣椒后,会进入飞天状态。
飞天状态下,蛇的速度会变得极快,地图也会发生相应的变化,使得游戏更加刺激有趣。
此外,辣椒飞天模式还增加了地图的难度,挑战性更高。
3.通过 200 关的技巧和策略
要想在辣椒飞天模式下通过 200 关,需要掌握一定的技巧和策略。
首先,玩家需要熟练掌握蛇的移动和转向,以便在复杂的地图中迅速找到食物。
其次,玩家要善于利用飞天状态,快速地穿过地图,增加分数。
此外,在游戏中,玩家还需要时刻注意自身的安全,避免撞到墙壁或者自己的身体,以免游戏失败。
4.游戏带来的乐趣和挑战
贪吃蛇的辣椒飞天模式不仅给玩家带来了无限的乐趣,还带来了极大的挑战。
在游戏中,玩家需要不断地提高自己的技巧和策略,才能在更高难度的地图中脱颖而出。
此外,游戏还具有排行榜功能,玩家可以与其他玩家一较高下,展示自己的实力。
贪吃蛇逃生操作方法教学

贪吃蛇逃生操作方法教学贪吃蛇是一款非常受欢迎的经典游戏,玩家需要控制一条小蛇在游戏界面上不断地吃食物,使自己不断变长,同时要躲避障碍物和自己的尾巴,直到最后整个地图被填满。
在这个过程中,玩家需要注意操作技巧,灵活应对各种情况,才能获得更高的分数。
下面将教大家如何进行贪吃蛇游戏操作。
1.游戏开始时,玩家操控的小蛇通常位于地图的中央位置,初始长度为1格。
玩家需要利用方向键或触摸屏滑动来控制小蛇的移动方向。
通常方向键向上控制向上移动,向下控制向下移动,向左控制向左移动,向右控制向右移动。
2.小蛇需要不断地吃食物来增加长度。
游戏地图上会随机出现食物,玩家需要操作小蛇去吃掉它。
每吃一个食物,小蛇的长度会增加一格,同时玩家的得分也会增加。
3.随着小蛇的长度增加,游戏的难度也会逐渐增加。
小蛇在移动的过程中,不能碰到自己的尾巴,否则游戏会结束。
因此玩家需要灵活控制小蛇的移动,避免自己的尾巴。
4.在游戏地图上还会出现障碍物,通常是墙或障碍物。
玩家需要躲避这些障碍物,否则小蛇碰到了就会游戏结束。
5.当小蛇吃掉足够的食物后,地图上会生成一个随机的特殊食物,通常是水果或其他特殊形状。
吃掉特殊食物后,小蛇的速度会增加,同时长度也会快速增长一段时间。
玩家需要抓住这个机会,尽可能吃到更多的食物,以获得更高的分数。
6.在游戏过程中,玩家需要谨慎观察地图的情况,合理规划小蛇的移动路线,以尽可能多地吃到食物,同时避开障碍物和自己的尾巴。
这需要不断的练习和观察,才能掌握技巧。
7.当小蛇的长度逐渐增长,地图上几乎全部的空格都被填满后,游戏会结束,同时会显示玩家的得分和排名。
玩家可以尝试不断挑战自己的得分,争取在游戏中取得更高的成绩。
总的来说,贪吃蛇游戏虽然简单,但操作起来却需要一定的技巧和策略。
玩家需要不断地练习,灵活应对各种情况,才能在游戏中取得更好的成绩。
希望以上的操作方法教学可以帮助大家更好地掌握贪吃蛇游戏的操作技巧,享受游戏乐趣。
贪吃蛇的新手入门技巧

贪吃蛇的新手入门技巧贪吃蛇是一款经典的游戏,它简单却又有趣。
对于新手来说,初次接触贪吃蛇可能会感到有些困惑,但只需要了解一些基本技巧,你就能够轻松地掌握这个游戏。
以下是一些贪吃蛇的新手入门技巧,希望对你有所帮助。
1. 规划路线:在开始游戏之前,考虑到蛇头的移动方向是非常重要的。
尽量规划出一条能够不断获得食物的最佳路径。
避免碰到蛇身或边界,不要贸然移动,要有思路。
2. 小心触壁:游戏的边界是不可越过的。
一旦你的蛇头碰到边界,游戏就会结束。
因此,要特别小心不要让蛇头撞到边界。
在紧急情况下,可以尝试使用贪吃蛇游戏中的“穿墙”技巧,但要谨慎使用,以免导致蛇身碰壁。
3. 吞食食物:贪吃蛇的目标是吃掉食物,并且每吃到一颗食物,蛇的身体就会增加一节。
吃到食物后,蛇头会自动转向,因此你需要尽量使蛇头靠近食物以便吃到它。
当蛇身变长后,一些技巧可以帮助你更好地吃到食物。
4. 避免碰撞:贪吃蛇最重要的规则就是避免蛇头碰到自己的身体,否则游戏就会结束。
在贪吃蛇不断变长的过程中,你需要更加小心,使蛇身尽量不要碰撞。
观察地图并尽量利用连续移动的方式来避免碰撞。
5. 利用空间:当蛇身变长后,地图上的空间变得更加有限。
你需要尽量利用空间来扩展蛇的移动范围,同时避免撞到自己的身体。
学会利用环绕食物的方式等待机会,然后抓住时机吞食食物。
6. 快速反应:贪吃蛇是一款需要快速反应的游戏。
随着蛇身的不断增长,你需要更敏捷地反应,以免碰撞到自己或者撞壁。
锻炼手眼协调能力和反应速度是非常重要的。
7. 换位思考:在游戏中,你要时刻注意蛇头的位置及移动方向,但不要忽视蛇身的位置。
学会换位思考,想象自己在控制蛇身移动,这样可以更好地规划移动路径,避免碰撞。
8. 策略选择:当蛇变长后,你要时刻考虑最佳策略选择。
有时候,放弃一颗食物而选择变更方向,可以使蛇的身体更好地排列,让你有更多的操作空间。
9. 大胆前进:有时候,为了吃到食物,你需要冒一些险。
当你确定可以吞食食物时,不要害怕碰撞到自己的身体或者撞到边界,大胆地向前移动,抓住机会。
大学体育课游戏贪吃蛇教案

教学对象:大学体育课程学生教学目标:1. 让学生了解贪吃蛇游戏的基本规则和玩法。
2. 培养学生团队合作精神,提高沟通协作能力。
3. 锻炼学生的反应能力和身体协调性。
教学重点:1. 贪吃蛇游戏的基本规则和玩法。
2. 团队合作和沟通协作能力的培养。
教学难点:1. 学生对贪吃蛇游戏规则的理解和掌握。
2. 团队合作和沟通协作能力的提升。
教学准备:1. 教学场地:宽敞的教室或操场。
2. 教学器材:计时器、纸笔、标记物(如小旗、粉笔等)。
教学过程:一、导入1. 教师简要介绍贪吃蛇游戏的起源和发展,激发学生的学习兴趣。
2. 学生自由讨论,分享自己对贪吃蛇游戏的了解和看法。
二、讲解规则1. 教师详细讲解贪吃蛇游戏的基本规则和玩法,包括游戏目标、游戏流程、胜负判定等。
2. 学生跟随教师一起学习游戏规则,确保理解透彻。
三、分组与准备1. 将学生分成若干小组,每组4-6人。
2. 每组选出一名队长,负责组织协调。
3. 每组在指定区域内用标记物设置障碍物,如小旗、粉笔等。
四、游戏实践1. 各小组按照游戏规则,进行贪吃蛇游戏。
2. 教师在旁观察,指导学生解决游戏中遇到的问题。
3. 游戏过程中,强调团队合作和沟通协作的重要性。
五、总结与反思1. 游戏结束后,各小组分享游戏心得,总结经验教训。
2. 教师点评各小组的表现,强调团队合作和沟通协作的重要性。
3. 学生谈谈自己在游戏中的收获和感悟。
教学评价:1. 学生对贪吃蛇游戏规则的理解程度。
2. 学生在游戏中的团队合作和沟通协作能力。
3. 学生对游戏的兴趣和参与度。
教学反思:1. 教师应关注学生在游戏中的实际表现,及时调整教学策略。
2. 注重培养学生的团队合作精神和沟通协作能力,提高学生的综合素质。
3. 丰富游戏形式,激发学生的学习兴趣,提高教学质量。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C++课程设计报告目录1.课程设计目的和要求 (1)1.1课程设计目的 (1)1.2课程设计要求 (1)2. 课程设计任务内容 (1)3.详细设计 (1)3.1设计要求 (1)3.2设计思想 (2)3.2.1界面设计: (2)3.2.2数据结构 (2)3.3函数设计 (4)3.3.1文件及函数组成 (4)3.3.2函数的详细设计 (5)4. 代码 (13)5.课程设计设计心得与体会 (17)参考文献 (19)1.课程设计目的和要求本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完《程序设计基础(C++)》课程后进行的一次全面的综合设计。
本课程设计的目的和任务:1.1课程设计目的1. 巩固和加深学生对C++语言课程的基本知识的理解和掌握。
2. 掌握C++语言编程和程序调试的基本技能。
3. 利用C++语言进行基本的软件设计。
4. 掌握书写程序设计说明文档的能力。
5. 提高运用C++语言解决实际问题的能力。
基本要求:1.2课程设计要求1.分析课程设计题目的要求。
2.对系统功能模块进行分析,写出详细设计说明文档。
3.编写程序代码,代码量要求不少于300行。
调试程序使其能正确运行。
4.设计完成的软件要便于操作和使用。
5.设计完成后提交课程设计报告。
2. 课程设计任务内容程序要求游戏时,一条蛇在密闭的围墙内,围墙内会随机出现一个食物通过键盘上的4个光标键控制蛇向上下左右4个方向移动,蛇头接到食物,则表示食物被蛇吃掉,这时蛇的身体加长一节,同时计分。
接着又出现食物等待被蛇吃掉。
如果蛇在移动过程中,撞到墙壁或身体交叉(蛇头撞到自己的身体)或者迟到毒果,则游戏结束。
3. 详细设计3.1设计要求程序要求:游戏时,一条蛇在密闭的围墙内,围墙内会随机出现一个食物通过键盘上的4个光标键控制蛇向上下左右4个方向移动,蛇头接到食物,则表示食物被吃掉,这时蛇的身体加长一节,同时计分。
接着又出现食物等待被蛇吃掉。
如果蛇在移动过程中,撞到墙壁或身体交叉(蛇头撞到自己的身体)或者吃到毒果,则游戏结束。
算法:通过随时读取键盘的按下状态调用蛇类的操作函数,实现对蛇类的运动方向调整,通过随时判断蛇头位置的状态(有食物,有毒物,有蛇身或没有)来判断蛇继续运动还是变长或者游戏结束。
3.2设计思想3.2.1界面设计:这个程序的关键是表示蛇的图形以及蛇的移动。
用一个小图形表示蛇的一节身体,身体每长一节,增加一个图形。
移动时必须从蛇头开始,如果不按任何键,蛇自行在当前方向右前移,当游戏者按了有效的方向键后,蛇头朝着指定的方向移动,一步移动一节身体,所以当按了有效的方向键后,先确定蛇头的位置,然后蛇身体随着蛇头移动,图形的实现是从蛇头的新位置开始画出蛇,在界面中央有若干个静止不动的食物以及毒物,用户通过键盘来控制蛇的走向,当蛇吃到食物时,分数增加,界面开始更新,蛇的身体增加一节,食物的位置变化一次,当蛇碰到墙或者咬自己或者吃到毒果时,游戏自动结束,显示用户最后的分数。
3.2.2数据结构Class CSnake{struct Snake_Struct//定义蛇体状态{MoveState head; //头部MoveState *body; //身体MoveState tail; //尾部};private:int m_length; //蛇的长度Snake_Struct m_newSnake; //蛇的新态的所有节点运动状态Snake_Struct m_oldSnake; //蛇的原态的所有节点运动状态BitmapState *m_pStateArray; //蛇的所有节点显示位图的状态SPoint *m_pPos; //蛇体坐标private:BitmapState GetRightState(MoveState oldDirect,MoveState newDirect);public:void Move(void);void ChangeDirect(MoveState d);void AddBody(int n=1);void SetHeadPos(int x,int y);BitmapState* GetStateArray(void);SPoint* GetPos(void);bool IsHeadTouchBody(int x,int y);int GetLength( void );void Initial( void );public:CSnake(int x_pos=0,int y_pos=0,int len=1);~CSnake();};class CTable{private:int m_width; //背景的宽度int m_height; //背景的高度int m_foodNumber; //食物的数目int m_blockNumber; //障碍物(的数目CSnake m_snake; //背景上的蛇int **m_board; //背景的墙public:CTable();~CTable();//初始化背景面板void InitialTable(int w,int h);//食物的操作bool AddBlock(int x,int y);bool AddFood(int x,int y);bool ClearFood(int x,int y);//物件获取CSnake* GetSnake(void);int** GetBoard(void);int GetData(int x,int y);//蛇的操作void SnakeMove(void);bool ChangeSnakeDirect(MoveState d);};3.3函数设计3.3.1文件及函数组成文件及函数的组成以及函数的功能如表所示。
这些函数是由三个源文件组成,main.cpp,snake.cp,table.cpp。
main.cpp是总控所有的函数,初始化数据,使得整个函数得以运行,snake.cpp的内容主要是蛇类的成员函数,table.h的内容主要是对游戏场景的搭建,包括障碍物,墙体等。
3.3.2函数的详细设计1.Initialvoid Csnake::Initial()。
功能:初始化游戏界面,初始化蛇身,将方向上下左右分别用4个键表示。
参数:无。
返回值:无。
工作方式:根据命令,调用相应函数,建立内存链表,将蛇身坐标压入队列,并将蛇身作为一个数组2.ChangeDirectvoid CSnake::ChangeDirect(MoveState d)。
功能:改变蛇的移动方向参数:MoveState d返回值:无。
工作方式:根据命令,调用相应函数,改变蛇的方向参数。
3.C S n a k e::M o v evoid CSnake::Move()功能:使蛇移动。
参数:无。
返回值:无。
工作方式:读取当前蛇类数据,固定时间移动一段距离。
4.C S n a k e::A d d B o d yv o i d C S n a k e::A d d B o d y()功能:增加蛇身长参数:蛇身长返回值:无。
工作方式:读取蛇身长度,判断吃到食物成功后,蛇身长增加一个单元格长度。
5.C S n a k e::I s H e a d T o u c h B o d yI n t C S n a k e::I s H e a d T o u c h B o d y()功能:判断蛇是否出现自咬情形参数:(x,y)蛇头位置返回值:0o r1工作方式:判断蛇头当前位置是否有蛇身单元格,若为空,则返回0,否则返回1.6.S t a r t G a m ev o i d S t a r t G a m e()功能:开始游戏参数:无。
返回值:无。
7.GameAreaDrawvoid GameAreaDraw()功能:画场景。
参数:无。
返回值:无。
4.代码#include "snake.h"CSnake::CSnake(int x_pos,int y_pos,int len){if(len<1) len=1;int i;m_length=len; //蛇的身体体长//初始化蛇的坐标位置m_pPos=new SPoint[m_length+2];m_pPos[0].x=x_pos;m_pPos[0].y=y_pos;for(i=1;i<m_length+2;i++){m_pPos[i].x=0;m_pPos[i].y=0;}//初始化蛇的运动状态m_newSnake.head=S_NONE;m_oldSnake.head=S_NONE;m_newSnake.body=new MoveState[m_length];m_oldSnake.body=new MoveState[m_length];for(i=0;i<m_length;i++){m_newSnake.body[i]=S_NONE;m_newSnake.body[i]=S_NONE;}m_newSnake.tail=S_NONE;m_oldSnake.tail=S_NONE;//初始化蛇的位图显示状态m_pStateArray=new BitmapState[m_length+2];for(i=0;i<m_length+2;i++)m_pStateArray[i]=M_NONE;}CSnake::~CSnake(){SAFE_DELETE_ARRAY(m_pStateArray);SAFE_DELETE_ARRAY(m_pPos);}////根据新旧两个身体的运动情况,返回当前应当显示的身体状态//BitmapState CSnake::GetRightState(MoveState oldDirect,MoveState newDirect){BitmapState res;switch(oldDirect){case S_NONE:switch(newDirect){case S_NONE:res=M_NONE;break;case S_UP:res=M_UP_UP;break;case S_DOWN:res=M_DOWN_DOWN;break;case S_LEFT:res=M_LEFT_LEFT;break;case S_RIGHT:res=M_RIGHT_RIGHT;break;}break;case S_UP:switch(newDirect){case S_UP:res=M_UP_UP;break;case S_LEFT:res=M_UP_LEFT;break;case S_RIGHT:res=M_UP_RIGHT;break;}break;case S_DOWN:switch(newDirect){case S_DOWN:res=M_DOWN_DOWN;break;case S_LEFT:res=M_DOWN_LEFT;break;case S_RIGHT:res=M_DOWN_RIGHT;break;}break;case S_LEFT:switch(newDirect){case S_LEFT:res=M_LEFT_LEFT;break;case S_UP:res=M_LEFT_UP;break;case S_DOWN:res=M_LEFT_DOWN;break;}break;case S_RIGHT:switch(newDirect){case S_RIGHT:res=M_RIGHT_RIGHT;break;case S_UP:res=M_RIGHT_UP;break;case S_DOWN:res=M_RIGHT_DOWN;break;}break;}return res;}////改变方向//void CSnake::ChangeDirect(MoveState d){// 改变方向的条件:非对立方向// 只能为其左,前,右方switch(d){case S_NONE:m_newSnake.head=d;break;case S_UP:if(m_newSnake.head!=S_DOWN) m_newSnake.head=d;break;case S_DOWN:if(m_newSnake.head!=S_UP) m_newSnake.head=d;break;case S_LEFT:if(m_newSnake.head!=S_RIGHT) m_newSnake.head=d;break;case S_RIGHT:if(m_newSnake.head!=S_LEFT) m_newSnake.head=d;break;}}////蛇移动//void CSnake::Move(void){int i;//1.计算新状态各个节点的状态//保存蛇身体各个部位的形状for(i=0;i<m_length;i++){m_oldSnake.body[i]=m_newSnake.body[i];}//将蛇身体的状态根据前面的状态变动一次m_newSnake.tail=m_newSnake.body[m_length-1];for(i=m_length-1;i>0;i--){m_newSnake.body[i]=m_newSnake.body[i-1];}m_newSnake.body[0]=m_newSnake.head;//根据新旧状态特性取正确的状态m_pStateArray[0]=GetRightState(m_oldSnake.head,m_newSnake.head);for(i=0;i<m_length;i++)m_pStateArray[i+1]=GetRightState(m_oldSnake.body[i],m_newSnake.bo dy[i]);m_pStateArray[m_length+1]=GetRightState(m_oldSnake.tail,m_newSnak e.tail);//将整个蛇的坐标移动//除蛇头外,其他部分的新位置为其前一部分的原来位置for(i=m_length+1;i>0;i--)m_pPos[i]=m_pPos[i-1];//蛇头的新位置根据蛇的运动方向判断做相应偏移switch(m_newSnake.head){case S_UP:m_pPos[0].y-=SNAKE_MOVE;break;case S_DOWN:m_pPos[0].y+=SNAKE_MOVE;break;case S_LEFT:m_pPos[0].x-=SNAKE_MOVE;break;case S_RIGHT:m_pPos[0].x+=SNAKE_MOVE;break;}}////蛇的身体增长//void CSnake::AddBody(int n){// 蛇的各种数据状态int i;Snake_Struct saveOldSnake,saveNewSnake;BitmapState *savestateArray;SPoint *savePos;//保存蛇的位置信息// possavePos=new SPoint[m_length+2];for(i=0;i<m_length+2;i++)savePos[i]=m_pPos[i];//保存蛇的状态信息// 1.oldSnake// 2.newSnake// 3.stateArray//1saveOldSnake.head=m_oldSnake.head;saveOldSnake.body=new MoveState[m_length];for(i=0;i<m_length;i++)saveOldSnake.body[i]=m_oldSnake.body[i];saveOldSnake.tail=m_oldSnake.tail;//2saveNewSnake.head=m_newSnake.head;saveNewSnake.body=new MoveState[m_length];for(i=0;i<m_length;i++)saveNewSnake.body[i]=m_newSnake.body[i];saveNewSnake.tail=m_newSnake.tail;//3savestateArray=new BitmapState[m_length+2];for(i=0;i<m_length+2;i++)savestateArray[i]=m_pStateArray[i];//将长度增长m_length+=n;//释放所有蛇的身体存储数据空间delete[] m_oldSnake.body;m_oldSnake.body=NULL; delete[] m_newSnake.body;m_newSnake.body=NULL; delete[] m_pStateArray;m_pStateArray=NULL; delete[] m_pPos;m_pPos=NULL;//创建并初始化增长后的蛇的数组m_newSnake.head=S_NONE;m_oldSnake.head=S_NONE;m_newSnake.body=new MoveState[m_length];m_oldSnake.body=new MoveState[m_length];for(i=0;i<m_length;i++){m_newSnake.body[i]=S_NONE;m_newSnake.body[i]=S_NONE;}m_newSnake.tail=S_NONE;m_oldSnake.tail=S_NONE;m_pStateArray=new BitmapState[m_length+2];for(i=0;i<m_length+2;i++)m_pStateArray[i]=M_NONE;m_pPos=new SPoint[m_length+2];for(i=0;i<m_length+2;i++){m_pPos[i].x=0;m_pPos[i].y=0;}//恢复原来长度的数据//a. newSnake ,oldSnake状态//b. stateArray//c. pos//am_newSnake.head=saveNewSnake.head;m_oldSnake.head=saveOldSnake.head;for(i=0;i<m_length-n;i++){m_newSnake.body[i]=saveNewSnake.body[i];m_oldSnake.body[i]=saveOldSnake.body[i];}m_newSnake.tail=saveNewSnake.tail;m_oldSnake.tail=saveOldSnake.tail;//bfor(i=0;i<m_length-n+2;i++)m_pStateArray[i]=savestateArray[i];//cfor(i=0;i<m_length-n+2;i++)m_pPos[i]=savePos[i];}//设置蛇头的坐标//void CSnake::SetHeadPos(int x,int y){m_pPos[0].x=x;m_pPos[0].y=y;}//取蛇的状态标识数组//BitmapState* CSnake::GetStateArray(void){return m_pStateArray;}//取蛇的位置数组//SPoint* CSnake::GetPos(void){return m_pPos;}////取蛇身的长度//int CSnake::GetLength(void){return m_length+2;}////检测蛇头是否触碰到其身体bool CSnake::IsHeadTouchBody(int x,int y){int i;for(i=1;i<m_length+2;i++)if(m_pPos[i].x==x&&m_pPos[i].y==y) return true;return false;}////初始化游戏结束后重新开始//void CSnake::Initial(void ){//释放以前的所有存储空间SAFE_DELETE_ARRAY(m_pStateArray);SAFE_DELETE_ARRAY(m_pPos);//创建蛇身长度为1的蛇,并做各种初始化int i;int x = 0;int y = 0;//初始化蛇的坐标位置m_length=1;m_pPos=new SPoint[m_length+2];m_pPos[0].x=x;m_pPos[0].y=y;for(i=1;i<m_length+2;i++){m_pPos[i].x=0;m_pPos[i].y=0;}//初始化蛇的运动状态m_newSnake.head=S_NONE;m_oldSnake.head=S_NONE;m_newSnake.body=new MoveState[m_length];m_oldSnake.body=new MoveState[m_length];for(i=0;i<m_length;i++){m_newSnake.body[i]=S_NONE;m_newSnake.body[i]=S_NONE;}m_newSnake.tail=S_NONE;m_oldSnake.tail=S_NONE;//初始化蛇的位图显示状态m_pStateArray=new BitmapState[m_length+2];for(i=0;i<m_length+2;i++)m_pStateArray[i]=M_NONE;}#include "table.h"CTable::CTable(){m_width=m_height=0;m_foodNumber=m_blockNumber=0;m_board=NULL;}CTable::~CTable(){if(m_board != NULL){SAFE_DELETE_ARRAY(m_board);}}////// 初始化背景//void CTable::InitialTable(int w,int h){//初始化Tableint i,j;//重新设置背景的高度与宽度m_width=w;m_height=h;//其他成员变量的初始化m_snake.Initial();if(m_board != NULL){SAFE_DELETE_ARRAY(m_board);}//根据高度和宽度创建一个新的背景m_board=new int*[m_height];for(i=0;i<h;i++){m_board[i]=new int[m_width];for(j=0;j<w;j++)m_board[i][j]=0;}//将背景四周设置为墙//将顶部跟底部的边缘设置为障碍物墙的状态for(i=0;i<h;i++){m_board[i][0]=TB_STATE_SBLOCK;m_board[i][m_width-1]=TB_STATE_SBLOCK;}//将左部和右部的边缘设置为障碍物墙的状态for(i=0;i<w;i++){m_board[0][i]=TB_STATE_SBLOCK;m_board[m_height-1][i]=TB_STATE_SBLOCK;}}////// 在某个位置放置障碍物//bool CTable::AddBlock(int x,int y){if( (x>=0)&&(x<m_width)&&(y>=0)&&(y<m_height)&&(m_board[y][x]==TB_STATE_OK) ) {m_board[y][x]=TB_STATE_BLOCK;++m_blockNumber;return true;}else{return false;}}//// 在某个位置放置食物//bool CTable::AddFood(int x,int y){if( (x>=0)&&(x<m_width)&&(y>=0)&&(y<m_height)&&(m_board[y][x]==TB_STATE_OK) ) {m_board[y][x]=TB_STATE_FOOD;++m_foodNumber;return true;}else{return false;}}////// 清除某个位置的食物//bool CTable::ClearFood(int x,int y) {m_board[y][x]=TB_STATE_OK;return true;}////// 获取蛇类//CSnake* CTable::GetSnake(void){return &m_snake;}////// 取场景类对象//int** CTable::GetBoard(void){return m_board;}//// 取场景某个位置数据//int CTable::GetData(int x,int y){return m_board[y][x];}////// 蛇的移动//void CTable::SnakeMove(void){m_snake.Move();}////// 改变蛇的方向//bool CTable::ChangeSnakeDirect(MoveState d){m_snake.ChangeDirect(d);return true;}#include<windows.h>#include <time.h>#include"snaker.h"#include"table.h"//游戏状态定义#define GAME_STATE_WAIT 0 //游戏等待状态#define GAME_STATE_RUN 1 //游戏运行状态#define GAME_STATE_END 2 //游戏结束状态//界面相关物件尺寸定义#define WALL_WIDTH 80 //外墙从左部到游戏区的宽度#define WALL_HEIGHT 80 //外墙从顶部到游戏区的高度#define BMP_SCORE_BOARD_WIDTH 256 //分数位图板的宽度#define BMP_SCORE_BOARD_HEIGHT 55 //分数位图板的高度#define BMP_WALL_WIDTH 16 //墙位图的宽度#define BMP_WALL_HEIGHT 16 //墙位图的高度LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam); void DrawGame(void);void ShellDraw( HDC hdc );void GameAreaDraw(HDC hdc);void OnTimer(UINT uTIMER_ID);void StartGame( void );void EndGame( void );//创建一个背景CTable table;int tableBlockWidth = 0; //背景的单元格的宽度int tableBlockHeight = 0; //背景的单元格的高度int iScores = 0; //游戏的得分UINT uGameState = GAME_STATE_WAIT; //当前游戏状态HDC windowDC = NULL; //windows屏幕设备HDC bufferDC = NULL; //缓冲设备环境HDC picDC = NULL; //snake图像内存设备HDC endDC = NULL; //游戏终结图像内存设备HDC scoreDC = NULL; //分数板内存设备HWND hAppWnd = NULL;HBITMAP picBMP = NULL; //snake图像位图HBITMAP bufferBMP = NULL; //缓冲位图HBITMAP endBMP = NULL; //游戏终结图像内存HBITMAP hbmpWall = NULL; //墙位图HBITMAP hbmpScore = NULL; //分数板位图HBRUSH hbrushWall = NULL;//定时器标识UINT uSnakeMoveTimer; //蛇的移动UINT uFoodAddTimer; //食物的产生//框架的位置数据定义RECT g_ClientRect;RECT g_GameValueRect;int g_iClientWidth;int g_iClientHeight;int WINAPI WinMain(HINSTANCE hCurrentInst,HINSTANCE hPrevInstance, PSTR lpszCmdLine,int nCmdShow){WNDCLASS wndClass;HWND hWnd;MSG msg;UINT width,height;//定义窗口wndClass.style=CS_HREDRAW | CS_VREDRAW;wndClass.lpfnWndProc=WndProc;wndClass.cbClsExtra=0;wndClass.cbWndExtra=0;wndClass.hInstance=hCurrentInst;wndClass.hIcon=LoadIcon(NULL,MAKEINTRESOURCE(IDI_MAIN));wndClass.hCursor=LoadCursor(NULL,IDC_ARROW);wndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wndClass.lpszMenuName=NULL;wndClass.lpszClassName="Snake_CLASS";RegisterClass(&wndClass);//取整个屏幕的尺寸width=GetSystemMetrics(SM_CXSCREEN);height= GetSystemMetrics(SM_CYSCREEN);//新建窗口hWnd=CreateWindow("Snake_CLASS","skyblue snake",WS_POPUP,0,0,width,height,NULL,NULL,hCurrentInst,NULL);hAppWnd = hWnd;//显示窗口ShowWindow(hWnd,nCmdShow);UpdateWindow(hWnd);//获取窗体大小GetClientRect(hAppWnd, &g_ClientRect);g_iClientWidth = g_ClientRect.right-g_ClientRect.left;g_iClientHeight = g_ClientRect.bottom-g_ClientRect.top;//将游戏区域分成纵,横均为20块的单元格//并计算每个单元的大小tableBlockWidth = (g_iClientWidth-2*WALL_WIDTH)/20;tableBlockHeight = (g_iClientHeight-2*WALL_HEIGHT)/20;windowDC=GetDC(NULL);bufferDC=CreateCompatibleDC(windowDC);picDC=CreateCompatibleDC(windowDC);endDC=CreateCompatibleDC(windowDC);scoreDC=CreateCompatibleDC(windowDC);//位图的初始化或载入位图bufferBMP=CreateCompatibleBitmap(windowDC,g_iClientWidth,g_iClien tHeight);picBMP=(HBITMAP)LoadImage(NULL,"snake.bmp",IMAGE_BITMAP,160,80,LR _LOADFROMFILE);hbmpWall=(HBITMAP)LoadImage(NULL,"brick.bmp",IMAGE_BITMAP,16,16,L R_LOADFROMFILE);endBMP =(HBITMAP)LoadImage(NULL,"end.bmp",IMAGE_BITMAP,369,300,LR_LOADFROMFIL E);hbmpScore=(HBITMAP)LoadImage(NULL,"scoreboard.bmp",IMAGE_BITMAP,2 65,55,LR_LOADFROMFILE);SelectObject(bufferDC,bufferBMP);SelectObject(picDC,picBMP);SelectObject(endDC,endBMP);SelectObject(scoreDC,hbmpScore);hbrushWall = CreatePatternBrush(hbmpWall);StartGame();while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;}LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) {switch(message){case WM_TIMER :OnTimer((UINT)wParam);break;case WM_KEYDOWN:switch(wParam){case VK_ESCAPE:exit(0);break;case VK_UP:table.ChangeSnakeDirect(S_UP);break;case VK_DOWN:table.ChangeSnakeDirect(S_DOWN);break;case VK_LEFT:table.ChangeSnakeDirect(S_LEFT);break;case VK_RIGHT:table.ChangeSnakeDirect(S_RIGHT);break;case VK_SPACE:if( uGameState == GAME_STATE_END ){StartGame();break;}}return 0;case WM_SETCURSOR:SetCursor(NULL);return 0;case WM_DESTROY:ReleaseDC(hWnd,picDC);ReleaseDC(hWnd,bufferDC);ReleaseDC(hWnd,windowDC);PostQuitMessage(0);return 0;}return DefWindowProc(hWnd,message,wParam,lParam);}void DrawGame(void){ShellDraw(bufferDC);GameAreaDraw(bufferDC);BitBlt(windowDC,0,0,g_iClientWidth,g_iClientHeight,bufferDC,0,0,S RCCOPY);}void OnTimer(UINT uTIMER_ID){if ( uTIMER_ID == uSnakeMoveTimer ){//移动蛇table.SnakeMove();//检测是否碰到身体(环绕),结束游戏if(table.GetSnake()->IsHeadTouchBody(table.GetSnake()->GetPos()[0 ].x,table.GetSnake()->GetPos()[0].y)){EndGame();}//根据蛇头所在的区域作出相应的处理switch(table.GetData(table.GetSnake()->GetPos()[0].x,table.GetSna ke()->GetPos()[0].y)){case TB_STATE_FOOD:table.ClearFood(table.GetSnake()->GetPos()[0].x,table.GetSnake()->GetPos()[0].y);table.AddBlock((rand())%tableBlockWidth,(rand())%tableBlockHeight );table.GetSnake()->AddBody();++iScores;break;case TB_STATE_BLOCK:case TB_STATE_SBLOCK://检测是否碰到障碍物,结束游戏EndGame();break;}//显示DrawGame();}else if ( uTIMER_ID == uFoodAddTimer ){//定时加食物table.AddFood((rand())%tableBlockWidth,(rand())%tableBlockHeight) ;}}void StartGame(){iScores=0;//背景的初始化table.InitialTable(tableBlockWidth,tableBlockHeight);table.GetSnake()->ChangeDirect(S_RIGHT);table.GetSnake()->SetHeadPos(tableBlockWidth/2,tableBlockHeight/2 );//预先随机产生几个食物srand( (unsigned)time(NULL) );for(int iFoodNum=0; iFoodNum<4; iFoodNum++){table.AddFood((rand())%tableBlockWidth,(rand())%tableBlockHeight) ;}//计时uSnakeMoveTimer = SetTimer(hAppWnd,500,100,NULL);uFoodAddTimer = SetTimer(hAppWnd,600,7000,NULL);uGameState = GAME_STATE_RUN;}void EndGame( void ){//关闭计时KillTimer(hAppWnd,uSnakeMoveTimer);KillTimer(hAppWnd,uFoodAddTimer);uGameState = GAME_STATE_END;}void ShellDraw( HDC hdc ){// HDC hMemDc;// BOOL ret = TRUE;// HDC hMemoryDC;// HBITMAP hbmp;//分数提示显示文字char szText[30] = "Score: ";char szNum[20];int iNowScore = iScores*100;itoa(iNowScore,szNum,10);strcat(szText, szNum);RECT rt, rect;GetClientRect(hAppWnd, &rt);//墙的绘制SelectObject(hdc,hbrushWall);PatBlt(hdc,rt.left,rt.top,rt.right,rt.bottom,PATCOPY);//内部游戏区的白色底平面rect.left = rt.left+WALL_WIDTH;rect.top = rt.top + WALL_HEIGHT;rect.right = rt.right - WALL_WIDTH;rect.bottom = rt.bottom - WALL_HEIGHT;FillRect(hdc, &rect, (HBRUSH) (COLOR_WINDOW+1));//分数提示板的绘制/* hMemoryDC = CreateCompatibleDC(NULL);hbmp = CreateCompatibleBitmap(hdc,265,55);SelectObject(hMemoryDC,hbrushScore);SelectObject(hMemoryDC,hbmp);PatBlt(hMemoryDC,0,0,256,55,PATCOPY);BitBlt(hdc,GetSystemMetrics(SM_CXSCREEN)/3,10,256,55,hMemoryDC,0,0,SRCCOPY);*/BitBlt(hdc,GetSystemMetrics(SM_CXSCREEN)/3,10,256,55,scoreDC,0,0,SRCCOPY);//分数的绘制SetBkMode(hdc, TRANSPARENT);TextOut(hdc, GetSystemMetrics(SM_CXSCREEN)/3+50,30,szText,strlen(szText) );}void GameAreaDraw(HDC hdc){int i,j;int x,y, x_pos,y_pos;BitmapState state;char strMark[20];//绘制水果与障碍物for(i=0;i<tableBlockHeight;i++)for(j=0;j<tableBlockWidth;j++){x_pos = j*20+WALL_WIDTH;y_pos = i*20+WALL_HEIGHT;switch(table.GetData(j,i)){case TB_STATE_FOOD:BitBlt(hdc,x_pos,y_pos,20,20,picDC,100,0,SRCPAINT);BitBlt(hdc,x_pos,y_pos,20,20,picDC,20,0,SRCAND);break;case TB_STATE_BLOCK:BitBlt(hdc,x_pos,y_pos,20,20,picDC,80,0,SRCPAINT);BitBlt(hdc,x_pos,y_pos,20,20,picDC,0,0,SRCAND);break;}}//根据当前的状态绘制蛇头x=table.GetSnake()->GetPos()[0].x;y=table.GetSnake()->GetPos()[0].y;x_pos = x*20+WALL_WIDTH;y_pos = y*20+WALL_HEIGHT;state=table.GetSnake()->GetStateArray()[0];switch(state){case M_UP_UP:BitBlt(hdc,x_pos,y_pos,20,20,picDC,80,20,SRCPAINT);BitBlt(hdc,x_pos,y_pos,20,20,picDC,0,20,SRCAND);break;case M_DOWN_DOWN:BitBlt(hdc,x_pos,y_pos,20,20,picDC,140,20,SRCPAINT);BitBlt(hdc,x_pos,y_pos,20,20,picDC,60,20,SRCAND);break;case M_LEFT_LEFT:BitBlt(hdc,x_pos,y_pos,20,20,picDC,100,20,SRCPAINT);BitBlt(hdc,x_pos,y_pos,20,20,picDC,20,20,SRCAND);break;case M_RIGHT_RIGHT:BitBlt(hdc,x_pos,y_pos,20,20,picDC,120,20,SRCPAINT);BitBlt(hdc,x_pos,y_pos,20,20,picDC,40,20,SRCAND);break;}//根据各个蛇身节点的状态绘制蛇身的形状for(i=1;i<table.GetSnake()->GetLength()-1;i++){x=table.GetSnake()->GetPos()[i].x;y=table.GetSnake()->GetPos()[i].y;x_pos = x*20+WALL_WIDTH;y_pos = y*20+WALL_HEIGHT;state=table.GetSnake()->GetStateArray()[i];switch(state){case M_UP_UP:case M_DOWN_DOWN:BitBlt(hdc,x_pos,y_pos,20,20,picDC,80,40,SRCPAINT);BitBlt(hdc,x_pos,y_pos,20,20,picDC,0,40,SRCAND);break;case M_LEFT_LEFT:case M_RIGHT_RIGHT:BitBlt(hdc,x_pos,y_pos,20,20,picDC,100,40,SRCPAINT);BitBlt(hdc,x_pos,y_pos,20,20,picDC,20,40,SRCAND);break;case M_RIGHT_DOWN:case M_UP_LEFT:BitBlt(hdc,x_pos,y_pos,20,20,picDC,100,60,SRCPAINT);BitBlt(hdc,x_pos,y_pos,20,20,picDC,20,60,SRCAND);break;case M_LEFT_DOWN:case M_UP_RIGHT:BitBlt(hdc,x_pos,y_pos,20,20,picDC,80,60,SRCPAINT);BitBlt(hdc,x_pos,y_pos,20,20,picDC,0,60,SRCAND);break;case M_RIGHT_UP:case M_DOWN_LEFT:BitBlt(hdc,x_pos,y_pos,20,20,picDC,140,40,SRCPAINT);BitBlt(hdc,x_pos,y_pos,20,20,picDC,60,40,SRCAND);break;case M_LEFT_UP:case M_DOWN_RIGHT:BitBlt(hdc,x_pos,y_pos,20,20,picDC,120,40,SRCPAINT);BitBlt(hdc,x_pos,y_pos,20,20,picDC,40,40,SRCAND);break;}}//绘制蛇尾巴x=table.GetSnake()->GetPos()[table.GetSnake()->GetLength()-1].x;y=table.GetSnake()->GetPos()[table.GetSnake()->GetLength()-1].y;x_pos = x*20+WALL_WIDTH;y_pos = y*20+WALL_HEIGHT;state=table.GetSnake()->GetStateArray()[table.GetSnake()->GetLeng th()-1];switch(state){case M_UP_UP:BitBlt(hdc,x_pos,y_pos,20,20,picDC,120,60,SRCPAINT);BitBlt(hdc,x_pos,y_pos,20,20,picDC,40,60,SRCAND);break;case M_DOWN_DOWN:BitBlt(hdc,x_pos,y_pos,20,20,picDC,120,0,SRCPAINT);BitBlt(hdc,x_pos,y_pos,20,20,picDC,40,0,SRCAND);break;case M_LEFT_LEFT:BitBlt(hdc,x_pos,y_pos,20,20,picDC,140,60,SRCPAINT);BitBlt(hdc,x_pos,y_pos,20,20,picDC,60,60,SRCAND);break;case M_RIGHT_RIGHT:BitBlt(hdc,x_pos,y_pos,20,20,picDC,140,0,SRCPAINT);BitBlt(hdc,x_pos,y_pos,20,20,picDC,60,0,SRCAND);break;}if(uGameState == GAME_STATE_END){//绘制游戏结束图像int x_pos = g_iClientWidth/3;int y_pos = g_iClientHeight/4;BitBlt(hdc, x_pos, y_pos, 369, 300, endDC, 0, 0, SRCCOPY);}}5.课程设计设计心得与体会贪吃蛇是家喻户晓的益智类小游戏,选择这个题目一是为了将自己的所学知识加以运用,二是一直以来贪吃蛇这个游戏就深深地吸引着我,它的制作方法对于以前的我而言都是很神秘的。