ヘビを実現するための200行のPythonコード

200 貪欲なヘビを達成するためのPythonコードの行#

言うまでもありませんが、すべてのコードは最後に記載されています。または、[ここ](https://github.com/NemoHoHaloAi/Game/tree/master/YummySnake)フォーク(テキスト)から開始することもできます。

現在実装されている機能のリスト:

  1. スネークを制御するには、上、下、左、右の矢印キーを使用します。
  2. 端、壁、または自分自身に触れると、ゲームは終了します。
  3. 食べ物と接触すると食べ物は消え、食べ物の種類に応じて体が成長します。
  4. 現在の長さの表示。
  5. 一時停止と終了のインターフェイス。

アニメーションの実行##

コードスニペット分析##

各パーツを描画するためのコード###

# ゲームの背景と下部にテキストを表示するために使用される背景
def draw_background():
 # white background
 screen.fill(COLORS['white'])
 pygame.draw.rect(screen,COLORS['black'],(-100,GAME_SIZE[1],3000,200),0)

# 壁を描く
def draw_wall():for xy in wall_list:
  pygame.draw.rect(screen,COLORS['darkgray'],(xy[0]-WALL_WIDTH/2,xy[1]-WALL_WIDTH/2,WALL_WIDTH,WALL_HEIGHT),0)

# 頭と体を含む蛇を描く
def draw_snake():
 head = snake_list[0]
 pygame.draw.circle(screen,COLORS['darkred'],(head[0],head[1]),int(SNAKE_WIDTH/2),0)for xy in snake_list[1:]:
  pygame.draw.rect(screen,COLORS['darkred'],(xy[0]-SNAKE_WIDTH/2,xy[1]-SNAKE_WIDTH/2,SNAKE_WIDTH,SNAKE_HEIGHT),2)

# 食べ物を描く
def draw_food():for xyz in food_list:
  pygame.draw.rect(screen,FOOD_COLORS[xyz[2]-1],(xyz[0]-FOOD_WIDTH/2,xyz[1]-FOOD_WIDTH/2,FOOD_WIDTH,FOOD_HEIGHT),0)

# 下に体長の記録を描く
def draw_context():
 txt = FONT_M.render('Snake length: '+str(len(snake_list)-1),True,COLORS['lightblue'])
 x,y =10,GAME_SIZE[1]+(int((SIZE[1]-GAME_SIZE[1])/2))
 y =int(y-FONT_M.size('Count')[1]/2)
 screen.blit(txt,(x,y))

# 一時停止インターフェイスを描画します
def draw_pause():
 s = pygame.Surface(SIZE, pygame.SRCALPHA)
 s.fill((255,255,255,220))
 screen.blit(s,(0,0))
 txt = FONT_M.render('PAUSE',True,COLORS['darkgray'])
 x,y = SIZE[0]/2,SIZE[1]/2
 x,y =int(x-FONT_M.size('PAUSE')[0]/2),int(y-FONT_M.size('PAUSE')[1]/2)
 screen.blit(txt,(x,y))

# 死のインターフェースを描く
def draw_dead():
 s = pygame.Surface(SIZE, pygame.SRCALPHA)
 s.fill((255,255,255,240))
 screen.blit(s,(0,0))
 txt = FONT_M.render('YOU DEAD',True,COLORS['black'])
 x,y = SIZE[0]/2,SIZE[1]/2
 x,y =int(x-FONT_M.size('YOU DEAD')[0]/2),int(y-FONT_M.size('YOU DEAD')[1]/2)
 screen.blit(txt,(x,y))

死と食物の衝突検査###

# 衝突検出として長方形のカバレッジチェックが使用されます。アイデアは、カバーされないすべての状況の逆を実行することです。
def rect_cover(rect1,rect2):
 left1 =int(rect1[0])
 right1 =int(rect1[0]+rect1[2])
 up1 =int(rect1[1])
 down1 =int(rect1[1]+rect1[3])
 left2 =int(rect2[0])
 right2 =int(rect2[0]+rect2[2])
 up2 =int(rect2[1])
 down2 =int(rect2[1]+rect2[3])ifnot(right2<=left1 or left2>=right1 or down2<=up1 or up2>=down1):return True
 return False

# 食べ物に触れていないか確認してください
def check_food():
 # 頭と食べ物
 first = snake_list[0]
 snake_head_rect =(first[0]-SNAKE_WIDTH/2,first[1]-SNAKE_WIDTH/2,SNAKE_WIDTH,SNAKE_HEIGHT)for i inrange(len(food_list)):
  xyz = food_list[i]
  food_rect =(xyz[0]-FOOD_WIDTH/2,xyz[1]-FOOD_WIDTH/2,FOOD_WIDTH,FOOD_HEIGHT)ifrect_cover(snake_head_rect,food_rect):add_body(xyz[2])
   del food_list[i]return True
 return False

# 端、壁、または体に触れていないか確認してください
def check_dead():
 first = snake_list[0]
 snake_head_rect =(first[0]-SNAKE_WIDTH/2,first[1]-SNAKE_WIDTH/2,SNAKE_WIDTH,SNAKE_HEIGHT)
 # 頭と端
 if first[0]<0 or first[0]> GAME_SIZE[0] or first[1]<0 or first[1]> GAME_SIZE[1]:return True
 # 頭と壁
 for xy in wall_list:
  wall_rect =(xy[0]-WALL_WIDTH/2,xy[1]-WALL_WIDTH/2,WALL_WIDTH,WALL_HEIGHT)ifrect_cover(snake_head_rect,wall_rect):return True
 # 頭と自己
 for xy in snake_list[1:]:
  body_rect =(xy[0]-SNAKE_WIDTH/2,xy[1]-SNAKE_WIDTH/2,SNAKE_WIDTH,SNAKE_HEIGHT)ifrect_cover(snake_head_rect,body_rect):return True
 return False

食べ物を更新し、ヘビの体の長さを増やします###

def add_food():while(True):
  xyz =[random.choice(X_LIST),random.choice(Y_LIST),random.choice([1,2,3,4])]if xyz not in wall_list:
   food_list.append(xyz)break
def add_body(length=1):for c inrange(length):
  # テールプラス1セクション
  last2,last1 = snake_list[-2],snake_list[-1]if last2[0]==last1[0]: #2つの垂直段落
   if last2[1]>last1[1]: #下向き
    snake_list.append([last1[0],last1[1]-SNAKE_WIDTH])else:
    snake_list.append([last1[0],last1[1]+SNAKE_WIDTH])else: #2つの水平セクション
   if last2[0]>last1[0]: #右の方へ
    snake_list.append([last1[0]-SNAKE_WIDTH,last1[1]])else:
    snake_list.append([last1[0]+SNAKE_WIDTH,last1[1]])

スネークの自動移動###

# ボタンを押して、ヘビの現在の方向を決定します
if event.key == K_LEFT:if head in['up','down']:
  head ='left'
elif event.key == K_RIGHT:if head in['up','down']:
  head ='right'
elif event.key == K_UP:if head in['left','right']:
  head ='up'
elif event.key == K_DOWN:if head in['left','right']:
  head ='down'

# ヘビの次の位置を見出しで判断します
first = snake_list[0]
snake_list[1:]= snake_list[:-1]if head =='up':
 snake_list[0]=[first[0],first[1]-SNAKE_WIDTH]
elif head =='down':
 snake_list[0]=[first[0],first[1]+SNAKE_WIDTH]
elif head =='left':
 snake_list[0]=[first[0]-SNAKE_WIDTH,first[1]]
elif head =='right':
 snake_list[0]=[first[0]+SNAKE_WIDTH,first[1]]

すべてのコード##

import sys,random

import pygame
from pygame.color import THECOLORS as COLORS
from pygame.locals import*

def draw_background():
 # white background
 screen.fill(COLORS['white'])
 pygame.draw.rect(screen,COLORS['black'],(-100,GAME_SIZE[1],3000,200),0)

def draw_wall():for xy in wall_list:
  pygame.draw.rect(screen,COLORS['darkgray'],(xy[0]-WALL_WIDTH/2,xy[1]-WALL_WIDTH/2,WALL_WIDTH,WALL_HEIGHT),0)

def draw_snake():
 head = snake_list[0]
 pygame.draw.circle(screen,COLORS['darkred'],(head[0],head[1]),int(SNAKE_WIDTH/2),0)for xy in snake_list[1:]:
  pygame.draw.rect(screen,COLORS['darkred'],(xy[0]-SNAKE_WIDTH/2,xy[1]-SNAKE_WIDTH/2,SNAKE_WIDTH,SNAKE_HEIGHT),2)

def draw_food():for xyz in food_list:
  pygame.draw.rect(screen,FOOD_COLORS[xyz[2]-1],(xyz[0]-FOOD_WIDTH/2,xyz[1]-FOOD_WIDTH/2,FOOD_WIDTH,FOOD_HEIGHT),0)

def draw_context():
 txt = FONT_M.render('Snake length: '+str(len(snake_list)-1),True,COLORS['lightblue'])
 x,y =10,GAME_SIZE[1]+(int((SIZE[1]-GAME_SIZE[1])/2))
 y =int(y-FONT_M.size('Count')[1]/2)
 screen.blit(txt,(x,y))

def draw_pause():
 s = pygame.Surface(SIZE, pygame.SRCALPHA)
 s.fill((255,255,255,220))
 screen.blit(s,(0,0))
 txt = FONT_M.render('PAUSE',True,COLORS['darkgray'])
 x,y = SIZE[0]/2,SIZE[1]/2
 x,y =int(x-FONT_M.size('PAUSE')[0]/2),int(y-FONT_M.size('PAUSE')[1]/2)
 screen.blit(txt,(x,y))

def draw_dead():
 s = pygame.Surface(SIZE, pygame.SRCALPHA)
 s.fill((255,255,255,240))
 screen.blit(s,(0,0))
 txt = FONT_M.render('YOU DEAD',True,COLORS['black'])
 x,y = SIZE[0]/2,SIZE[1]/2
 x,y =int(x-FONT_M.size('YOU DEAD')[0]/2),int(y-FONT_M.size('YOU DEAD')[1]/2)
 screen.blit(txt,(x,y))

def rect_cover(rect1,rect2):
 left1 =int(rect1[0])
 right1 =int(rect1[0]+rect1[2])
 up1 =int(rect1[1])
 down1 =int(rect1[1]+rect1[3])
 left2 =int(rect2[0])
 right2 =int(rect2[0]+rect2[2])
 up2 =int(rect2[1])
 down2 =int(rect2[1]+rect2[3])ifnot(right2<=left1 or left2>=right1 or down2<=up1 or up2>=down1):return True
 return False

def add_food():while(True):
  xyz =[random.choice(X_LIST),random.choice(Y_LIST),random.choice([1,2,3,4])]if xyz not in wall_list:
   food_list.append(xyz)break
def add_body(length=1):for c inrange(length):
  # テールプラス1セクション
  last2,last1 = snake_list[-2],snake_list[-1]if last2[0]==last1[0]: #2つの垂直段落
   if last2[1]>last1[1]: #下向き
    snake_list.append([last1[0],last1[1]-SNAKE_WIDTH])else:
    snake_list.append([last1[0],last1[1]+SNAKE_WIDTH])else: #2つの水平セクション
   if last2[0]>last1[0]: #右の方へ
    snake_list.append([last1[0]-SNAKE_WIDTH,last1[1]])else:
    snake_list.append([last1[0]+SNAKE_WIDTH,last1[1]])

def check_food():
 # 頭と食べ物
 first = snake_list[0]
 snake_head_rect =(first[0]-SNAKE_WIDTH/2,first[1]-SNAKE_WIDTH/2,SNAKE_WIDTH,SNAKE_HEIGHT)for i inrange(len(food_list)):
  xyz = food_list[i]
  food_rect =(xyz[0]-FOOD_WIDTH/2,xyz[1]-FOOD_WIDTH/2,FOOD_WIDTH,FOOD_HEIGHT)ifrect_cover(snake_head_rect,food_rect):add_body(xyz[2])
   del food_list[i]return True
 return False

def check_dead():
 first = snake_list[0]
 snake_head_rect =(first[0]-SNAKE_WIDTH/2,first[1]-SNAKE_WIDTH/2,SNAKE_WIDTH,SNAKE_HEIGHT)
 # 頭と端
 if first[0]<0 or first[0]> GAME_SIZE[0] or first[1]<0 or first[1]> GAME_SIZE[1]:return True
 # 頭と壁
 for xy in wall_list:
  wall_rect =(xy[0]-WALL_WIDTH/2,xy[1]-WALL_WIDTH/2,WALL_WIDTH,WALL_HEIGHT)ifrect_cover(snake_head_rect,wall_rect):return True
 # 頭と自己
 for xy in snake_list[1:]:
  body_rect =(xy[0]-SNAKE_WIDTH/2,xy[1]-SNAKE_WIDTH/2,SNAKE_WIDTH,SNAKE_HEIGHT)ifrect_cover(snake_head_rect,body_rect):return True
 return False

if __name__ =="__main__":
 # init pygame
 pygame.init()
    
 # contant
 GAME_SIZE =[900,900]
 SIZE =[GAME_SIZE[0],GAME_SIZE[1]+100]
 FONT_S = pygame.font.SysFont('Times',50)
 FONT_M = pygame.font.SysFont('Times',90)
 DIRECTION =['up','right','down','left']
 X_LIST =[x for x inrange(GAME_SIZE[0])]
 Y_LIST =[y for y inrange(GAME_SIZE[1])]
 FOOD_COLORS =((46,139,87),(199,21,133),(25,25,112),(255,215,0))

 # wall
 wall_list =[[100,200],[600,500],[350,200],[500,800]]
 WALL_WIDTH,WALL_HEIGHT =30,30

 # food
 food_list =[(150,200,1),(300,500,1),(740,542,1),(300,600,1),(700,600,1)]
 FOOD_WIDTH,FOOD_HEIGHT =14,14
    
 # create screen 500*500
 screen = pygame.display.set_mode(SIZE)
    
 # variable parameter
 snake_list =[[100+12*4,100],[100+12*3,100],[100+12*2,100],[100+12*1,100],[100,100]]
 SNAKE_WIDTH,SNAKE_HEIGHT =12,12
 snake_v =0
 count_time =0

 # level
 frame =0.05
 level =1
    
 # main loop
 running = True
 pause = False
 dead = False
 head ='right'while running:for event in pygame.event.get():if event.type == pygame.QUIT:
    running = False
    break
   elif event.type == pygame.MOUSEBUTTONDOWN:
    pause = not pause
   elif event.type == pygame.KEYUP:if event.key == K_LEFT:if head in['up','down']:
      head ='left'
    elif event.key == K_RIGHT:if head in['up','down']:
      head ='right'
    elif event.key == K_UP:if head in['left','right']:
      head ='up'
    elif event.key == K_DOWN:if head in['left','right']:
      head ='down'

  # update data
  if not pause and not dead:
   count_time += frame*level
   first = snake_list[0]
   snake_list[1:]= snake_list[:-1]if head =='up':
    snake_list[0]=[first[0],first[1]-SNAKE_WIDTH]
   elif head =='down':
    snake_list[0]=[first[0],first[1]+SNAKE_WIDTH]
   elif head =='left':
    snake_list[0]=[first[0]-SNAKE_WIDTH,first[1]]
   elif head =='right':
    snake_list[0]=[first[0]+SNAKE_WIDTH,first[1]]

  # background
  draw_background()
  # tunnel
  draw_wall()
  # choose item
  draw_snake()
  # food
  draw_food()
  # point
  draw_context()
  # pause
  if not dead and pause:draw_pause()
  # dead
  if dead:draw_dead()
  # flip
  pygame.display.flip()

  # pause 20ms
  pygame.time.delay(int(frame/level*1000))

  # check win or not
  dead =check_dead()ifcheck_food():add_food()
    
 pygame.quit()

Recommended Posts

ヘビを実現するための200行のPythonコード
航空機戦争を達成するための500行のPythonコード
Pythonはスネークゲームのソースコードを実装しています
バグを見つけるためのPythonコード(2)
バグを見つけるためのPythonコード(7)
pythonコードにコメントする方法
バグを見つけるためのPythonコード(3)
バグを見つけるためのPythonコード(9)
バグを見つけるためのPythonコード(6)
バグを見つけるためのPythonコード(1)
バグを見つけるためのPythonコード(8)
バグを見つけるためのPythonコード(5)
ミニマリズムはPythonの魂です|バグを見つけるためのPythonコード(10)
pythonウェブページコードの表示方法
pythonを使用して段階的な回帰を実現します
pythonコードでラップする方法
Pythonは実行する操作コードを処理します
pythonのインストールが成功したことを確認する方法
Pythonコードをインデントする必要がありますか
Python3.9の7つの機能
実際には非常に単純です|バグを見つけるためのPythonコード(12)
pythonでアシスタントを実行するコードを使用する方法
pythonでコード自動プロンプトを設定する方法
ファイルをダウンロードするためのPythonヘッドレスクローラーの実装
Pythonコードをまとめて正しく移動する方法
Pythonを使用してKSを計算する詳細な例
Pythonの紹介
Pythonでのパッケージの導入を理解する方法
pythonで番号のリストを理解する方法
pythonで写真を自動的にダウンロードする方法の例
プレイカードの配布を実現するためのPythonシミュレーション
Centos 6.4 python2.6を2.7にアップグレード
Python構文の基本
PythonSMS爆撃コード
Pythonの基本構文
Pythonの基礎知識(1)
pythonのPrettytableモジュール
09.Python3の共通モジュール
jenkinsを使用してコードクラウドコードを自動的にプルし、自動展開を実現します
pythonで円の領域を見つける方法