Pythonは貪欲なヘビの二重の戦いを実現します

この記事の例では、参考のために2人でのスネークの戦いを実現するためのpythonの特定のコードを共有しています。具体的な内容は次のとおりです。

夕方、家の子供たちはスネークゲームをして私と戦いたいと思っています。しばらくの間、どこでそのようなゲームをプレイするか考えていませんでした。突然、自分で書くことを思いついたのです。ちなみに、プログラマーの素晴らしさを子供たちに示すことができます。だから始めた。

オリジナルコピー

これは非常に基本的なプログラムです。当然、最初から作成する必要はありません。インターネットを検索して、誰かが共有しているコードを見つけてください。リンクをクリックしてください。コードは「RaspberryPiユーザーガイド」からのものと言われています。私もチェックしませんでした。コードは次のように表示されます。

#! /usr/bin/env python
import pygame,sys,time,random
from pygame.locals import*
# 色変数を定義する
redColour = pygame.Color(255,0,0)
blackColour = pygame.Color(0,0,0)
whiteColour = pygame.Color(255,255,255)
greyColour = pygame.Color(150,150,150)
# gameOver関数を定義する
def gameOver(playSurface):
gameOverFont = pygame.font.Font('arial.ttf',72)
gameOverSurf = gameOverFont.render('Game Over', True, greyColour)
gameOverRect = gameOverSurf.get_rect()
gameOverRect.midtop =(320,10)
playSurface.blit(gameOverSurf, gameOverRect)
pygame.display.flip()
time.sleep(5)
pygame.quit()
sys.exit()
# 主な機能を定義する
def main():
# pygameを初期化します
pygame.init()
fpsClock = pygame.time.Clock()
# pygame表示レイヤーを作成する
playSurface = pygame.display.set_mode((640,480))
pygame.display.set_caption('Raspberry Snake')
# 変数を初期化する
snakePosition =[100,100]
snakeSegments =[[100,100],[80,100],[60,100]]
raspberryPosition =[300,300]
raspberrySpawned =1
direction ='right'
changeDirection = direction
while True:
# キーストロークなどのpygameイベントを検出する
for event in pygame.event.get():if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == KEYDOWN:
# キーボードイベントを決定する
if event.key == K_RIGHT or event.key ==ord('d'):
changeDirection ='right'if event.key == K_LEFT or event.key ==ord('a'):
changeDirection ='left'if event.key == K_UP or event.key ==ord('w'):
changeDirection ='up'if event.key == K_DOWN or event.key ==ord('s'):
changeDirection ='down'if event.key == K_ESCAPE:
pygame.event.post(pygame.event.Event(QUIT))
# 逆方向が入力されているかどうかを確認します
if changeDirection =='right' and not direction =='left':
direction = changeDirection
if changeDirection =='left' and not direction =='right':
direction = changeDirection
if changeDirection =='up' and not direction =='down':
direction = changeDirection
if changeDirection =='down' and not direction =='up':
direction = changeDirection
# ヘビの頭の座標を方向に合わせて動かします
if direction =='right':
snakePosition[0]+=20if direction =='left':
snakePosition[0]-=20if direction =='up':
snakePosition[1]-=20if direction =='down':
snakePosition[1]+=20
# ヘビの長さを増やす
snakeSegments.insert(0,list(snakePosition))
# ラズベリーを食べたかどうかを確認します
if snakePosition[0]== raspberryPosition[0] and snakePosition[1]== raspberryPosition[1]:
raspberrySpawned =0else:
snakeSegments.pop()
# ラズベリーを食べる場合は、ラズベリーを再生します
if raspberrySpawned ==0:
x = random.randrange(1,32)
y = random.randrange(1,24)
raspberryPosition =[int(x*20),int(y*20)]
raspberrySpawned =1
# pygame表示レイヤーを描画します
playSurface.fill(blackColour)for position in snakeSegments:
pygame.draw.rect(playSurface,whiteColour,Rect(position[0],position[1],20,20))
pygame.draw.rect(playSurface,redColour,Rect(raspberryPosition[0], raspberryPosition[1],20,20))
# pygame表示レイヤーを更新
pygame.display.flip()
# 死を判断する
if snakePosition[0]620 or snakePosition[0]<0:gameOver(playSurface)if snakePosition[1]460 or snakePosition[1]<0:for snakeBody in snakeSegments[1:]:if snakePosition[0]== snakeBody[0] and snakePosition[1]== snakeBody[1]:gameOver(playSurface)
# ゲーム速度を制御する
fpsClock.tick(5)if __name__ =="__main__":main()

