很久没有更新博客啦,今天端午节放假,正好有时间更新下博客,把前两个星期完成的软工作业写成一篇博客好了(大雾).
pygame
pygame 网上有一篇非常完整教程,大家有兴趣的可以去学习一个,做一点2D游戏也是很有趣的.
为了完成软工作业,我和同学一人做了两个
pygame
的小游戏,他做了Flappy Brids
和俄罗斯方块
,我做了2048
和贪吃蛇
.所以在这里我只介绍我自己写的两个游戏.另外两个游戏,可以去这个博客,不知道会不会更新..github地址,大家如果觉得好的话,希望能够点个
star
呀.
贪吃蛇
这是一款非常老的游戏了,我选这个的原因是因为刚刚接触
pygame
,所以做一个容易一点的游戏,后来做完2048之后想做一个连连看的,懒癌发作就没写了.游戏界面
游戏的主循环
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172def runGame():#游戏主循环startx = random.randint(5, CELLWIDTH - 6)starty = random.randint(5,CELLHEIGHT - 6)#最开始蛇长度为 3snake = [{'x':startx,'y': starty},{'x': startx - 1, 'y': starty},{'x': startx - 2, 'y': starty}]#最开始的方向direction = RIGHT#生成苹果位置apple = appleLocation()#循环一次的时间TIME = 0.1#蛇的长度作为一个标志,如果这个标志变化了,那么TIME也就变化,控制游戏难度laststate = len(snake)while True:SCREEN.blit(BACKGROUND_PICTURE,(0,0))#draw_grid()#蛇死亡后返回if snakeDie(snake):returnlastdirection = direction #记录前一个方向,防止出现BUG#事件循环for event in pygame.event.get():if event.type==QUIT:exit()elif event.type == KEYDOWN:key = event.keyif lastdirection != RIGHT:if (key ==K_a or key==K_LEFT) and direction!=RIGHT: #往左direction = LEFTif lastdirection != LEFT:if (key ==K_d or key==K_RIGHT) and direction!=LEFT: #往右direction = RIGHTif lastdirection != DOWN:if (key ==K_a or key==K_UP) and direction!=DOWN: #往上direction = UPif lastdirection != UP:if (key ==K_s or key==K_DOWN) and direction!=UP: #往下direction = DOWNif key==K_ESCAPE:exit()#吃到了苹果,生成新苹果,否则,删除蛇的尾巴if snake[HEAD]['x']== apple['x'] and snake[HEAD]['y'] == apple['y']:apple = appleLocation()else:del snake[-1] #删除掉蛇的尾巴#新的头new_head = {'x':snake[HEAD]['x']+direction[0],'y':snake[HEAD]['y']+direction[1]}snake.insert(0,new_head)#绘制蛇,苹果,分数draw_snake(snake)draw_apple(apple)draw_score(10*(len(snake)-3))#绘制鼠标(x,y) = pygame.mouse.get_pos()SCREEN.blit(MOUSEIMAGE,(x-MOUSEIMAGE.get_width()/2,y-MOUSEIMAGE.get_height()/2))#刷新屏幕pygame.display.update()FPSCLOCK.tick(FPS)#蛇的当前长度为蛇的当前状态nowstate = len(snake)#状态变化if laststate!=nowstate:TIME-=0.005laststate = nowstate#确保循环时间合理性if TIME<0: TIME = 0time.sleep(TIME)注释都已经写得清楚了,解释一下为啥要设置一个
lastdirection
:在玩的过程中,发现在快速按键的情况下蛇会莫名死亡,后来发现是由于前一步的设置了游戏难度,每次都等待了0.1s,当在这0.1s的等待时间内,如果触发了多个事件,就有可能出BUG,比如我这次的方向是向RIGHT,在等待的0.1s内进来了两个时间UP,LEFT,等到下一次进入事件循环时,我们的当前状态就会从RIGHT变成UP,然后又变成了LEFT,于是蛇的方向就相反了;解决方案是设置一个lastdirection
状态,每次都需判断这次的方向不能与lastdirection
方向相反.
2048
这个游戏其实我大二的时候就用
JAVA
实现过了,现在又用pygame
写一遍,逻辑是差不多.高三的时候一直觉得这个游戏很好玩的.主页面
这个游戏主要是弄清方块怎么移动的,就很容易实现了.每次移动的过程中,运算时通过三重循环迭代进行实现的,比如UP的操作,引发的事件就是:
123For y: 1->3For x: 0->3For y1: y->0每一行都受其下面所有行的影响,而这一行又会影响其上面的每一行,所以通过三重循环模拟递推过程,可以实现移动操作。
移动的实现
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798def moveKey(e):'''判定键盘事件'''global SCORE,TIMES #引用全局变量,如果要修改全局变量的值必须这么弄,不然SCORE会被认为是局部变量flag = False #标志整个图是否发生了变化,如果发生了变化就调用 create()# 触发了向上的操作if e.key == K_UP or e.key == K_w:for y in range(1,SIZE):for x in range(0,SIZE):if array[x][y] == 0: continuedispos = -1 # 标记位置 ,如果这个dispos一直为-1 ,那么证明y以上的所有位置都不会被y代替的位置,否则y1的位置将被y位置的元素代替for y1 in range(y-1,-1,-1):if array[x][y1]!=0:if array[x][y] == array[x][y1]:flag = Truedispos = -1SCORE += 2*array[x][y1]array[x][y1]*=2array[x][y] = 0TIMES+=1 #空位增加了break #直接退出循环,该层已经不可能再往上走了else:dispos = y1#不为-1的情况if dispos is not -1:flag = Truearray[x][dispos] = array[x][y]array[x][y] = 0#触发了向下的操作if e.key == K_DOWN or e.key == K_s:for y in range(SIZE-1,-1,-1):for x in range(0,4):if array[x][y] == 0: continuedispos = -1for y1 in range(y+1,SIZE):if array[x][y1]!=0:if array[x][y] == array[x][y1]:flag = Truedispos = -1SCORE += 2*array[x][y1]array[x][y1]*=2array[x][y] = 0TIMES+=1 #空位增加了break #直接退出循环,该层已经不可能再往上走了else:dispos = y1if dispos is not -1:flag = Truearray[x][dispos] = array[x][y]array[x][y] = 0#触发了向左的操作if e.key == K_a or e.key == K_LEFT:for y in range(0,SIZE):for x in range(1,SIZE):if array[x][y] == 0:continuedispos = -1for x1 in range(x-1,-1,-1):if array[x1][y] !=0:if array[x1][y]== array[x][y]:flag = Truedispos = -1SCORE += 2*array[x1][y]array[x1][y]*=2array[x][y] = 0TIMES+=1breakelse:dispos = x1if dispos is not -1:flag = Truearray[dispos][y] = array[x][y]array[x][y] = 0#触发了向右的操作if e.key == K_d or e.key == K_RIGHT:for y in range(0,SIZE):for x in range(SIZE-1,-1,-1):if array[x][y] == 0:continuedispos = -1for x1 in range(x+1,SIZE):if array[x1][y] !=0:if array[x1][y]== array[x][y]:flag = Truedispos = -1SCORE += 2*array[x1][y]array[x1][y]*=2array[x][y] = 0TIMES+=1breakelse:dispos = x1if dispos is not -1:flag = Truearray[dispos][y] = array[x][y]array[x][y] = 0if flag:#创造新数字方块create()每次调用
create
函数生成4(0.25的概率)或者2(0.75的概率)12345678910111213141516def create():'''在空方块处产生新的数字'''flag = False # 直到某个空位置产生一个新的数 flag 才变成 0if TIMES>0:while not flag:x = random.randint(0,3)y = random.randint(0,3)#print x,yif array[x][y] == 0:if random.randint(0,3) == 0: #1/4的几率生成 4array[x][y] = 4else:array[x][y] = 2flag = True
后记
- 估计更新完这一篇又要拖更了,珍惜每一次假期和学习的机会呀,大学多学点东西,工作起来可能更加没时间学东西了
- 本游戏的
github
地址