アフィリエイト広告を利用しています

広告

この広告は30日以上更新がないブログに表示されております。
新規記事の投稿を行うことで、非表示にすることが可能です。
posted by fanblog

2020年05月06日

pygame 壁ピンポン!!ゲーム

これまでのpygameスクリプを
少々きれいに書き直して、
「壁ピンポン」のゲームにしました。

#!usr/bin/env python3
#--*coding:utf-8*--
import pygame
from pygame.locals import*
import sys
import os

START,PLAY,GAMEOVER=(0,1,2) #3つのゲーム状態を0~2の数字に定義
SCR_RECT=Rect(0,0,480,640) #画面とする大きさを定義(左上位置(0,0,横軸幅と縦軸高x,y))
GAME_PLAYER_RECT=Rect(0,320,480,320) #動ける範囲は下半分だけにする

"""壁ピンポンをクラスで管理"""
class WallPingPong():
def __init__(self):
self.counter=0 #ゲーム内の時間を記録するカウンターを作成、初期値を0とする
self.score=0 #ゲーム内の得点を作成し、初期値を0とする
pygame.init()
screen=pygame.display.set_mode(SCR_RECT.size)
pygame.display.set_caption(u"壁ピンポン!!")
"""素材のロード"""
self.load_images()
"""ゲームオブジェクトを初期化"""
self.init_game()
clock=pygame.time.Clock()
"""メインループ開始"""
while True:
clock.tick(60)
self.update()
self.draw(screen)
pygame.display.update()
self.key_handler()
def init_game(self):
"""ゲームオブジェクトを初期化"""
#ゲーム状態
self.game_state=START
#ラケットを作成
self.racket=Racket()
#動く速度の異なる4つのボールを作成、引数は順に(vx,vy,self.racket)
self.ball1=Ball(10,10,self.racket)
self.ball2=Ball(3,4,self.racket)
self.ball3=Ball(-2,3,self.racket)
self.ball4=Ball(-6,3,self.racket)
#スプライトグループを作成して登録
self.group1=pygame.sprite.RenderUpdates()
self.group2=pygame.sprite.RenderUpdates()
self.group1.add(self.racket)
self.group2.add(self.ball1,self.ball2,self.ball3,self.ball4)
#作成した4つのボールを1つにグループ化し、後にpygame.sprites()のモジュールを利用
self.balls=pygame.sprite.Group(self.group2)
def update(self):
"""ゲーム状態の更新"""
if self.game_state==PLAY:
self.counter+=1
self.group1.update()
self.group2.update()
"""ゲームオーバーの条件"""
if len(self.balls.sprites())==0: #クループが格納しているオブジェクト(ボール)の数が0になったら
self.game_state=GAMEOVER #ゲームオーバーにする
#group1(racket格納)とgroup2(4つのボール格納)の接触を定義(Falseは接触しても消えずに残る、Trueにすると消える)
ball_collided=pygame.sprite.groupcollide(self.group1,self.group2,False,False)
"""得点が入る条件"""
if ball_collided: #接触したら
self.score+=10 #10点を追加
def draw(self,screen):
""""描画"""
screen.fill((0,180,0))
if self.game_state==START: #ゲームスタート画面
#title名を描画
title_font=pygame.font.SysFont(None,80)
title=title_font.render("Wall PingPong!!",True,(255,0,0))
screen.blit(title,((SCR_RECT.width-title.get_width())//2,100))
#PUSH STARTを描画
push_font=pygame.font.SysFont(None,40)
push=push_font.render("PUSH SPACE KEY",True,(0,0,0))
screen.blit(push,((SCR_RECT.width-push.get_width())//2,SCR_RECT.centery))
elif self.game_state==PLAY: #ゲームプレイ画面
pygame.draw.line(screen,(255,255,255),(0,320),(480,320),3) #中央に白線を引く
pygame.draw.ellipse(screen,(255,255,255),(140,220,200,200),5) #中央に円を引く
self.group1.draw(screen)
self.group2.draw(screen)
stat_font=pygame.font.SysFont(None,36)
stat=stat_font.render("Score:{:05d} Counter:{:05d}".format(self.score,self.counter),True,(255,0,0))
screen.blit(stat,(0,0))
elif self.game_state==GAMEOVER: #ゲームオーバー画面
#得点を表示
stat_font=pygame.font.SysFont(None,36)
stat=stat_font.render("Score:{:05d} Counter:{:05d}".format(self.score,self.counter),False,(255,0,0))
screen.blit(stat,(0,0))
#GAME OVERを描画
gameover_font=pygame.font.SysFont(None,80)
gameover=gameover_font.render("GAMEOVER",True,(0,0,0))
screen.blit(gameover,((SCR_RECT.width-gameover.get_width())//2,100))
#PUSH STARTを描画
push_font=pygame.font.SysFont(None,40)
push=push_font.render("PUSH SPACE KEY",True,(0,0,0))
screen.blit(push,((SCR_RECT.width-push.get_width())//2,SCR_RECT.centery))
#クレジットを描画
cresit_font=pygame.font.SysFont(None,20)
cresit=cresit_font.render("2020 by https://fanblogs.jp/aimyself/",True,(0,0,0))
screen.blit(cresit,((SCR_RECT.width-cresit.get_width())//2,600))
def key_handler(self):
"""キーハンドラー"""
for event in pygame.event.get():
if event.type==QUIT:
pygame.quit()
sys.exit()
elif event.type==KEYDOWN and event.key==K_ESCAPE:
pygame.quit()
sys.exit()
elif event.type==KEYDOWN and event.key==K_SPACE:
if self.game_state==START: #スタート画面でスペース押したら
self.game_state=PLAY
elif self.game_state==GAMEOVER: #ゲームオーバ画面でスペース押したら
self.score=0
self.counter=0
self.init_game() #ゲームを初期化して
self.game_state=PLAY #ゲーム状態をプレイにする
def load_images(self):
"""画像素材をpygame用に調整(def load_image:)して読み込む"""
Racket.image=load_image("racket.png")
Ball.image=load_image("ball.png")

class Racket(pygame.sprite.Sprite):
"""ラケット"""
speed=10 #移動速度
def __init__(self):
#imageとcontainersはmain()でセット
pygame.sprite.Sprite.__init__(self)
self.rect=self.image.get_rect()
self.rect.center=(SCR_RECT.width/2,SCR_RECT.height)
def update(self):
#押されているキーをチェック
pressed_keys=pygame.key.get_pressed()
#押されているキーに応じてラケットを移動
if pressed_keys[K_LEFT]:
self.rect.move_ip(-self.speed,0)
elif pressed_keys[K_RIGHT]:
self.rect.move_ip(self.speed,0)
elif pressed_keys[K_UP]:
self.rect.move_ip(0,-self.speed)
elif pressed_keys[K_DOWN]:
self.rect.move_ip(0,self.speed)
self.rect.clamp_ip(GAME_PLAYER_RECT)

class Ball(pygame.sprite.Sprite):
"""ボールの描画"""
def __init__(self,vx,vy,racket):
pygame.sprite.Sprite.__init__(self)
self.rect=self.image.get_rect()
self.rect.center=(SCR_RECT.width/2,10)
self.vy=vy
self.vx=vx
self.racket=racket
def update(self):
self.rect.move_ip(self.vx,self.vy)
if self.rect.left<0 or self.rect.right>SCR_RECT.width:
self.vx=-self.vx
if self.rect.top<SCR_RECT.top:
self.vy=-self.vy
if self.rect.colliderect(self.racket.rect) and self.vy>0:
self.vy=-self.vy
if self.rect.bottom>SCR_RECT.bottom:
self.kill()

def load_image(filename):
"""用意した画像をpygameで扱える形に変換する"""
image=pygame.image.load(filename).convert_alpha()
return image

if __name__=="__main__":
WallPingPong()



output.gif

posted by もう一人の自分 at 14:34| pygame

2020年04月29日

人工知能関係でお気に入り登録したwebページ一覧

PCは壊れるものなので、
人工知能関係でネットサーフィンして
興味をもったwebページのリストを
ブログに残しておきます。

ゼロからはじめるPython(34) OpenCVをインストールしてみよう | マイナビニュース
世界一いらない人工知能??OpenCVを用いたカワウソ分類器作成奮闘記 | Aidemy Blog
OpenCVの本当に動くインストール手順 - Qiita
OpenCVのカスケード分類器を自作して画像認識 | パソコン工房 NEXMAG
openCVで物体認識 by traincascade - Qiita
OpenCVで人数カウント 前編 - Qiita
RNN(LSTM)で藤井聡太と羽生善治と加藤一二三の将棋AI作ってみる~フルスクラッチで挑戦!! - Qiita
python2をpython3に変換する方法 - Qiita
物体検出についての歴史まとめ - Qiita
物体検出 | AI coordinator
TensorFlowによるももクロメンバー顔認識(前編) - Qiita
TensorFlowで画像認識「〇〇判別機」を作る - Qiita
Install TensorFlow 2
TensorFlow2.0でアニメキャラ識別 - Qiita
TensorFlow + Kerasでサルを分類できるのか試してみる(1) ~ 環境構築から学習まで
Python 3.x - Anacondaインストール後にconda install pythonでダウングレードした後の事象について|teratail
TensorBoardの使い方
TensorFlowでアニメゆるゆりの制作会社を識別する - kivantium活動日記
tensorboard 1.14.0 has requirement setuptools>=41.0.0, but youll have setuptools 39.1.0_人工智能_weixin_44179909的博客-CSDN博客
はじめてのニューラルネットワーク:分類問題の初歩  |  TensorFlow Core
任意のデータセットで画像認識 その1 ・ TensorFlow Docs
オリジナルの画像からデータセットを作成する方法 - 知的好奇心
将棋ゲーム 将皇(FLASH版) 新サイト

ゲームAI パターン

pygameで作ったスカッシュに
敵をつくり、非常に単純な動作を与えました。

右から左に動きながら、画面の端っこに着いたら、
折り返すだけです。

1回くらいしか、ボールを返せません。

#!usr/bin/env python3
#coding:utf-8
import pygame
from pygame.locals import*
import sys

SCR_RECT=Rect(0,0,480,640)

class BarSprite(pygame.sprite.Sprite):
def __init__(self,filename,x,y,vx,vy):
pygame.sprite.Sprite.__init__(self,self.containers)
self.image=pygame.image.load(filename).convert_alpha()
width=self.image.get_width()
height=self.image.get_height()
self.rect=Rect(x,y,width,height)
self.vx=vx
self.vy=vy
def update(self):
pressed_keys=pygame.key.get_pressed()
if pressed_keys[pygame.K_RIGHT]:
self.rect.move_ip(self.vx,self.vy)
if pressed_keys[pygame.K_LEFT]:
self.rect.move_ip(-self.vx,self.vy)
self.rect.clamp_ip(SCR_RECT)

class BallSprite(pygame.sprite.Sprite):
def __init__(self,filename,x,y,vx,vy,bar,enemy):
pygame.sprite.Sprite.__init__(self,self.containers)
self.image=pygame.image.load(filename).convert_alpha()
width=self.image.get_width()
height=self.image.get_height()
self.rect=Rect(x,y,width,height)
self.vy=vy
self.vx=vx
self.bar=bar
self.enemy=enemy
def update(self):
self.rect.move_ip(self.vx,self.vy)
if self.rect.left<0 or self.rect.right>SCR_RECT.width:
self.vx=-self.vx
if self.rect.top<SCR_RECT.top:
self.kill()
if self.rect.colliderect(self.bar.rect) or self.rect.colliderect(self.enemy.rect)>0:
self.vy=-self.vy
if self.rect.bottom>SCR_RECT.bottom:
self.kill()

class EnemySprite(pygame.sprite.Sprite):
def __init__(self,filename,x,y,vx,vy):
pygame.sprite.Sprite.__init__(self,self.containers)
self.image=pygame.image.load(filename).convert_alpha()
width=self.image.get_width()
height=self.image.get_height()
self.rect=Rect(x,y,width,height)
self.vy=vy
self.vx=vx
def update(self):
self.rect.move_ip(self.vx,self.vy)
#画面の端っこに着いたら折り返す
if self.rect.right>SCR_RECT.width or self.rect.left<0:
self.vx=-self.vx
self.rect.clamp_ip(SCR_RECT)

def main():
pygame.init()
screen=pygame.display.set_mode(SCR_RECT.size)
pygame.display.set_caption(u"トレーニング")

balls=pygame.sprite.Group()

group=pygame.sprite.RenderUpdates()
BarSprite.containers=group
EnemySprite.containers=group
BallSprite.containers=group,balls

bar=BarSprite("bar.png",240,600,10,0)
enemy=EnemySprite("bar.png",89,20,9,0)
ball1=BallSprite("ball.png",89,100,9,9,bar,enemy)
ball2=BallSprite("ball.png",340,100,-5,5,bar,enemy)
ball3=BallSprite("ball.png",90,150,-7,6,bar,enemy)
ball4=BallSprite("ball.png",0,100,-5,5,bar,enemy)
clock=pygame.time.Clock()

while True:
clock.tick(60)
screen.fill((0,0,0))
group.update()
group.draw(screen)
pygame.display.update()

if len(balls.sprites())==0:
main()

for event in pygame.event.get():
if event.type==QUIT:sys.exit()

if __name__=="__main__":
main()

2020年04月27日

pygame スプライトグループによる表現

Pythonでゲーム作りますが何か? - 人工知能に関する断創録を参考に

pygameによる描画に改良を加えました。


#!usr/bin/env python3
#coding:utf-8
import pygame
from pygame.locals import*
import sys

SCR_RECT=Rect(0,0,480,640)

class BarSprite(pygame.sprite.Sprite):
def __init__(self,filename,x,y,vx,vy):
pygame.sprite.Sprite.__init__(self,self.containers)
self.image=pygame.image.load(filename).convert_alpha()
width=self.image.get_width()
height=self.image.get_height()
self.rect=Rect(x,y,width,height)
self.vx=vx
self.vy=vy
def update(self):
pressed_keys=pygame.key.get_pressed()
if pressed_keys[pygame.K_RIGHT]:
self.rect.move_ip(self.vx,0)
if pressed_keys[pygame.K_LEFT]:
self.rect.move_ip(-self.vx,0)
if pressed_keys[pygame.K_UP]:
self.rect.move_ip(0,-self.vy)
if pressed_keys[pygame.K_DOWN]:
self.rect.move_ip(0,self.vy)
self.rect.clamp_ip(SCR_RECT)

class BallSprite(pygame.sprite.Sprite):
def __init__(self,filename,x,y,vx,vy,bar,score_board):
pygame.sprite.Sprite.__init__(self,self.containers)
self.image=pygame.image.load(filename).convert_alpha()
width=self.image.get_width()
height=self.image.get_height()
self.rect=Rect(x,y,width,height)
self.vy=vy
self.vx=vx
self.bar=bar
self.score_board=score_board
self.hit=1
def update(self):
self.rect.move_ip(self.vx,self.vy)
if self.rect.left<0 or self.rect.right>SCR_RECT.width:
self.vx=-self.vx
if self.rect.top<SCR_RECT.top:
self.vy=-self.vy
if self.rect.colliderect(self.bar.rect)>0:
self.vy=-self.vy
self.score_board.add_score(self.hit*10)
if self.rect.bottom>SCR_RECT.bottom:
self.kill()

class ScoreBoard():
def __init__(self):
self.sysfont=pygame.font.SysFont(None,int(SCR_RECT.width/6))
self.score=0
def draw(self,screen):
score_img=self.sysfont.render(str(self.score), True, (255,255,0))
x = SCR_RECT.left
y = SCR_RECT.top
screen.blit(score_img,(x,y))
def add_score(self,x):
self.score = self.score+x


def main():
pygame.init()
screen=pygame.display.set_mode(SCR_RECT.size)
pygame.display.set_caption(u"トレーニング")

balls=pygame.sprite.Group()

group=pygame.sprite.RenderUpdates()
BarSprite.containers=group
BallSprite.containers=group,balls

score_board=ScoreBoard()

bar=BarSprite("bar.png",240,600,10,10)

ball1=BallSprite("ball.png",89,100,9,9,bar,score_board)
ball2=BallSprite("ball.png",340,100,-5,5,bar,score_board)
ball3=BallSprite("ball.png",90,150,-7,6,bar,score_board)
ball4=BallSprite("ball.png",0,100,-5,5,bar,score_board)


clock=pygame.time.Clock()

while True:
clock.tick(60)
screen.fill((0,180,0))
pygame.draw.line(screen,(255,255,255),(0,320),(480,320))
group.update()
group.draw(screen)

score_board.draw(screen)
pygame.display.update()

if len(balls.sprites())==0:
main()

for event in pygame.event.get():
if event.type==QUIT:sys.exit()

if __name__=="__main__":
main()

bar_A.png
ball.png
Screenshot from 2020-04-29 11-15-28.png
posted by もう一人の自分 at 21:14| pygame

2020年03月28日

pygameで画面表示

開発環境(root環境)
・Ubuntu 18.04
・python 3.7.6
・pygame 1.9.6


自分のコピー人形にビデオゲームを遊ばせられたらと思いました。

まずは、簡易なゲームを作ります。
#coding:utf-8

import pygame
import sys
import os

pygame.init()

# 画面の作成
SCREEN_SIZE=(640,480)
screen=pygame.display.set_mode(SCREEN_SIZE)
caption=pygame.display.set_caption("pingball")

barImg_A=pygame.image.load("./char_img/bar_A.png").convert_alpha()
barImg_B=pygame.image.load("./char_img/bar_B.png").convert_alpha()
ballImg=pygame.image.load("./char_img/ball.png").convert_alpha()
barImg_A_rect=barImg_A.get_rect()
barImg_A_rect.center=(50,220)
barImg_B_rect=barImg_B.get_rect()
barImg_B_rect.center=(590,0)
colorkey=ballImg.get_at((0,0))
ballImg_rect=ballImg.get_rect()


vx=vy=3
bx=by=3
ax=ay=3
clock = pygame.time.Clock()

#フォントの作成
sysfont=pygame.font.SysFont(None,24)
#テキスト(点数表示)
i=0
j=0
score=sysfont.render(str(i),True,(255,255,255))

# タイトル画面
while j==0:
title=sysfont.render("PUSH ENTER BOTTON",True,(255,255,255))

screen.fill((0,0,0))
screen.blit(title,(240,340))

pygame.display.update()

clock.tick(600)
for event in pygame.event.get():
if event.type==pygame.QUIT:
sys.exit()
if event.type==pygame.KEYUP and event.key==pygame.K_RETURN:
j=1

while j==1:

while ballImg_rect.right>0:

clock.tick(120) #一秒間に描くフレームの数を120コマに設定

barImg_A_rect.clamp_ip(0,0,640,480)

score=sysfont.render(str(i),True,(255,255,255))

pressed_keys=pygame.key.get_pressed()
if pressed_keys[pygame.K_UP]:
barImg_A_rect.move_ip(0,-ay)
if pressed_keys[pygame.K_DOWN]:
barImg_A_rect.move_ip(0,ay)

ballImg_rect.move_ip(vx,vy)
barImg_B_rect.move_ip(0,vy)


if barImg_B_rect.top <0 or barImg_B_rect.bottom>480:
by= -by
if ballImg_rect.right>590:
vx= -vx
if ballImg_rect.colliderect(barImg_A_rect) >0:
vx= -vx
i=i+1
if ballImg_rect.top < 0 or ballImg_rect.bottom >480:
vy= -vy

if ballImg_rect.right<=0:
sys.exit()


screen.fill((0,0,0))
screen.blit(score,(20,20))
screen.blit(barImg_A,barImg_A_rect)
screen.blit(barImg_B,barImg_B_rect)
screen.blit(ballImg,ballImg_rect)

pygame.display.update()

for event in pygame.event.get():
if event.type==pygame.QUIT:
sys.exit()

if ballImg_rect.right<=0:
sys.exit()


Screenshot from 2020-04-03 21-22-04.png
posted by もう一人の自分 at 17:59| pygame

2020年03月22日

アクアリウム(熱帯魚水槽)の飼育管理(接続構成図)

自分でサーバーを立てずに、
外部サーバーを2つ利用しました。

1つはXreaサーバーです。

XREA Free(無料プラン)を利用しました。
月額 無料
容量 1GB
マルチドメイン ◯
転送量 1GB/日
WordPress 利用可
チャットサポート ◯
お試し期間 ー
広告 あり

次に、
webサーバーからの入力(給餌等の指令)をどのようにさばくかです。

難関でした。ひねり出したアイデアは、
webサーバーからの入力(指令)を、メールとしてGmailサーバーへ送ることでした。
そのGmailサーバーに、ラズパイ3から毎分アクセスし、
メール(指令)の受信確認をします。

給餌指令メールが入っていれば、給餌します。
撮影指令メールが入っていれば、撮影し、XREAサーバーへアップします。

上記を構成する図を示しました。

ネット図.jpg



「https://sozai.cman.jp/」の素材を利用させていただきました。

アクアリウム(熱帯魚水槽)の飼育管理(webページ)

実装した機能(給餌や観察)

を実行するwebページを紹介します。

2020-03-22_LI.jpg

xreaサーバー(1GB)を利用し、自前のwebサーバーは立てていません。

というのも、集合住宅全体で契約しているネット環境を利用しているため、

ポートを自由に開放閉鎖することができませんでした。


そこで、色々考え、各機器を接続してみたので、次回にご紹介します。

2020年03月21日

アクアリウム(熱帯魚水槽)の飼育管理

世の中には、

水槽を管理するIoTがすでにあります。

私事ですが小さな水槽で熱帯魚(エンゼルフィッシュ1、バルーンモーリー3、ブッシープレコ3)

を飼っています。

興味があったので、

なるべくお金をかけないで楽しむをコンセプトに

水槽および水槽を管理するIoTを

部品を買う、アプリを揃える、スクリプト組む、

でDIY(Do It Yourself)してみました。
output.gif
(餌を自動で与えています)

下記が実装した中身です(ラズパイ3+グローバルIPアドレス無しの無線Lan環境)
==============================================
1.5分毎に水温を記録する
2.5分毎に気温を記録する
3.5分毎にCPU温度(マイコン)を記録する
4.5分毎に水位レベルを記録する
5.5分毎に水槽の写真を撮る
6.8時から15時の間に1時間ごとに30秒の動画を撮る
7.7時から14時の間に1時間ごとに給餌(エサの入った瓶を8回振る)する
 (その際には、「餌あげるよー。」と音声がでる)
8.上記1~6までを無料webにて表、グラフ、写真、動画でいつでも確認できるようにする
9.上記5~7についてはweb上でボタンを押せば実行できるようにする
10.1~4はデータベースに保存を続けていく
==============================================
せっかく作ったので、作成過程を記録しておこうと思いました。

1~10について、順次、掲載予定です。

まずは、ご紹介まで。

2020年03月15日

その15 fswebcamのインストールと監視カメラ代わり

開発環境(root環境)
・Ubuntu 18.04
・Apache 2.4.29
追加機能
・fswebcam 20140113


webサーバーを立てている。

つまり、PCの電源入れっぱなしなので、

せっかくだから、不在時の部屋の防犯カメラ代わりにしようと、

簡易な撮影アプリをインストールしました。

$ sudo apt install fswebcam

こちらに、

きれいに撮影するためのコツが紹介されています。


あとは、

$ crontab -e

で下記を追加し、毎分撮影するようにしました。

*/1 * * * * fswebcam -i 0 -d v4l2:/dev/video0 -F1 -S10 -r 640x480 --jpeg 85 test.jpg


2020年03月14日

その14 pygameのインストール

開発環境(root環境)
・Ubuntu 18.04
・python 3.7.6
・conda 4.8.2
・opencv 4.2.0
・tensorflow 2.1.0
追加機能
・pygame 1.9.6

$ pip install pygame

でインストールです。
検索

私が見た動画紹介コーナー

素敵です

プロフィール
もう一人の自分さんの画像
もう一人の自分
好きなことを仕事にしなかった
プロフィール
最新記事
カテゴリーアーカイブ
ファン
写真ギャラリー
×

この広告は30日以上新しい記事の更新がないブログに表示されております。