免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5884 | 回复: 4
打印 上一主题 下一主题

用Pygame 写的一个“贪吃蛇”的小程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-25 17:57 |只看该作者 |倒序浏览
  1. #
  2. !/usr/bin/env python

  3. import pygame, sys, os
  4. from pygame.locals import *
  5. from random import randint
  6. from time import time
  7. import pygame.joystick

  8. SCREEN_SIZE = (600,400)

  9. MOVE_UP = 1
  10. MOVE_DOWN = 2
  11. MOVE_LEFT = 3
  12. MOVE_RIGHT = 4

  13. white = 255, 240, 200
  14. black = 0, 0, 0

  15. class snake:
  16.         num = 0
  17.         _x = 150
  18.         _y = 150
  19.         # the snake move toward right by default
  20.         _d = MOVE_RIGHT
  21.         _head = False
  22.         def __init__(self):       
  23.                 self.num = 80
  24.         def initialize_snake(self):
  25.                 snake = []
  26.                 n = self.num
  27.                 while n > 0:
  28.                         # head
  29.                         if n == self.num:
  30.                                 np = (self._x+n, self._y, self._d, True)
  31.                         else:
  32.                                 np = (self._x+n, self._y, self._d, False)
  33.                         snake.append(np)
  34.                         n -= 1
  35.                 return snake
  36.         def draw_snake(self, surface, color, snake):
  37.                 "create snake"
  38.                 for i in snake:
  39.                         pos = (i[0], i[1])
  40.                         surface.set_at(pos, color)
  41.         def move_snake(self, sk, lengthen):
  42.                 "move snake"
  43.                 # sk: snake
  44.                 n = 1
  45.                 new_sk = []
  46.                 sk_head = sk[0]
  47.                 # construct head
  48.                 if sk_head[2] == MOVE_UP:
  49.                         new_y = (sk_head[1]-1)%SCREEN_SIZE[1]
  50.                         new_x = sk_head[0]
  51.                 elif sk_head[2] == MOVE_DOWN:
  52.                         new_y = (sk_head[1]+1)%SCREEN_SIZE[1]
  53.                         new_x = sk_head[0]
  54.                 elif sk_head[2] == MOVE_LEFT:
  55.                         new_x = (sk_head[0]-1)%SCREEN_SIZE[0]
  56.                         new_y = sk_head[1]
  57.                 else:
  58.                         new_x = (sk_head[0]+1)%SCREEN_SIZE[0]
  59.                         new_y = sk_head[1]

  60.                 pri_node = sk_head
  61.                 sk_head = (new_x, new_y, sk_head[2], sk_head[3])               
  62.                 new_sk.append(sk_head)

  63.                 for i in sk[:-1]:
  64.                         new_sk.append(i)

  65.                 if lengthen == True:                       
  66.                         new_sk.append(sk[-1])               
  67.                 return new_sk
  68.         def overlap(self, sk):
  69.                 sk_head = sk[0]
  70.                 for i in sk[1:]:
  71.                         if sk_head[0] == i[0] and sk_head[1] == i[1]:
  72.                                 return True
  73.                 return False

  74. class food:
  75.         name = ''
  76.         food = None
  77.         rect = (SCREEN_SIZE[0]/2, SCREEN_SIZE[1]/2)
  78.         f_w = 0
  79.         f_h = 0
  80.         def __init__(self, filename, name):
  81.                 self.food = pygame.image.load(filename).convert_alpha()
  82.                 self.f_w, self.f_h = self.food.get_size()
  83.                 self.name = name
  84.         def display(self, surface, move):                       
  85.                 if move == True:
  86.                         self.rect = (randint(0, SCREEN_SIZE[0]), randint(0, SCREEN_SIZE[1]))
  87.                 surface.blit(self.food, self.rect)
  88.                 return self.rect
  89.         def eaten(self, sk):
  90.                 "check if food has been eaten by the snake"               
  91.                 if sk[0] >= self.rect[0] and sk[0] <= self.rect[0] + self.f_w \
  92.                    and sk[1] >= self.rect[1] and sk[1] <= self.rect[1] + self.f_h:
  93.                         return True
  94.                 else:
  95.                         return False

  96. class score:
  97.         text_x = 0
  98.         text_y = 0
  99.         marks = 0
  100.         sc = None
  101.         def __init__(self, surface):
  102.                 self.sc = surface
  103.         def update_score(self, mark):
  104.                 self.marks += mark
  105.                 self.display_score()
  106.         def clear_score(self):
  107.                 self.marks = 0
  108.                 self.display_score()
  109.         def display_score(self):
  110.                 fg = 250, 240, 200
  111.                 bg = 0, 0, 0
  112.                 font = pygame.font.Font(None, 20)
  113.                 textstring = "Your score: %d" % self.marks
  114.                 self.text_x = SCREEN_SIZE[0] - len('Your score: ') - 80
  115.                 self.text_y = SCREEN_SIZE[1] - 20
  116.                 txt_surface = font.render(textstring, 0, fg, bg)
  117.                 self.sc.blit(txt_surface, (self.text_x, self.text_y))

  118. class food_manager:
  119.         gs_food = None
  120.         counter = 0
  121.         interval = 0
  122.         eat = False
  123.         lengthen = False
  124.         mark = 0
  125.         def __init__(self, screen, food):
  126.                 self.gs_food = food
  127.                 self.refresh_interval()
  128.                 self.get_mark()
  129.         def run(self, surface, score, sk):
  130.                 if self.counter >= self.interval:
  131.                         self.gs_food.display(surface, True)
  132.                         self.refresh_interval()
  133.                         self.counter = 0
  134.                         self.eat = False
  135.                         self.lengthen = False
  136.                 elif self.eat == False:
  137.                         self.gs_food.display(surface, False)

  138.                 if self.gs_food.eaten(sk[0]) and self.eat == False:
  139.                         self.eat = True
  140.                         score.update_score(self.mark)
  141.                         self.lengthen = True
  142.                         # display the next food right away
  143.                         self.counter = self.interval
  144.                 else:
  145.                         score.update_score(0)
  146.                 self.counter += 1

  147.         def refresh_interval(self):
  148.                 if self.gs_food.name == 'candy':
  149.                         self.interval = randint(SCREEN_SIZE[1], SCREEN_SIZE[0])
  150.                 elif self.gs_food.name == 'pizza':
  151.                         self.interval = randint(SCREEN_SIZE[1], SCREEN_SIZE[0])/2
  152.                 else:
  153.                         print 'Unknow food: %s' % self.gs_food.name
  154.                         sys.exit(1)
  155.         def get_mark(self):
  156.                 if self.gs_food.name == 'candy':
  157.                         self.mark = 5
  158.                 elif self.gs_food.name == 'pizza':
  159.                         self.mark = 10
  160.                 else:
  161.                         print 'Unknow food: %s' % self.gs_food.name
  162.                         sys.exit(1)
  163.         def is_lengthen(self):
  164.                 return self.lengthen

  165. def main():
  166.         clock = pygame.time.Clock()
  167.         pygame.init()
  168.         screen = pygame.display.set_mode(SCREEN_SIZE)
  169.         pygame.display.set_caption('Gluttonous Snake')

  170.         snake1 = snake()
  171.         candy = food('candy.jpg', 'candy')
  172.         pizza = food('pizza.jpg', 'pizza')
  173.         # score board
  174.         score_b = score(screen)

  175.         food_candy = food_manager(screen, candy)
  176.         food_pizza = food_manager(screen, pizza)
  177.         sk = snake1.initialize_snake()

  178.         done = 0
  179.         while not done:
  180.                 screen.fill(black)
  181.                 snake1.draw_snake(screen, white, sk)
  182.                
  183.                 food_candy.run(screen, score_b, sk)
  184.                 food_pizza.run(screen, score_b, sk)

  185.                 if snake1.overlap(sk) == True:
  186.                         print 'Snake body overlapped. Your score is cleared!'
  187.                         score_b.clear_score()

  188.                 pygame.display.update()
  189.                 # lengthen the snake after feeding
  190.                 sk = snake1.move_snake(sk, food_candy.is_lengthen() or food_pizza.is_lengthen())

  191.                 sk_head = sk[0]
  192.                 # quit event control
  193.                 new_head = ()
  194.                 for e in pygame.event.get():
  195.                         if e.type == QUIT or (e.type == KEYUP and e.key == K_ESCAPE):
  196.                                 done = 1
  197.                                 break
  198.                         elif e.type == KEYDOWN:
  199.                                 if e.key == K_LEFT:
  200.                                         if sk_head[2] != MOVE_LEFT and sk_head[2] != MOVE_RIGHT:
  201.                                                 new_head = (sk_head[0], sk_head[1], MOVE_LEFT, sk_head[3])
  202.                                 elif e.key == K_RIGHT:
  203.                                         if sk_head[2] != MOVE_RIGHT and sk_head[2] != MOVE_LEFT:
  204.                                                 new_head = (sk_head[0], sk_head[1], MOVE_RIGHT, sk_head[3])
  205.                                 elif e.key == K_UP:
  206.                                         if sk_head[2] != MOVE_UP and sk_head[2] != MOVE_DOWN:
  207.                                                 new_head = (sk_head[0], sk_head[1], MOVE_UP, sk_head[3])
  208.                                 elif e.key == K_DOWN:
  209.                                         if sk_head[2] != MOVE_DOWN and sk_head[2] != MOVE_UP:
  210.                                                 new_head = (sk_head[0], sk_head[1], MOVE_DOWN, sk_head[3])
  211.                                 else:
  212.                                         pass
  213.                         elif e.type == MOUSEBUTTONDOWN and e.button == 1:
  214.                                 done = 1
  215.                                 break
  216.                 # user changed the direction, update sk_head, and sk
  217.                 if len(new_head) != 0:
  218.                         temp = []
  219.                         sk_head = new_head
  220.                         temp.append(sk_head)
  221.                         sk = temp + sk[1:]
  222.                 clock.tick(50)

  223. if __name__ == '__main__':
  224.         main()
复制代码
刚开始学习Python,很多地方还比较粗糙。请各位多指教。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2010-08-25 19:12 |只看该作者
原来还有Pygame这个模块,用来写游戏之类的貌似不是很负责~~

论坛徽章:
0
3 [报告]
发表于 2010-10-17 08:50 |只看该作者
本帖最后由 a515200 于 2010-10-17 08:58 编辑

你既然要写代码,就要贴完整,把他弄到rar压缩包里,还要附上图片,没图片怎么显示?
还有,这段代码是网上的。。。

论坛徽章:
0
4 [报告]
发表于 2010-10-17 10:05 |只看该作者
你既然要写代码,就要贴完整,把他弄到rar压缩包里,还要附上图片,没图片怎么显示?
还有,这段代码是网上 ...
a515200 发表于 2010-10-17 08:50


论坛徽章:
0
5 [报告]
发表于 2010-10-17 14:55 |只看该作者
熊猫 !
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP