鱼C论坛

 找回密码
 立即注册
查看: 2503|回复: 5

[技术交流] python小练习(070):简单游戏AI设计之二(不带AI的贪食蛇GUI版本)

[复制链接]
发表于 2017-2-8 11:10:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 jerryxjr1220 于 2017-2-8 17:13 编辑

之前在网上看到一个达人发的贪食蛇游戏的gif图片,图中的贪食蛇几乎完美的移动策略,可以吃完所有食物,然后填满整个地图。
snake_ai.gif

想要设计这样的游戏AI,第一步当然要先设计一个游戏啦,贪食蛇的游戏程序很容易,做非gui界面的几十行代码,用pygame画也不过一百多行代码。
下面先附上个pygame版本的贪食蛇(不带游戏AI),随后我们再讨论,如何加上游戏AI。
游戏界面:
无标题.png
  1. import pygame
  2. import sys
  3. import random

  4. # 全局定义
  5. SCREEN_X = 600
  6. SCREEN_Y = 600


  7. # 蛇类
  8. # 点以25为单位
  9. class Snake(object):
  10.     # 初始化各种需要的属性 [开始时默认向右/身体块x5]
  11.     def __init__(self):
  12.         self.dirction = pygame.K_RIGHT
  13.         self.body = []
  14.         for x in range(5):
  15.             self.addnode()
  16.         
  17.     # 无论何时 都在前端增加蛇块
  18.     def addnode(self):
  19.         left,top = (0,0)
  20.         if self.body:
  21.             left,top = (self.body[0].left,self.body[0].top)
  22.         node = pygame.Rect(left,top,25,25)
  23.         if self.dirction == pygame.K_LEFT:
  24.             node.left -= 25
  25.         elif self.dirction == pygame.K_RIGHT:
  26.             node.left += 25
  27.         elif self.dirction == pygame.K_UP:
  28.             node.top -= 25
  29.         elif self.dirction == pygame.K_DOWN:
  30.             node.top += 25
  31.         self.body.insert(0,node)
  32.         
  33.     # 删除最后一个块
  34.     def delnode(self):
  35.         self.body.pop()
  36.         
  37.     # 死亡判断
  38.     def isdead(self):
  39.         # 撞墙
  40.         if self.body[0].x  not in range(SCREEN_X):
  41.             return True
  42.         if self.body[0].y  not in range(SCREEN_Y):
  43.             return True
  44.         # 撞自己
  45.         if self.body[0] in self.body[1:]:
  46.             return True
  47.         return False
  48.         
  49.     # 移动!
  50.     def move(self):
  51.         self.addnode()
  52.         self.delnode()
  53.         
  54.     # 改变方向 但是左右、上下不能被逆向改变
  55.     def changedirection(self,curkey):
  56.         LR = [pygame.K_LEFT,pygame.K_RIGHT]
  57.         UD = [pygame.K_UP,pygame.K_DOWN]
  58.         if curkey in LR+UD:
  59.             if (curkey in LR) and (self.dirction in LR):
  60.                 return
  61.             if (curkey in UD) and (self.dirction in UD):
  62.                 return
  63.             self.dirction = curkey
  64.       
  65.       
  66. # 食物类
  67. # 方法: 放置/移除
  68. # 点以25为单位
  69. class Food:
  70.     def __init__(self):
  71.         self.rect = pygame.Rect(-25,0,25,25)
  72.         
  73.     def remove(self):
  74.         self.rect.x=-25
  75.    
  76.     def set(self):
  77.         if self.rect.x == -25:
  78.             allpos = []
  79.             # 不靠墙太近 25 ~ SCREEN_X-25 之间
  80.             for pos in range(25,SCREEN_X-25,25):
  81.                 allpos.append(pos)
  82.             self.rect.left = random.choice(allpos)
  83.             self.rect.top  = random.choice(allpos)
  84.             print(self.rect)
  85.             

  86. def show_text(screen, pos, text, color, font_bold = False, font_size = 60, font_italic = False):   
  87.     #获取系统字体,并设置文字大小  
  88.     cur_font = pygame.font.SysFont("宋体", font_size)  
  89.     #设置是否加粗属性  
  90.     cur_font.set_bold(font_bold)  
  91.     #设置是否斜体属性  
  92.     cur_font.set_italic(font_italic)  
  93.     #设置文字内容  
  94.     text_fmt = cur_font.render(text, 1, color)  
  95.     #绘制文字  
  96.     screen.blit(text_fmt, pos)

  97.      
  98. def main():
  99.     pygame.init()
  100.     screen_size = (SCREEN_X,SCREEN_Y)
  101.     screen = pygame.display.set_mode(screen_size)
  102.     pygame.display.set_caption('Snake')
  103.     clock = pygame.time.Clock()
  104.     scores = 0
  105.     isdead = False
  106.    
  107.     # 蛇/食物
  108.     snake = Snake()
  109.     food = Food()
  110.    
  111.     while True:
  112.         for event in pygame.event.get():
  113.             if event.type == pygame.QUIT:
  114.                 sys.exit()
  115.             if event.type == pygame.KEYDOWN:
  116.                 snake.changedirection(event.key)
  117.                 # 死后按space重新
  118.                 if event.key == pygame.K_SPACE and isdead:
  119.                     return main()
  120.                
  121.             
  122.         screen.fill((255,255,255))
  123.         
  124.         # 画蛇身 / 每一步+1分
  125.         if not isdead:
  126.             scores+=1
  127.             snake.move()
  128.         for rect in snake.body:
  129.             pygame.draw.rect(screen,(20,220,39),rect,0)
  130.             
  131.         # 显示死亡文字
  132.         isdead = snake.isdead()
  133.         if isdead:
  134.             show_text(screen,(100,200),'YOU DEAD!',(227,29,18),False,100)
  135.             show_text(screen,(150,260),'press space to try again...',(0,0,22),False,30)
  136.             
  137.         # 食物处理 / 吃到+50分
  138.         # 当食物rect与蛇头重合,吃掉 -> Snake增加一个Node
  139.         if food.rect == snake.body[0]:
  140.             scores+=50
  141.             food.remove()
  142.             snake.addnode()
  143.         
  144.         # 食物投递
  145.         food.set()
  146.         pygame.draw.rect(screen,(136,0,21),food.rect,0)
  147.         
  148.         # 显示分数文字
  149.         show_text(screen,(50,500),'Scores: '+str(scores),(223,223,223))
  150.         
  151.         pygame.display.update()
  152.         clock.tick(10)
  153.    
  154.    
  155. if __name__ == '__main__':
  156.     main()
复制代码

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-8 11:25:40 | 显示全部楼层
挺棒的!
过两天用Html5复刻一个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-8 13:18:58 | 显示全部楼层
牛2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-8 15:16:18 | 显示全部楼层
牛B !!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-9 16:55:22 | 显示全部楼层
学习了,后面自己码一个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-26 15:59:26 | 显示全部楼层
这游戏好像有个bug,食物会出现在蛇的身子上~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-6 07:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表