首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络技术 > 网络基础 >

aiqier的鲜果蛇(一)

2013-03-17 
aiqier的水果蛇(一)Introduction水果蛇分为两部分,第一部分是写如何不看别人的代码,自己去设计并实现一个

aiqier的水果蛇(一)
Introduction
    水果蛇分为两部分,第一部分是写如何不看别人的代码,自己去设计并实现一个比较大的程序(贪吃蛇),我在大学常常使用这种启发式的学习方式来锻炼自己的编程能力,还写了一些个人对程序的认识和想法。
    第二部分是自己设计的一个游戏,我想讲讲我对游戏编程的理解和思考,事先声明,我没学过什么游戏设计,完全是自己打游戏的感悟,当然叫水果蛇,可不是因为就是把原理的方格换成水果图片这么简单;-)
    这也算是写给自己的一个毕业设计吧,没有什么“管理系统”,没有什么“仿真”,简简单单的自己动手。
    两部分都跟贪吃蛇有关,这就像山西人,喜欢把一团面做成各种花样,(所以你可以猜到百度是山西人做的。。。。)


第一部分

你是否会写贪吃蛇?
你是否在敲了一遍别人的代码,然后虚伪的说,我会写贪吃蛇?
你是否随便改了改网上的代码,然后对你的老师说,老师,这是我写的。
你是否所谓的调试,就是一行行的把书上代码与自己敲的,对比,看哪里敲错了?(如果是印刷错误,你是不是要哭。。。)

其实你只要有耐心,慢慢的“拼”出来就行了。。。。


我的做法:
我是这样实现的:
       首先,贪吃蛇是一个方格程序,所有的绘图,都是在nXm的方格上进行的(俄罗斯防空也一样),所以,我先想办法,画出一个方格,这一步叫熟悉api。
       你可以用java的swing,c++的qt,或者是想HGE,pygame这样的“低级”游戏引擎,只要是GUI都可以,这不难吧?
       之后我再去实现一个程序,能够在一个窗口,绘制nxm个方格,这不难吧?
       接着,我试着去把它封装成一个类,能够根据我提供的参数,初始化一个nXm方格,能够根据坐标,修改一个位置的颜色。。。
       如果做到这一步,恭喜你,你的这个类可以重用在所有方格游戏,比如俄罗斯方块,它可以说是一个View,
       接着,写基本的游戏循环,按键输入-逻辑更新-绘制,比如你的这个测试程序能够随机的改变某个方格的颜色,一秒一次,恩,完成这个程序,你又进了一步。
       之后,写一个蛇类,把它绘制到你的方格上,
       然后是移动算法,旋转算法,变长算法。。
       写一个程序让你了解输入的api
       为游戏加入输入控制
       原来实现的那个随机改变方格颜色的程序呢?现在要随机放食物了,
       吃食物的算法。。

       碰到墙,碰到自己的算法。


就是这样,有耐心一步步的“拼”出来,测试api+加入功能,
这样做有两个好处,
1.你的思路会很清晰,不会不知道下一步改干什么。
2.如果你发现不对了,可以退一步,不致于全部删除。


关于类的设计:

这是用python实现的方格窗口类,通过它来绘制此游戏:

class wallpaper:    def __init__(self, surface,color,size=50,r=5,c=5):self.blocks = [[color for j in range(c)] for i in range(r)]self.surface = surfaceself.size = sizeself.rows = rself.cols = c    def setcolor(self, r, c, color):self.blocks[r][c] = color    def clear(self,color):for r in range(self.rows):    for c in range(self.cols):self.blocks[r][c]=color    def getcolor(self, r, c):return self.blocks[r][c]    def draw(self):for r in range(self.rows):    for c in range(self.cols):#as oop maybe this can change betterpygame.draw.rect(self.surface, self.blocks[r][c], (c*self.size, r*self.size, self.size, self.size))

       首先这个类可以通过初始化来选择几乘几的方格,每个方格的大小,和基本颜色(底色),这样我们可以在游戏绘制部分,设置每个坐标应该有的颜色,在调用draw把它绘制出来,如果是使用其他的GUI的绘制方式,那么修改draw()方法的最后一个调用就可以了。

       这里要注意的是做这种方格游戏常常易犯的错误,我们在使用坐标时,喜欢称起为x轴,y轴,但是在使用矩阵时,喜欢称其为行列,但是如果你要把一个方格阵画到屏幕上,那么行对应的是y轴,列对应的才是x轴,而且要注意屏幕坐标的y轴正方向还是向下的。如果不注意这些,你有时会对自己的程序感到莫名其妙。


对于方格矩阵的初始化,只用了一行,列表推导式,就这么强大。。

        但是这个wall类,有个设计不合理的地方,那就是成员变量的选择,


        我们在初学oop语言的时候,写的最多的类就是一个class,然后几个属性,每个属性两个方法,get和set......
就像是什么student类,这根本没有oop的精髓,对象之所以强大,是因为她有状态,所以她是活的,这就是类比函数强大的地方,(当然如果是这个语言可以实现闭包,那么这个函数也会有状态),所以如果你要把为一个类添加一个属性时,先想想这个属性是否能作为一个状态。
所以,self.surface,和self.size,是两个完全没有必要的类属性,而且除了draw的最后一个调用,别的地方根本没用到,他们更适合作为draw()的参数传入,而不是作为类属性。
        现在这个类可以重用在各种方格游戏中。(比如俄罗斯方块)

更多实现细节,下一篇blog


作者:aiqier
Email:liuaiqi627@gmail.com
blog:http://blog.csdn.net/aiqier627
(转载请注明作者和原地址,谢谢)

热点排行