このコードは基本的な機能を実装しています。メインループでは、最初にキーイベントが判断され、次にヘビの位置が調整されます。ヘビが豆(このコードではラズベリーと呼ばれます。名前が長すぎると思い、習慣的な豆に変更しました)を食べる場合は、次のように追加します。ヘビの長さ、豆を再生し、表示を更新し、最後に死んでいるかどうかを判断します。死んでいる場合は、gameOverを呼び出します。

もちろん、これは子供たちのニーズを満たすことはできません。子供たちはそれを試し、すぐに次の要件を抽出しました。

1、 私と遊びたいのなら、それぞれに1つずつ、2つのヘビを用意し、誰がもっと食べるかを確認する必要があります。
2、 ヘビが死んだ後に終わらせないでください、それはあまりにも面倒です、代わりに最初からやり直してください。
3、 ヘビの色は自分で決める必要があります。
4、 スネークヘッドを見ることができるようにするには、スネークヘッドは異なる色を使用する必要があります。
5、 豆の数が少なすぎて、一度に1つだけです。一度にたくさんの豆があるので、好きなものを食べることができます。

世界中のユーザーは同じであり、常にさまざまなニーズを持っているようです。そこで、今後の変更を容易にするために、次のようにスネーク関連の操作をスネーククラスに抽出しました。

ヘビ

classSnake: 
def __init__(self, color, headColor, ctrlKeys):
self.color = color
self.headColor = headColor
self.ctrlKeys = ctrlKeys #押す[上下左右]の順序
self.direction = random.choice([-2,2,-1,1]) #方向[-2,2,-1,1]それぞれ[上下左右]
x = random.randrange(5,SCREEN_WIDTH/20-5)
y = random.randrange(5,SCREEN_HEIGHT/20-5)
self.headPos =[int(x*20),int(y*20)]
self.segments =[self.headPos]
self.moveAndAdd()
self.moveAndAdd()  
def changeDirection(self, pressKey):
directions =[-2,2,-1,1]for direct, key inzip(directions, self.ctrlKeys):if key == pressKey and direct + self.direction !=0:
self.direction = direct  
def moveAndAdd(self):
# ヘビの頭の座標を方向に合わせて動かします
if self.direction ==1:
self.headPos[0]+=20if self.direction ==-1:
self.headPos[0]-=20if self.direction ==-2:
self.headPos[1]-=20if self.direction ==2:
self.headPos[1]+=20
self.segments.insert(0,list(self.headPos)) #ヘビの頭にグリッドを挿入します
def pop(self):
self.segments.pop() #ヘビの尻尾から1マスを引く
def show(self, playSurface):
# ヘビの体を描く
for pos in self.segments[1:]:
pygame.draw.rect(playSurface,self.color,Rect(pos[0],pos[1],20,20))
# スネークヘッド
pygame.draw.rect(playSurface,self.headColor,Rect(self.headPos[0],self.headPos[1],20,20))
def respawnIfDead(self):if self.headPos[0]   SCREEN_WIDTH-20 or self.headPos[0]<0 or self.headPos[1]   SCREEN_HEIGHT-20 or self.headPos[1]<0:  
x = random.randrange(5,SCREEN_WIDTH/20-5)
y = random.randrange(5,SCREEN_HEIGHT/20-5)
self.direction = random.choice([-2,2,-1,1])
self.headPos =[int(x*20),int(y*20)]
self.segments =[self.headPos]
self.moveAndAdd()
self.moveAndAdd()

