
自学编程要做到将编程作为自己的爱好、对自己的电脑了解、确定自己的编程语言、多看书,具体介绍如下:
1、要想真正学习一门知识,就要先尽量保持将其保持为一种爱好,才能一步一步的学习,还要保持耐心,不能为了成果跳跃学习。这两句话很重要,请在任何时候都要记住,无论那一门课。
2、要对自己家的电脑有一个充分的了解,包括他的位数(64位,32位),内存,型号,和版本,如果要编程的话,一定要对电脑的各个功能有详细的了解
3、先确定自己要学的编程语言,将其语言环境和编程工具准备好。入门最好使用c-free,或Java(要准备语言环境)入门或是深入都可以使用eclipse,python(要准备语言环境)可以使用editplus。
4、多在当地书城或是网上购买一些所学习的语言的书,可以轻松自学,当然如果你认为仅仅是文字并不够生动,可以看看一些优秀的教学视频,但千万不要放弃书本。
注意事项:
1、 明确学习目的 学习编程对大多数IT业人员来说都是非常有用的。
2、逻辑思维能力的培养,学程序设计要有一定的逻辑思维能力,“逻思力”的培养要长时间的实践锻炼。要想成为一名优秀的程序员,最重要的是掌握编程思想。
机顶盒上游戏开发可以么,也是用C语言写的
目 录
第一章 绪论 1
11机顶盒的产生背景 1
12机顶盒的发展及其现状 1
13游戏模块设计的必要性 2
14模块设计需要解决的问题 3
第二章 系统开发环境及相关技术介绍 4
21 XX-XX硬件平台 4
22 XX *** 作系统 4
221 内核 4
222 任务机制 5
223 消息队列 6
224 信号量 7
23 C语言的特点 7
第三章 开发流程 9
31 功能需求分析 9
32 可行性分析 9
33 模块设计 10
34 编码 10
35 测试 11
第四章 系统设计 12
41游戏模块接口设计 12
411游戏的初始化 12
412游戏的按键读取和转化 12
413游戏的暂停、恢复和退出 12
42 游戏算法设计 13
421推箱子游戏设计 13
422 俄罗斯方块游戏设计 14
423 黑白棋游戏设计 14
结 论 16
谢 辞 17
参 考 文 献 18
附录 推箱子游戏源程序 19
起我国计算机业的发展,让人无法忘记这样一个经典场面:20年前,在286电脑刚刚进入中国的年代,邓小平在上海观看了一个孩子做的电脑演示后,说:“计算机普及要从娃娃抓起。”20年过去了,这句看似普通的话,至今被人认定为邓小平重视计算机事业特别是科普发展的经典讲话。 如果老人家在天有灵,一定会为当年那个“娃娃”的成才感到欣慰。记者多方查找,日前终于联系上当年的“娃娃”、如今在美国微软总部的李劲。“邓小平当年那句话对我激励太大了,我现在取得的成功首先受益于他老人家。”李劲由衷地说。 娃娃玩电脑 引出一金句 1984年2月16日,正是元宵佳节,邓小平来到上海市展览中心,参观正在这里举办的微电子技术应用汇报展览会。当时,已经学过2年计算机的李劲有幸为邓小平作演示。 李劲回忆说:当年我才13岁。那天上午,我在中国福利会少年宫王老师的带领下,和小我2岁的女孩丛林一起来到上海市展览中心。上午10时,一楼展厅突然人声鼎沸,有人喊着:“邓小平来了,邓小平来了。”我当时很紧张,不知道该怎么对邓爷爷说,这时王老师告诉我:“今天是元宵节,你们就说‘给邓爷爷拜个晚年,祝邓爷爷身体健康’。” 当天,李劲为邓小平演示了自己设计的“中国航天梦”图案和电脑下黑白棋程序。“邓爷爷喜欢下棋,他看我演示电脑下棋,就忍不住停下来,花了大约4分钟时间与计算机对弈了一局,最后他执黑战胜了计算机棋手。” 下完棋,邓小平感慨地说:“计算机普及要从娃娃抓起。” 左图:“计算机普及要从娃娃抓起。”20年前邓小平看完李劲(左)的演示后说出的这句话,被认为是邓小平推动科普发展的经典金句 高一才毕业 免试入清华 自此,小李劲的学习劲头更足了。初中毕业,李劲自修完高中的数学和物理以及高一的化学;在全国青少年程序设计竞赛(现信息奥林匹克的前身)中,李劲获得最高分,一时引起轰动。 李劲的优异表现,引起上海华师大二附中的注意,学校不仅破格录取他,而且让他免修高中的数理化课程,由老师“开小灶”超前培养。这年,李劲参加美国数学邀请赛,同组的选手都是经过奥赛冬令营培训过的高三学生,但小小的李劲还是取得第一名。李劲的天分,让他的启蒙老师、中国福利会少年宫的李毓俊老师忍不住找到大学同学、清华大学电子系刘润生教授,向他极力推荐李劲。 刘润生教授在接受本报记者电话采访时回忆道,当时,李毓俊老师告诉他,李劲成绩太好了,再让他读高中是浪费时间。爱才的刘润生教授闻讯专程赶到上海,对李劲进行“考察”。 刘润生教授回到北京,当即写报告给国家教委,要求破例让李劲跳两级,直接上清华读本科。经过协调,1987年,读完高一的李劲免试进入清华大学电子系。 娃娃博士生 神话一个个 刘润生教授告诉记者,刚入清华大学的李劲英语不太好,刘润生教授找李劲谈话没多久,李劲的外语水平提升之快让人吃惊:从一级起步的李劲在大一结束时通过了英语六级考试,而当时清华大学一般的本科生都需要2年以上才能通过。 在专业课方面,李劲不断在清华园演绎“神话”:上大一不到2个月,李劲就开始跳级,半年时间跳级两次;大一下学期,清华大学电子系党委书记亲自挂帅,专门为李劲制定教学计划;大一年终考试,李劲几乎所有科目的成绩都是班上最好的,有四门课得了满分;1988年6月,时任清华大学校长的张孝文破天荒召开教学会议,专门讨论李劲的培养问题;1990年9月,刚读完大三的李劲通过毕业答辩,一年后又通过硕士研究生论文答辩。 参加李劲本科答辩的,有清华大学图像处理室主任、北大图像处理室专家和学校分管教学的领导。“各方面专家就有五人,清华的硕士答辩也很少享受这样的待遇!当时,我们听了李劲的论文,都觉得水平太高了,远高于本科学生的水平,我提议,干脆将李劲的本科答辩改成硕士答辩。”刘润生教授回忆说。 清华大学的教务人员马上按硕士研究生的标准来算李劲的学分,发现选修了数学等多门课程的李劲总分早够了,但专业课还差7个学分,无法硕士毕业。 半年后———只在清华大学读了3年半的李劲,就捧回常规需8年才能拿到的硕士学位;1994年取得清华大学博士学位;此时,李劲才23岁,有人戏称他为“娃娃博士”。 刘润生教授说,他在清华50多年,李劲是他看到的最好的学生,也是他迄今所知最年轻的博士。 右图:今天的李劲已成为世界知名的电脑专家 从来不熬夜 关键是兴趣 1998年,李劲在国际光学工程师学会与图像科学技术学会共同召开的视频通信与图像处理年会上获得青年学者奖。这是国际图像研究机构给予获得博士学位五年后的年轻学者的一个特殊奖项,每年一人。这表明,时年27岁的李劲已经成为国际上从事多媒体研究的有成就的学者之一。 同年,李劲来到微软工作,成为微软最年轻的研究员。李劲的一项成果就是,研究出许多媒介传输方法,如通过压缩图像、声音等,使媒介内容在一组电脑中能够更加高效、准确地传输。 至今,李劲已发表80篇在国际上有影响的论文,是全世界最大的专业技术学会———美国电气电子工程师学会的资深会员。 记者采访熟悉李劲的人,都说李劲从不熬夜。李劲告诉记者:“我现在都没有熬夜的习惯,读书时唯一一次熬夜,是因为博士论文没写完!”他说,熬夜的感觉太痛苦了,“参加考试、比赛我也从不准备”。 他告诉记者,要不熬夜,“部分的聪明是必要的,但更重要的是EQ,还有环境和机遇”。 “EQ,我的理解是情商,是好的心态,”李劲说,“比如面对难题时,不但要保持自信,还要能发挥出最佳竞技状态。对待生活中的挫折也是一样。刚到美国读书的时候,我的成绩也不是最好的,可我能以平和的心态去对待。不断自我培养自信,后来,对待难题也好,人生也好,我都愿意以自信的心态去对待。” 他还说,自己的成功同时也说明,兴趣和爱好永远是一个人对某件事乐此不疲的重要因素。在脑力和体力异常辛苦的同时,精神是兴奋而愉快的。说苦其实不苦,说不苦其实很苦。学会学习,要从小学就开始。只有会学习,才能善于认识新知识,才能解决学习上的问题。
求采纳
1开场
自我介绍, 简单讲述我大学的学习的历程,成果和感想。(1分钟)
我一直都感慨本年级许多同学在大一时因为缺乏好指引,在一开始就对编程很害怕,对计算机的学习没有开好头,动手能力长期跟不上,空会理论,不会实践,一直拖累到大四,最终选择忍痛考研或者抱怨找工作难。我也帮助过不少在这方面比较弱的同学,但是总是因为基础没打好导致难以提高。我也一直希望学校能在大一的时候就让同学们明白学习的重要性,打好扎实的专业基础。现在终于有一次这样的机会站在这里,为指引大家如何在大学专业技术学习的道路上开好头做点贡献。
今天我将结合我自身的经历和我对计算机的理解,我对编程的感悟,我对大学学习的认识,给大家做报告。
首先问三个问题:
1) qq聊天软件是用什么语言写的(第二天要换个问题)
答对的演讲结束后留下来,我要亲自给他传授宝贵经验,没人答的话,很遗憾
2) 谁玩电脑游戏比较牛
恩,人很多,大家很踊跃,很好
展示下我写的人工智能黑白棋游戏,声明真正的编程高手基本从来不玩游戏
(结合大四同学长期沉迷游戏最后找不到工作的例子,说明一个严肃的问题,只会玩游戏没有用,会做游戏才牛,鼓励大家努力学习,让会玩游戏的同学也热爱编程,最后也能自己写游戏)
请大家记住:只会玩游戏没有用,会做游戏才牛
3) 有没有人对计算机特别感兴趣 (为什么感兴趣)
如果有兴趣,对学习计算机有巨大的帮助
兴趣是最好的老师,鼓励他们,勉励其他人,兴趣是可以培养的,要学会培养兴趣
2概述
计算机"科学"与"技术" 包含两个层面
"科学" 指计算机硬件、软件与应用的理论知识 理论的学习
"技术" 指软件开发、工程实践等技能与方法 能力的培养
我主要讲的是如何学习技术(计算机技术)
讲之前 澄清一个观点 计算机技术 不等于 编程技术
编程只是一个工具,编程没学好不代表你技术就学不好
计算机技术应该是与计算机软件、硬件和网络三个部分相关的各种科技成果和应用的综合,包括了多媒体,数据库, *** 作系统,嵌入式系统,计算机安全,计算机网络,计算机管理和维护,计算机应用,人工智能,模式识别,管理信息系统等,在我们生活的方方面面计算机技术几乎无处不在。
(举几个例子)在现在社会,它几乎与我们的生活息息相关。
(大学和高中的学习方式的区别)(学好技术的重要性)
在大学,学习的方式与高中或小学是有很大的区别的,大学更大,大学更自由,不再是完全跟着老师,不再是只要吃透了老师教授的内容就万事大吉了,从我这一届的情况看,许多同学特别是女生在大学还沿袭着高中的学习方式,勤奋刻苦,天天自习,非常认真,上课笔记做得秘密麻麻,把理论学得非常扎实,但是却严重地忽略了实践能力的培养,理论考试分数很高,但课程设计做不出东西来,显然这种学习方式是不对的,这和高中的偏科又有什么本质区别呢。
我觉得理论的学习和技术的学习是同等重要的,二者都不应该轻视,没有侧重点是不可能的,至于如何侧重,如何在二者之间找到平衡点就取决于你自己的人生目标了。如果你喜欢研究理论,以后想继续读研深造可以稍微偏向理论,把理论基础打得扎实一些,毕业以后可以留校任教或到科研院所去发展。如果你想走技术路线,那么你就可以稍稍偏向技术,在不落下理论学习的情况下,把技术学好学精,毕业以后可以去IT企业发展,也可以自己创业,有了一身技术不怕没饭吃。切莫完全忽视技术最后变成书呆子或完全不顾理论最后只是个代码搬运工。
大家每个人,从现在开始就要下决心学好技术,那么,如何学好技术呢。
3如何学好技术
31制定好的学习计划
311大一大二:打好基础
3111计算机方面的基本技能的学习
包括计算机众多的应用技术的学习 和 常见的硬件维护
(大家应该尽量多多掌握计算机方面的基本技能,如word excel ppt access photoshop flash dreamveaver 结合我的经历讲讲,我大一在自己没有电脑的情况下把这些基本全学了 举一个考研的同学不会在excel里找自己的名字的例子,如果这些最基本的技能都不会,只能说计算机还没入门)大二有电脑之后,终于有机会整自己的电脑了,要学习常见的常见的硬件维护(系统崩溃了怎么办,如何安装 *** 作系统,如何分区等)
3112专业理论基础和编程基础的学习
技术是将理论运用到实践中去,不能轻视理论,没有理论何来应用。计算机"科学"与"技术" 中的"科学"和"技术"应该是相互依赖和促进的。
先学好《高级语言程序设计》《数据结构》等专业课,理论基础扎实了,学应用性技术就更容易了
编程基础:学精C++(为什么),可以考虑过渡到 java 或 C# (最好只学一个,为什么)
(编程的学习会在后面再详细讲)
3113珍惜这两年大学自由学习的黄金时间
(曾经和一家公司的经理开玩笑,总经理感慨的说现在在大学里找一个又能力的学生来帮忙做项目真是很难啊,我说是呀,大学四年,大一的刚进校还在打基础没法做,大二的还刚起步没足够的能力做,大三的课程会很紧没时间做,大四的找工作的找工作去了,考研的考研去了,没人做了),大学四年,实则三年,希望大家不要把最宝贵的时间荒废在游戏和娱乐上
312大三:深入学习,确定方向(技术方向,职业规划)+多多实践
到了大三,各种专业课会非常多,包括很重要的 *** 作系统,汇编,组成原理,编译原理,数据库,计算机网络,软件工程等等,大家将深入学习计算机的各大核心课程。这时大家的基础打得也差不多了,可以选择一门自己比较感兴趣的技术并确定自己的技术的一个方向,比如选择j2ee, NET,WEB技术,数据库技术,嵌入式,linux内核开发等等。当然也会有非常丰富多彩的专业选修课可以选择学习。这段时间大家可以利用课程设计的机会好好锻炼自己。
313大四:实践和进步
大四,如果不打算考研的同学,工作有了着落之后,可以试着做项目,大四基本没什么课,相对轻松,这段时间是获得经验,银子和巨大的进步黄金时期。
32重视专业课的学习
要把数据结构、算法、数据库、 *** 作系统原理、计算机体系结构、计算机网络,离散数学等基础课程学好
除非你足够牛,请务必认真听专业课,有些课像《数据结构》,《编译原理》,《组成原理》,《 *** 作系统》等等,这种课老师讲一分钟能让你明白的内容,你自己看要看好几个月
33培养好的思维能力
数学是锻炼是思维的最好的东西了,他是你思考问题的最得力的工具,他体现着你的思想,在编程中会思考才能编出好的程序。
此外还要注重离散数学,数值分析,线性代数,数字逻辑等等课程的学习,他们对培养好的思维能力大有裨益
34激励创新意识
创新太重要了,不管在哪个学科都重要,计算机同样需要
35培养独立分析问题和解决问题的能力
遇到问题,要先学会独立思考,不能凡事依赖他人,尽量自己解决,在独立解决问题过程中能获得更大的进步,实在不能解决再请教别人也不迟
36培养自学能力和快速获取知识的能力
自学能力之重要(大学和高中的学习方式的区别)
可以说高中是靠老师,大学是靠自己,要做到严格自律,自我约束,必须要学会自学
学习的过程也是学会学习的过程
要充分利用图书馆和网络上的丰富学习资源, 要培养计算机新知识,新技术方面的自学习能力,要学会如何通过网络,书籍,文献,独立地快速获取自己需要的知识和信息
37培养团队协作精神
在一个大型项目中,往往要求各种参与者密切配合才能取得成功。大家要从现在就开始注重团队协作精神的培养,要学会与人沟通,善于表达,要注意提高自己的综合素质,成为综合型人才。
38学好英语
包括现在的大学英语和日后的专业英语。
也许有人会问,英语和技术有什么大的关系吗。大家是否知道,计算机的发展飞速,国际上新技术不断涌现,如果今天国外出现了一门新的技术,或者国外某本技术书籍出了新版本,相关资料的中文的翻译不知道要等到什么猴年马月才会出来,现在的许多出版也有了越来越多的英文原版书。
大家要学好英语,培养阅读专业外语资料的能力,开始会看不懂,看多了自然熟练了。
(讲下四六级,四级最好一次就过,六级在大二下结束前最好过)
39适时关注新技术
了解学科发展动态,跟上时代步法
310勤学苦练,持之以恒
学好技术不是一蹴而就的,要长期坚持。
4无
5无
6关于编程的学习
61为什么要学习编程
编程是软件开发的基础,学习计算机,只会编程是千万不行的,但是开发软件,不会编程是万万不行的
(结合本年级的情况将一下现状,学习的重要性等)
62编程真的那么难学吗
(讲讲编程的苦与乐)
编程真的那么可怕,那么枯燥,那么没意思吗?假如真是这样,为什么世界上还有那么多优秀的人乐此不疲。
其实编程并不可怕,可怕的是你的心态。
编程固然很苦,编程时长时间对着屏幕,对身体不好,而且,经常因为考虑不周,会遇到各种各样的错误和麻烦,初学者处处容易受挫。
但是其实编程是很有趣的,编程中充满着无穷的快乐
首先,你通过编程得到了想要的成果的过程是一种创造的快乐
(编出了有用的东西的那一刻会有一股美好的成就感)
其次,你开发了有用的软件可以方便自己或他人,方便自己,是一种享受的快乐,方便他人,是一种奉献的快乐
再次,假如你开发的软件得到了用户的认可或好评,会有一种欣慰和满足感
还有,你可以根据自己的意愿写你想要的东西,经过自己的努力亲自实现你心中的愿望
然后,编程也是一个挑战自我的过程,遇到困难想办法解决的过程是思考的过程,思维能得到锻炼
最后,在代码中有一种看不见的美,就像诗一样,美景全是你的,你可以随心所欲
编程真的非常有趣,它不仅满足了我们内心深处进行创造的渴望,让人头脑变得灵活,而且还愉悦了每个人内在的情感。
63学好编程的建议
631请热爱编程
如果想成为编程牛人的话,请热爱编程。有兴趣是最好了,没兴趣也没关系,可以慢慢培养,当你感受到了编程的乐趣的时候你会爱上它。
632不要畏难
很多初学者往往都在遇到许多困难,遭受多次挫折后,自信心受到打击从而对编程丧失兴趣
这些困难每个人都会遇到,我在初学编程时也遇到过,关键是看你用什么心态对待,是想办法解决困难还是选择逃避。很多问题其实是有很多解决方法的。譬如看书,遇到看不懂的部分,可以暂时跳过,先往后看,看完后面的之后,再回头看前面跳过的部分往往会有一种豁然开朗的感觉。再比如,编程调试时死活找不到错误会很郁闷,这个时候很多同学会束手无策,其实只要在程序不同的地方加上输出语句,然后运行看有哪些输出,这样一步步缩小错误的范围从而确定错误发生的位置。等等。。。
不要畏惧困难,要用你的智慧战胜它。
633多实践,多交流
学习编程的秘诀是:编程,编程,再编程;(讲讲如何动手实践)
在学校的实验室就算你做错一万次程序都不会有人骂你,如果在公司你试试看!所以多去实验室上机,现在错得多了,毕业后就错得少了。多实践,多从失败中吸取教训,积累经验。要勤奋,三天打鱼两天晒网是学不好的,学会了的东西一段时间不用就容易忘记,实践得越多才能记得越牢。
现在大家是大一,可能有人会说没有电脑不方便,其实实验室不是只有在老师安排的实验时间才可以去的,它是是面向计算机专业的学生免费开放的,大家有时间就去实验机房练习,只要拿着学生证,或者干脆直接跟那个阿姨说你是计算机的就行了。航海楼7楼的机房和图书馆电子阅览室也是可以的。我大一的时候甚至还到阳光网吧编程呢。
到大二大三的时候课程设计就会多起来,大家一定要自己动手做,不要去网上搜一个就完事了。
与人交流,分享自己编程中的乐趣和经验,共同进步。
634多阅读书籍和代码
编程不是非要在电脑上才能学的,阅读书籍和书中的代码也是一种学习方式,自己还可以尝试着改进那些代码,最后可以把自己的成果拿到电脑上调试
千万不要忽视书后面的习题
635养成良好习惯
细节很重要
要细心,沉下心来编程,戒骄戒躁
养成良好习惯,注重编程风格,尽量写代码注释,把写过的代码保留下来,以后会有用
636善于思考
遇到问题动脑筋解决
637注重基础
打好编程基础,除了熟悉基本的语法之外,要深刻理解指针,引用,面向过程思想,类,模板,标准库,接口,继承机制,面向对象思想等等,课后习题尽量全做一下
刚才说了,有精力的可以学学 photoshop图像处理, flash动画制作,3dmax或maya三维建模,dreamveaver网页设计,但是不要因为他们花费过多的时间而影响了你基础的学习,那些都是些应用技术,你学会了更好,不会也没什么丢人的,基础打好了,以后学啥都轻松。
在基础没打好的情况下,不要觉得你编的程序只能在黑白的DOS窗口了运行就去学VC做漂亮的窗口,3d程序很有意思就去看OpenGL或DirectX,那些都属于高级应用,没有基础学起来会很吃力。
基础要扎实,不要觉得C#中没有指针就扔掉C++, 不要今天看C#,明天搞java
要有明确的方向,计算机技术的发展实在太快,新技术不断涌现,了解一下就可以了,不要随波逐流,要沉得住气
638选好开发环境
选择一种适当的开发环境并熟悉它就可以了,不要今天摆弄Visual Studio,明天钻研Eclipse,后天来个netbeans,在工具的使用的学习上白白浪费时间。
639选好编程语言
我在选择语言时,走过一些弯路,浪费了一些精力,我在这里选出一些主流编程语言,对语言特性与环境稍作介绍,希望可以帮助大家,让大家尽早了解与选择,少走弯路
C(多用在性能要求较高的场合,如 *** 作系统,嵌入式等)
C++(应用最广泛、成熟,强大而复杂,兼有性能高和易于构建大型程序的优点,基本是衡量一个国家软件产业发达程度的核心基础)
Java(著名的SUN公司推出的,面向对象、安全、跨平台、强大稳健,需要java虚拟机的支持)
C#(微软推出的完全面向对象,运行在 NET Framework 环境中新兴、易学、强大语言)
Python(新兴的面向对象脚本语言,跨平台,语法清新易于使用,代码优美得像数学一样,非常容易学)
PHP (目前最流行、强大、稳健的动态网站开发脚本语言,语法类似C++)
ActionScript (Flash的编程脚本,最新版支持面向对象,能基于Flex开发RIA应用)
除此之外,还有vb, vbnet, aspnet, jsp, asp, ruby, Javascript等
这么多五花八门的语言,大家可能都会觉得眼花缭乱了。
其实各种语言之间只是语法不同,编程思想都是相通的,学精一门,了解多门是上策。
" 程序=算法+数据结构 " 其中并没有编程语言,说明语言只是程序员与计算机的编译器沟通的一种工具,程序员用某种语言来表达程序的逻辑结构,计算机中相应的编译器或解释器理解这种语言,编译得到二进制程序或者直接解释执行。
以上这些语言我在大学前三年全部学过了,有的学得很深,有的很浅。因为人的精力毕竟有限,很多语言学过了之后根本就很少用到,几乎是白学了,现在我深深的体会到,
语言并不是学得越多越好,与其泛而不精不如有针对性的先精通一门,其他的触类旁通。
就大家现在的情况,希望大家把当前正在学习的C++学好,学到一定程度的时候,可以继续深入的研究C++的各种库,也可以从上面选择感兴趣的新语言学习,如果把C++基础打好了,后面的学习就会容易得多。
最流行的语言不一定是最好的语言,用的人最多的语言也不一定是最好的语言。
请大家记住,没有最好的语言,只有最适合某个领域的语言, 在不同的环境下选择不同的语言就可以了。
6310重视数据结构和算法
理论上,计算机的任何编程语言都有可能会被淘汰,随着时间的推移和计算机软硬件的飞速发展,不断会有新的语言产生和和旧的语言过时,但不会过时的是数据结构和优秀的算法。真正的高手应该是善于设计优秀的数据结构和算法的,应该是具有独立分析和解决问题的能力并利用计算机程序来实现的,他的思想应该是超脱语言、在更高处的一种升华。
如果某一天,你深切的体会到,真正重要的不是什么语言而是思想的时候,说明你可以出师了。
一、实验题目
五子棋游戏。
二、问题分析
五子棋是双人博弈棋类益智游戏,由围棋演变而来,属纯策略型。棋盘通常1515,即15行,15列,共225个交叉点,即棋子落点;棋子由黑白两色组成,黑棋123颗,白棋122颗。游戏规则为黑先白后,谁先五子连成一条直线谁赢,其中直线可以是横的、纵的、45度、135度。
本次Java编程我的目的是现实人机对战,即游戏者一方是人,另一方计算机。这就要求程序不仅要具备五子棋的基本界面,还要编程指导计算机与人进行对弈。为了使程序尽可能智能,我采用了贪心策略、传统搜索算法、极大极小博弈树算法,对应游戏玩家的3个等级:简单、中等、困难。
三、功能设计
我的程序基本功能是实现人机对弈五子棋。人和电脑交替下棋,谁先五子连成一条直线谁就赢。下面是我程序的功能模块:
1等级设置
核心功能是实现不同策略与算法的对比运用,纯贪心策略实现简单等级对手,直接搜索算法实现中等等级对手,极大极小博弈树算法实现困难等级对手。对应程序中的3选1单选按钮。
2悔棋功能
模拟栈机制实现人悔棋,不限步长的悔棋。对应程序中的悔棋按钮。
3棋面绘制
根据不同机计算机的屏幕分辨率,绘制逼真的棋盘。
4引入
两张古典的人物,生动模拟对弈双方。人物旁的黑白棋钵显示黑白棋归属。
5背景设置
支持用户选择背景,包括棋盘、棋盘边框、窗口边框,彰显个性。
6音乐播放
下棋时有棋子落地的声音,一方胜利时有五子连成一片的声音。同时在设置背景时相应的改变整个对弈过程中的背景音乐。
7时间显示
在棋盘正上方有一模拟文本框显示当前棋局用时。
8其他小功能
支持和棋、认输、开启新游戏、退出游戏等 *** 作。
四、数据结构与算法设计
数据结构部分
1当前棋局的存储结构
我的五子棋程序选择通常用到的15行15列棋盘,可以开二维数组PositionFlag = new int[15][15],PositionFlag[i][j]为0表示(i,j)点尚无棋,为1表示(i,j)点是人的棋子,为2表示(i,j)点是机器的棋子。之所以选择二维数组,主要原因有两点:
1本程序需要频繁随机访问1515的交叉点,对应查询该点状态以及改变该点状态,随机访问是数组的特点。
21515=225开二维数组的内存需求相对现在内存为2G及以上的计算机完全可以接受,且数组实现简单、 *** 作方便。
基于以上两点,尽管创建动态的顺序表—链表可能可以节省少量内存(可以只存当前有棋的点,原数组对应位置为0的点可以不存),但选择数组的优势完全在上述两点体现了出来。
2实现悔棋 *** 作的数据结构
由于每次悔棋只需回退当前几步,后进先出原则,这正是栈这种典型数据结构的设计思想,于是我选择栈。我自己先写了用自定义数组模拟的栈,但由于是学Java语言且由于悔棋的存储空间需要随当前步数增大而增大(由于每局最多下225步,即最多要悔225步,所以自己开个225的数组完全可以避免存储空间自增长的问题且内存完全可以接受,之所以不用自定义数组而用ArrayList类主要是为了尝试Java中STL的用法),所有我最终改为用Java类库中的ArrayList类。
确定用ArrayList类实现栈机制后就必须考虑每个ArrayList单元具体存储什么。刚开始我存储的是当前的棋局,即整个局面,而每个局面对应一个二维数组,这样是很占用内存的。试想一下,在最坏情况下,225个ArrayList单元,每个单元存放一个1515的二维数组,尽管2251515在Java的内存管理机制下不会爆栈,但也是极不划算的。之所以说不划算,是因为有更好的解决方案。由于每次悔棋只是在回退倒数一步,多步悔棋只需循环回退,所以可以只存储当前棋局最后一步的下法,对应一个二维点,完全可以自定义一个二维坐标类chessOneStep。
算法设计部分
Java语言是面向对象的语言。我在进行五子棋游戏编程是总共传创建了11个自定义的类。在编写程序的过程中,我有一个明显的体验就是面向对象编程就是一项有关对象设计和对象接口技术,很多关键的技术就是如何设计自定义的对象。
下面我先概括给出我的所有类的作用:
1mainFrame类:主框架类,我应用程序的入口;
2chessPositon类:主控类,这个类是我程序的核心类,负责控制双方的下棋,以及调用其他的类完成当前棋局的显示绘制;
3chessPanel类:面板类,调用其他底层类完成当前棋局的显示绘制;
4chessBoard类:棋盘绘制类,负责棋盘的绘制;
5chessImage类:文件类,包含各种资源(背景、背景音乐)以及静态全局变量(public static Type);
6chessButton类:组件类,定义各种组件,包括按钮、单选按钮、文本框等;
7chessMusic类:音乐类,负责调用Java库类完成背景音乐、下棋音乐、取胜音乐等的播放;
8chessPiece类:棋局类,定义棋局二维数组数据结构并完成相关 *** 作;
9chessList类:栈类,完成悔棋等 *** 作;
10 chessOneStep类:棋子类,定义每步坐标以及下在该处获得的估价值;
11myCompare类:排序类,完成chessOneStep类的自定义排序
详细设计
1mainFrame类
作为我的五子棋程序的主类,mainFrame类主要实例化相关的对象,如chessbutton,chessborad等,从而完成框架的创建。更重要的是实例化chessposition,这是本程序的核心类,控制游戏双方行棋过程完成人机互动下棋,然后将MyChessPosition与鼠标响应addMouseListener()关联起来。
2chessMusic类
一个好的游戏必须给人一种身临其境的感觉,而声音是营造这种氛围的重要因素。参照网上各游戏运行商的音乐配置,我选择相关逼真的声音。包括背景音乐、下棋棋子落到棋盘发出的声音以及一方胜出的配乐。所有这些功能的实现,依赖于自定义的chessMusic类,采用AudioInputStream配合Clip的方式完成音乐播放的软硬件工作,然后定义两个接口chessmusic(String Name)和Stop(),前者完成播放功能,后者完成关闭当前音乐功能。因为音频文件相对较大,而我的程序提供在不同背景乐之间切换的功能,所以在打开另一个音频文件之前必须关闭前一个正在播放的音频文件,防止出现溢出。
3chessImage类
适当的动画或能给游戏玩家带来美的体验。所以我的五子棋程序界面在不失和谐的前提下引入了尽可能多的,包括对弈双方、棋钵等。引入的具体工作通过语句import javaximageioImageIO完成。同时,由于要在用到它的类中被访问,为了避免频繁调用函数,我直接将相关联的对象定义为public static,表明是公用的、静态的。进一步引申开去,我将程序中用到的静态全局变量都定义在chessImage类中。具体如下:
public static Date begin;//每局开始时间
public static Date cur;//每局结束时间
public static chessOneStep LineLeft;//结束端点1
public static chessOneStep LineRight;//结束端点2
public static boolean IsGameOver;//是否只有一方获胜
public static int ColorOfBackGround[][]= {{255, 227, 132},{0,255,127},{218,165,32}};//背景颜色
public static int ColorOfWindows[][]= {{ 60,179,113},{245,245,245},{122,122,122}};//背景颜色
public static int WitchMatch;//背景搭配
public static String MusicOfBackGround;//背景音乐
public static int CurrentStep;//记录当前步数
public static int Rank;//设置难度等级
public static boolean IsSurrender;//判断是否认输
public static boolean IsTie;//判断是否认输
public static String Message;//输出提示信息
public static Image IconImage;// 图标
public static Image blackBoard;//白棋盘
public static Image whiteBoard;//黑棋盘
public static Image blackChess;// 白棋棋子
public static Image whiteChess;// 白棋棋子
public static Image RightPlayer;//白棋棋罐
public static Image LeftPlayer;//白棋玩家头像
public static String path = "src/";// 的保存路径
4chessButton类
这个是程序的组件类。定义了各种功能键,完善程序功能,营造逼真的人机对战游戏效果。分为3类:效果。。
(1)、按钮组件
本程序有5个按钮,支持和棋、认输、新游戏、退出、悔棋等。认输和和棋按钮终止当前的棋局,给出相应的提示信息;退出按钮调用系统Systemexit(0)的函数正常返回;悔棋按钮调用后面要介绍的chessList类实现悔棋;新游戏按钮则刷新当前棋局准备下一轮,要将记录当前棋局的二维数组全部置0,刷新当前棋局开始时间等。
(2)、单选按钮组件
游戏界面支持设置个性化界面,包括背景颜色与背景音乐,跟重要的一点是设置难度(简单、中等、困难)。单选按钮只能多选一。背景颜色主要是存储相关颜色搭配方案的RGB颜色,开2维数组,即对应RGB3原色数组的一维数组,然后通过改变WitchMatch全局变量的值来有用户自己选择颜色搭配,不同的颜色搭配对应不同的背景音乐表达一致的主题。难度设置主要是改变计算机的下棋算法,不同难度通过Rank判断进入不同的程序分支,实现不同智能等级的计算机下棋水平。
(3)、文本框
在不同的单选按钮前添加相应的文本框,提示用户可以实现的功能。同时我用颜色模拟出显示当前棋局耗用时间的文本框。
不论按钮还是单选按钮都要关联相应的消息,把相应功能的实现放在消息响应处理函数理。这些主要是实现Java库提供的消息响应接口里的方法。
5chessPiece类
主要完成当前棋面的存储,存储棋面的数据结构为二维数组int[][] PositionFlag;然后定义获取、设置某点以及整个棋面的状态的方法。
(1)、SetPositionFlag(int x, int y, int flag)//设置(x,y)处的状态为flag
(2)、GetPositionFlag(int x, int y)//获取(x,y)处的状态
(3)、SetAllFlag(int [][]NewFlag)//设置当前整个棋面的状态为NewFlag
(4)、GetAllFlag()//获取当前整个棋面的状态
(5)、DrawChessPiece(Graphics g)//绘制当前局面的棋子
由于本类比较重要,所以附上了代码,见源代码1。
6chessBoard类
功能为绘制棋盘线。由于围棋的棋盘比较复杂,横线、竖线较多,且为了使棋盘美观,还要自定义窗口边框、棋盘边框、对弈双方边框等,对线宽、线型也有一定要求。有时要单像素线条,有时要多像素线条。对于多像素线条,我主要用了2种方法。
方法一:
在需要绘制多像素线条处首先绘制一条单像素线,然后根据线宽要求上下平移适当像素达到绘制多像素的目的。这样的方法适合绘制水平线或竖直线,绘制其他斜率的线条容易造成走样。在没有想到比较好的反走样编程思想后我选择了调用Java库中已经封装好的函数。
方法二:
为了克服方法一绘制非水平或竖直线时造成的走样,同时也为了更进一步学习Java语言,我猜想肯定会有类似OpenGL中设置线宽的画刷,于是上网百度找到了相应的画刷Stroke类。通过Java库实现绘制不同线宽的直线,达到了反走样效果。
7chessOneStep类
这个类是为了配合chessList类实现悔棋以及在计算机下棋算法实现返回有效状态点而设计的。主要数据成员为
private int x,y,weight;//其中x,y表示点坐标,weight表示将棋下到该点获得的估价值。
主要方法如下:
(1)、GetX()//获得当前对象的x坐标
(2)、GetY()//获得当前对象的y坐标
(3)、GetWeight()//获得当前对象的(x,y)处的估价值
8chessList类
程序支持悔棋功能,为了实现悔棋,自定义了chessList类。这个类主要通过引入javautilArrayList和javautilList实现集合的数据类型。然后自定义一些方法,如下:
(1)、AddStep(chessOneStep OneStep)//添加一步棋到List中
(2)、GetSize()//获得当前List的大小
(3)、ClearList()//清空List
(4)、RemoveLast()//删去List中的最后元素
由于每次删除当前List中的最后一个元素,实现后进先出,所以可以模拟栈的功能实现悔棋。
9myCompare类
由于在计算机下棋的极大极小博弈树算法中需要对自定义对象chessOneStep按weight进行排序,所以引入了myCompare类,通过实现Comparator接口中的compare方法完成自定义对象排序。
10chessPanel类
程序的自定义面板类,主要负责完成当前框架内容的显示。这是一个重要的与框架和图形显示密切相关的类。主要数据成员为
private chessboard MyChessBoard;//当前显示棋盘
private chesspiece MyChessPiece;//当前显示整个棋面的状态
主要方法如下:
(1)、chesspanel(chessboard MyChessBoard1, chesspiece MyChessPiece1)//构造函数,分别用MyChessBoard1和MyChessPiece1初始化MyChessBoard和MyChessPiece
(2)display(chessboard MyChessBoard1, chesspiece MyChessPiece1)//自定义显示回调函数,调用repaint()完成重新绘制游戏界面
(3)、paintComponent(Graphics g)//核心方法,调用各种函数完成具体的绘制工作
11chessPositon类
程序算法核心类,总的功能是控制人和计算机轮流下棋,以及调用chessPanel类中的display(chessboard , chesspiece )方法完成界面的实时刷新。关于chessPositon类,我在此将重点介绍。chessPosition类的主要数据成员如下:
private static chessboard MyChessBoard;//当前显示棋盘
public static chesspiece MyChessPiece;//当前显示整个棋面的状态
private static chesspanel Mychesspanel;////当前显示面板
public static chesslist MyChessList=new chesslist();//当前下棋集合,用于悔棋
final private static int INF = (1 << 30); // 表示正无穷大的常量,用于极大极小博弈数搜索算法
public static boolean CanGo;//控制当前下棋一方
类的设计集中体现在成员方法的设计上。实现人机对战,只有语言是远远不够的,还要加入算法,用算法引导计算机下棋。下面介绍该类的方法成员:
(1)、chessposition(chesspanel , chessboard ,chesspiece ) //带有参数的构造函数
(2)、chessposition()
不带参数的构造函数
(3)、mouseClicked(MouseEvent event)
鼠标响应函数,负责人的下棋,根据鼠标点击的位置转换得到所在棋盘的相对位置。如果该位置不合法,即超出棋盘有效范围,点击无响应;如果该位置上已有棋,d出消息框给出提示。这二者都要求重新给出下棋位置,即当前鼠标响应无效…直到点击到棋盘有效区域。
(4)、IsOver(int[][] Array,int x,int y)
判断当前int[][]Array对应的棋局是否结束,即一方五子连成一条直线。此处有两种思路,一种对当前棋面上的所有棋子都进行一次判断,具体为水平方向、竖直方向、与水平线成45度方向、与水平线成135度方向,只要有一个方向五子连成一条直线就说明有一方获胜,游戏结束;另一种思路为只在当前下棋的4个方向进行判断,我的程序采用的是第二种,所以IsOver方法除了int[][]Array参数外,还有x,y参数,(x,y)表示当前下棋的坐标点。
(5)display()
通过调用自定义面板类的显示回调函数用于重新显示游戏界面,达到每下一步棋及时更新游戏界面的目的。
(6)、GetValue(int flag, int num)
估值函数,根据经验把棋局分成只有1颗棋相连,2颗棋相连且两端被封死,2颗棋相连且一端封死另一端活的,2颗棋相连且两端都是活的,同理3颗棋、4颗棋也各自可分3种情况。不同的情况对应不同的估价值。估价值的设定是决定计算机一方是否智能的一个关键因素。
(7)、GetPredictValue(int flag, int num)
对未连成一片但通过再下一颗子就能连成一片的局面进行估值,这在双方下棋的有限步骤内是能产生重要影响的。如果每局棋仅考虑当前一步,是不可取的。
(8)、Evaluate(int[][] Array, int x, int y)
根据棋面具体情况以及预先设定的估值函数,对某个点对应的局面进行评估。由于每次双方只能下一颗棋,所以可以每次取当前局面的所有点中对应估值最大值点的估值作为整个局面的估值。
(9)、GetGreedNext()
计算机下棋方法1,对应难度等级为简单,采用贪心思想。每次下棋前在求得最有利点下棋,而是否最有利只是通过一步评估。算法伪码描述为:
Max取负无穷大
for(行i从0到15)
{
For(列j从0到15)
{
If((i,j)对应的位置无棋)
{
a假设放上一颗由人控制的棋,求估价值;
b假设放上一颗由计算机控制的棋,求估价值;
c取二者中较大值作为(i,j)处的估价值tmp;
d取tmp与Max较大值赋值给Max
}
}
}
最终Max对应的点就是当前整个局面中最大的估值点。至于上述为什么要考虑双方都在该点下棋的情况呢?主要原因为下五子棋是个攻防兼备的过程,不仅要考虑自己对自己最有利,还要考虑对对手最不利,通俗来讲就是在自己赢的时候不能让对手先赢。
(10)、GetSearchNext(int LookLength)
derectSearch(int [][]Array,boolean who,int deepth)
计算机下棋方法2:直接搜索法,对应难度等级为中等。
每步棋最多有225个不同下法,若采用直接搜索法则对应的孩子节点有225个(在下棋过程中会逐渐减少),即每层有最多225个节点待扩展,这就决定了直接搜索进行不超过2次—主要原因有两点:
a采用深度优先搜索需要递归,递归中状态过多可能会爆栈,我们知道递归是用栈机制来实现的;采用宽度优先搜索又需要存储为扩展的节点,这对内存容量要求很高。
b不管深搜还是广搜,在时间复杂度为O(N^m)的情况下都是不能接受的。其中N为当前棋局的待扩展节点,最大225;m为搜索的深度。
综上所述,在采用直接搜索法时搜索深度不能太深,严格来说是应该控制在2层以内,在计算机运算速度在10^7次每秒的情况下,理论和实验都表明超过2层就会变得很慢且这种趋势成指数级增长。
直接搜索算法伪代码为
GetSearch(boolean flag,int deep)
{
如果deep等于0,返回当前棋局估值;
for(行i从0到15)
{
For(列j从0到15)
{
If((i,j)对应的位置无棋)
{
如果轮到计算机下棋,置标志位为2
GetSearch(!flag,deep-1);
如果轮到人下棋,置标志位为1;
GetSearch(!flag,deep-1);
}
}
}
}
(11)、GetMinMaxsearchNext(int LookLength)
MinMaxsearch(int [][]Array,boolean who, int deepth)
计算机下棋算法3:极大极小博弈树法,对应难度等级为困难。五子棋是个博弈游戏,当前在寻找对自己最有利的下棋点时要尽可能保证对对手最不利,这种思想可以用极大极小博弈树
首先,确定自己到底想做什么,对什么有爱好,做一个职业规划别找借口说你什么也不懂,没有社会经验,不知道自己想做什么,这些只要你去找,去想,去问都能解决;也别告诉我,你天天想吃喝玩乐
其次,看看可以考个什么证书,虽然可能学不到什么,但这是有效的敲门砖。
第三,多联系些师兄,像他们请教,这样不但再找工作时,他们会给你提供信息,而且你也可以多了解你们专业毕业后所从事的工作都是哪方面的。
第四,找个实习干干。最好是本专业相关的,如果不是就去跑跑业务,做做导游练下英语口语。家教不建议。
学编程入门建议:
1学编程要从根本出发,从理论上来说,需要广泛的阅读。了解算法的博大精深和计算机的基本理论。
2从实践上来说,需要有广泛的练习,练习的广泛在于练习不同的内容。然后就是创新精神和数学思维能力,这些都是需要培养的。基础要打好学编程要具备一定的基础。
3逻辑思维能力的培养、学程序设计要有一定的逻辑思维能力。“思维能力”的培养要长时间的实践锻炼。要想成为一名优秀的程序员,最重要的是掌握编程思想。要做到这一点必须在反复的实践、观察、分析、比较、总结中逐渐地积累。
打开终端,键入cd /删除Mac系统自带程序Safari、FaceTime等 - songxing10000 - 十一岁的加重切换到了根目录,再键入cd Applications/技巧,输完App然后按tab键入可自动识别Applications/这个目录。到此我们已经到达了应用程序所在的目录,可以删这里的系统的和非系统的软件了。如果不知道有哪软件,或者一些中文的系统软件的英文名字可键入ls
得到当前上当下文件的名字删除Mac系统自带程序Safari、FaceTime等 - songxing10000 - 十一岁的加重然后键入 sudo rm -rf xxapp/注意xxapp是软件的名字,要删什么应该更换成那个文件的名字,如删除Safari浏览器:sudo rm -rf Safariapp/删除Mail,sudo rm -rf Mailapp/删除FaceTime,sudo rm -rf FaceTimeapp/删除QuickTime Player,sudo rm -rf QuickTime\ Playerapp/删除便签Stickies,sudo rm -rf Stickiesapp/删除Chess象棋,sudo rm -rf Chessapp/
删除Photo Booth,sudo rm -rf Photo\ Boothapp。棋盘的表示方法,即局面在存储器中的存储方法,程序是根据它来分析局面的;掌握规则,即什么样的着法是合理的,如果程序连不合理的着法都不能检测出来,那么对手就可以利用这种着法来欺骗程序; 找出所有合理着法的算法,这样程序就可以从这些着法中找到最好的,而不是随便找一种着法;比较方法,包括比较着法的方法和比较局面的方法,这样程序就可以选择最佳的着法。在早期的程序设计过程中,存储器是非常有限的(有些程序只用8K或更少的存储器),所以最简单、最节省的表示方法就是最有效的方法。一个典型的国际象棋棋盘可以用一个8x8的数组表示,棋盘上的每个格子用一个字节表示空的格子用0,黑方的王用1,等等。
以上就是关于如何自学编程全部的内容,包括:如何自学编程、求一篇基于C语言的计算机毕业论文,要求有源程序、伟人小平同志最经典的一句话是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)