初期化関数には、ヘビの色、ヘビの頭の色、およびコントロールボタンの3つのパラメータがあります。初期化されたスネークは3つのグリッドで、中央領域にランダムに表示されます(応答する前に死ぬのではないかと恐れて横向きすぎます)。初期化を呼び出すためのコードは次のとおりです。

# ヘビを初期化する
ctrlKeys1 =[ord('w'),ord('s'),ord('a'),ord('d')]
ctrlKeys2 =[K_UP,K_DOWN,K_LEFT,K_RIGHT]
snake1 =Snake(GREEN,GREEN_HEAD,ctrlKeys1)
snake2 =Snake(RED,RED_HEAD,ctrlKeys2)

changeDirection関数は、その名前が示すように、方向を変更します。1つのパラメーターはボタンです。 self.directionは、[-2,2、-1,1]を使用してそれぞれ[上、下、左、右]を表す、ヘビの現在の移動方向を記録します。これは主にコードを簡略化するためです。 changeDirection関数は、キー値に従って方向を変更するかどうかを決定します。ここで、ヘビは戻ることができないことに注意してください。たとえば、上がっているときにキーを押しても効果はありません。

moveAndAdd関数は、移動方向に従って正方形を移動し、スネークヘッドに正方形を追加します。 pop関数は、ヘビの尾から1つの正方形を減算します。これら2つの機能を組み合わせることで、蛇の動きを実現し、蛇は1マス大きくなって動きます。

show関数は、スネークを表示します。最初にスネークボディを描画し、次にスネークヘッドを描画します。スネークヘッドがスネークボディによってブロックされている場合。

respawnIfDead関数は、ヘビが死んでいるかどうかを判断し、死んだ場合はリスポーンします。現在の死の方法は境界を超えています。生まれ変わったヘビは中央部にランダムに現れ、その体は3グリッドに戻ります。

たくさんの豆を自由に食べられるという要望に応えるため、今後の拡大を考えて、豆も豆のように、豆も豆のように次のようにしています。

classBean:
def __init__(self, color, pos):
self.color = color
self.pos = pos
def beEaten(self, snakePos):if snakePos[0]== self.pos[0] and snakePos[1]== self.pos[1]:return True
else:return False
classBeans:
def __init__(self, color, totalNum):
self.color = color
self.totalNum = totalNum
self.curNum =0
self.beans =[]
def generate(self):while self.curNum < self.totalNum:
x = random.randrange(0,SCREEN_WIDTH/20)
y = random.randrange(0,SCREEN_HEIGHT/20)
self.beans.append(Bean(self.color,[int(x*20),int(y*20)]))
self.curNum = self.curNum +1
def beEaten(self, snakePos):for bean in self.beans:if bean.beEaten(snakePos):
self.beans.remove(bean)
self.curNum = self.curNum -1return True
return False
def show(self, playSurface):for bean in self.beans:
pygame.draw.rect(playSurface,self.color,Rect(bean.pos[0],bean.pos[1],20,20))

豆は比較的シンプルです。初期化時に色と位置を指定する必要があります。食べられたかどうかを判断する関数beEatenがあります。

Beanのクラスはもう少し複雑で、totalNumBeanが含まれています。 Beanを初期化するときに、色と番号を指定する必要があります。 curNumは、一部の豆が食べられた可能性があるため、現在の豆の数を記録するために使用されます。生成機能はBeanの生成を担当し、初期化後およびBeanの摂取後にBeanを生成するために使用できます。生成されたBeanは画面にランダムに表示されます。 beEaten関数は、一部のBeanが食べられたかどうかを判断し、食べられた場合はBeanのリストから削除し、curNumを調整して現在残っているBeanの数を記録します。 show関数は、すべてのBeanを表示します。
Beanを初期化するコードは次のとおりです。

# Beanを初期化します
yellowBeans =Beans(YELLOW, BEAN_NUM)
yellowBeans.generate()

スネークとビーンズが初期化された後、メインループコードは次のように簡略化できます。

while True:
# キーストロークなどのpygameイベントを検出する
for event in pygame.event.get():if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == KEYDOWN:if event.key == K_ESCAPE:
pygame.event.post(pygame.event.Event(QUIT))else:
snake1.changeDirection(event.key)
snake2.changeDirection(event.key)
# 方向に応じてヘビを動かし、ヘビの長さを1ブロック増やします
snake1.moveAndAdd()
snake2.moveAndAdd()
# 豆が食べられた場合は豆を再生し、そうでない場合はヘビの長さが1ブロック短くなります
if yellowBeans.beEaten(snake1.headPos):
yellowBeans.generate()else:
snake1.pop()if yellowBeans.beEaten(snake2.headPos):
yellowBeans.generate()else:
snake2.pop()
# 描画の更新
playSurface.fill(BLACK) #pygame表示レイヤーを描画します
yellowBeans.show(playSurface)
snake1.show(playSurface)
snake2.show(playSurface)
pygame.display.flip() #pygame表示レイヤーを更新
# あなたが死んだら再生
snake1.respawnIfDead()
snake2.respawnIfDead()
# ゲーム速度を制御する
fpsClock.tick(5)

もちろん、実行するには、pygameの初期化にはまだ次のものが必要です。

pygame.init()
fpsClock = pygame.time.Clock()
# pygame表示レイヤーを作成する
playSurface = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
pygame.display.set_caption('Snake Eat Beans')

最後に、コードで使用されるいくつかの固定値は次のように定義されています:

# インターフェイスサイズを定義する
SCREEN_WIDTH =1080
SCREEN_HEIGHT =720
# Beanの数を定義します
BEAN_NUM =10
# 色変数を定義する
RED = pygame.Color(255,0,0)
RED_HEAD = pygame.Color(255,150,0)
BLACK = pygame.Color(0,0,0)
WHITE = pygame.Color(255,255,255)
GREY = pygame.Color(150,150,150)
GREEN = pygame.Color(0,255,0)
GREEN_HEAD = pygame.Color(100,200,200)
YELLOW = pygame.Color(255,255,0)
BLUE = pygame.Color(0,0,255)

最後に、私は私の子供たちと楽しく遊ぶことができます

pythonゲームに関するよりエキサイティングな記事については、クリックして次のトピックを表示してください。

pythontetrisゲームコレクション

Pythonクラシックゲームの概要

PythonWeChatジャンプジャンプゲームコレクション

より興味深い古典的なミニゲームの実装トピック、あなたと共有してください:

C ++クラシックゲームの概要

JavaScriptクラシックゲームは常にプレイされています

古典的なJavaゲームの概要

JavaScriptクラシックゲームの概要

以上が本稿の内容ですので、皆様のご勉強に役立てていただければ幸いです。

Recommended Posts

Pythonは貪欲なヘビの二重の戦いを実現します
Pythonは戦車戦を実現
Pythonは推測ゲームを実現します
Pythonは単にスネークゲームを実装します
python3はマスク描画の機能を実現します
PythonはAI自動バージョンの貪欲なヘビを実装しています
Pythonは学生管理システムの開発を実現します
Pythonはスネークゲームのソースコードを実装しています
2.1 Pythonインタープリター(pythonインタープリター)
Pythonでタンクバトルゲームを実現|ドライポスト
Pythonでタンクバトルゲームを実現|ドライポスト
Pythonは宇宙船戦争を実現します
Pythonは写真のステッチを実現します
Pythonの基盤を統合する(2)
Pythonはオンライン翻訳を実現します