東所沢 と パソコン

東所沢近辺 と パソコンの覚書

python と スプライト

2019-09-05 17:27:56 | 日記
前回 オブジェクト指向を理解するため
ボールを動かすプログラムを作りました。
https://blog.goo.ne.jp/kawakawakawahiro_japan/e/76fa35b3361f8c43e6dd2302f32b8fd0


前回ボールのプログラムは、丸 の描画でしたが、今回
そのままプログラムをスプライトを動かしました。
前回は、描画のため、
当たり判定も、距離を計算して、衝突したかを計算したものでした。

今回の、1個目のプログラムは、前回の描画のプログラムを意識して、
スプライトを入れこんだだけです。
当たり判定も、スプライト独自のものは使っていません。
2個目のプログラムは、それぞれのスプライトを、グループ化(集合化、セット化)して、
当たり判定をスプライト独自の方法で確認しています。


戦車の絵を同じ階層において動かします。
tank.png に名前を変更します。


**************************************
もともと、Pythonを始めた理由は、自分の好きな戦車対戦ネットゲームを
自動化で解析できないかなと思ったのがきっかけです。
そのため、スプライトは戦車になっています。



*********** 1個目 *********************************************************
#スプライトを使う
import pygame
import random
import sys #終了の時に使う

WINDX = 500; WINDY = 500 # 画面サイズ

class Tank(pygame.sprite.Sprite):
def __init__(self,x,y,dx,dy):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("tank.png").convert()
self.image.set_colorkey((255,255,255)) #背景色 白
self.rect= self.image.get_rect()
self.rect.centerx= x
self.rect.centery= y
self.dx = dx
self.dy = dy

def update(self):
self.rect.centerx += self.dx
self.rect.centery += self.dy
if self.rect.centerx >= WINDX or self.rect.centerx < 0:
self.dx = -self.dx

if self.rect.centery >= WINDY or self.rect.centery < 0:
self.dy = -self.dy

def draw(self,screen):
screen.blit(self.image,self.rect)

def main():

pygame.init() # Pygameの初期化
screen = pygame.display.set_mode((WINDX, WINDY)) # 画面を生成

tank= list(range(10))

for a in range(10):
x= random.randrange(20,WINDX-20)
y= random.randrange(20,WINDY-20)
dx= random.randrange(-5,5)
dy= random.randrange(-5,5)
tank[a]= Tank(x,y,dx,dy) # クラス設定

endflag=0

while endflag ==0:
screen.fill((0,0,0)) # 画面を黒色
for a in range(10):
tank[a].update()
for b in range(10):
if a != b and (30**2) > (tank[b].rect.centerx -tank[a].rect.centerx)**2 + (tank[b].rect.centery - tank[a].rect.centery)**2:
tank[a].dx,tank[b].dx=tank[b].dx,tank[a].dx #多重代入 スピード入れ替え
tank[a].dy,tank[b].dy=tank[b].dy,tank[a].dy

tank[a].draw(screen)
pygame.display.flip()

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

pygame.quit()

if __name__ == "__main__":
main()






**************  2個目 ******************************************************
#クラスをリストにまとめる。
import pygame
import random
import sys #終了の時に使う

WINDX = 500; WINDY = 500 # 画面サイズ

class Tank(pygame.sprite.Sprite):
def __init__(self,x,y,dx,dy):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("tank.png").convert()
self.image.set_colorkey((255,255,255)) #背景色 白
self.rect= self.image.get_rect()
self.rect.centerx= x
self.rect.centery= y
self.dx = dx
self.dy = dy

def update(self):
self.rect.centerx += self.dx
self.rect.centery += self.dy
if self.rect.centerx >= WINDX or self.rect.centerx < 0:
self.dx = -self.dx

if self.rect.centery >= WINDY or self.rect.centery < 0:
self.dy = -self.dy

def draw(self,screen):
screen.blit(self.image,self.rect)

def main():

pygame.init() # Pygameの初期化
screen = pygame.display.set_mode((WINDX, WINDY)) # 画面を生成

tank= list(range(10))
tankall=set() #一括グループ準備
other= list(range(10))
for a in range(10):
other[a]=set() #相手と衝突用のグループ

for a in range(10):
x= random.randrange(20,WINDX-20)
y= random.randrange(20,WINDY-20)
dx= random.randrange(-5,5)
dy= random.randrange(-5,5)
tank[a]= Tank(x,y,dx,dy) # クラス設定
tankall.add(tank[a]) #一括グループ作成

for a in range(10):
for b in range(10):
if a != b:
other[a].add(tank[b]) #相手と衝突用のグループを作る

endflag=0
while endflag ==0:
screen.fill((0,0,0)) # 画面を黒色

for a in tankall:
a.update()

for a in range(10):
hitlist=pygame.sprite.spritecollide(tank[a],other[a],False) #衝突したらhitlistに入れる。
for b in hitlist:#衝突したらスプライトをbに入れる
b.dx=-1*b.dx
b.dy=-1*b.dy

for a in tankall:
a.draw(screen)
pygame.display.flip()

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

pygame.quit()

if __name__ == "__main__":
main()


コメント

python と オブジェクト指向

2019-08-31 11:16:48 | 日記
オブジェクト指向

すべての現実は、物であり、意味を持っている。
プログラムも同様に、意味を持った変数とする。
。。。らしいです。

オブジェクト指向は、
・流行っている。
・抽象的な言葉
・具体的意味が分かっている人が少ない。
という事から、
・結局、日本語で正確に言い表す事ができない。
という事かもしれません。

********************************

プログラムに置き換えて確認してみました。。

オブジェクト指向でない書き方の、ゲームの自分の座標設定:
myself_x = 100 myself_y = 100  と記号として置き換えるとすると、
オブジェクト指向は、myserlという意味を持たせた座標設定
myself.x myself.y     とするのがオブジェクト指向らしいです。

オブジェクト指向の方が断然楽なのはわかるのですが、
一度プログラムを作るだけだと、明確に
伝えるほど理解していないのかもしれません。

********************************





① オブジェクト指向でないプログラム


import pygame
from pygame.locals import *
import sys
import random

WINDX = 500; WINDY = 500 # 画面サイズ

def move(x,y,dx,dy):
x=x+dx # スピードX
if x < 10 or WINDX < x : dx =-1 * dx
y=y+dy # スピードy
if y < 10 or WINDY < y : dy =-1 * dy
return [x,y,dx,dy]

def main():
pygame.init() # Pygameの初期化
screen = pygame.display.set_mode((WINDX, WINDY)) # 大きさ1500*yyの画面を生成
myclock = pygame.time.Clock()
screen.fill((0,0,0)) # 画面を黒色に塗りつぶし

bax= list(range(10)) # x リスト作成
bay= list(range(10)) # y リスト作成
bdx= list(range(10)) # dxリスト作成
bdy= list(range(10)) # dyリスト作成
siz= list(range(10)) # sizeリスト作成
red= list(range(10)) # 赤リスト作成
gre= list(range(10)) # 緑リスト作成
blu= list(range(10)) # 青リスト作成
col= list(range(10)) # 赤緑青を入れるリスト作成
for a in range(10):
bax[a]= random.randrange(20,WINDX-20)
bay[a]= random.randrange(20,WINDY-20)
bdx[a]= random.randrange(-5,5)
bdy[a]= random.randrange(-5,5)
siz[a]= 20
red[a]= random.randrange(20,255)
gre[a]= random.randrange(20,255)
blu[a]= random.randrange(20,255)
col[a]= red[a],gre[a],blu[a]

for time in range(10000):
screen.fill((0,0,0)) # 画面を黒色に塗りつぶし
for a in range(10):

bax[a],bay[a],bdx[a],bdy[a] = move(bax[a],bay[a],bdx[a],bdy[a])

for b in range(10):

if a != b and (siz[a]+siz[b])**2 > (bax[b] - bax[a])**2 + (bay[b] - bay[a])**2:

bdx[a],bdx[b]=bdx[b],bdx[a] #多重代入 スピード入れ替え
bdy[a],bdy[b]=bdy[b],bdy[a]

pygame.draw.circle(screen,(col[a]),(int(bax[a]),int(bay[a])),siz[a])

pygame.display.update() # 画面を更新
pygame.display.flip()
endflag = 0

for event in pygame.event.get(): # イベント処理
if event.type == pygame.QUIT:# 閉じるボタンが押されたら終了
sys.exit() # Pygameの終了(画面閉じられる)


if __name__ == "__main__":
main()








② オブジェクト指向のプログラム


import pygame
import random
import sys #終了の時に使う

WINDX = 500; WINDY = 500 # 画面サイズ

class Ball:
def __init__(self,x,y,dx,dy,siz,col):
self.x = x;
self.y = y;
self.dx = dx;
self.dy = dy;
self.siz =siz;
self.col =col;

def move(self):
self.x=self.x+self. dx # スピードX
if self. x < 10 or WINDX < self.x : self.dx =-1 *self. dx
self.y=self.y+self.dy # スピードy
if self.y < 10 or WINDY < self.y : self.dy =-1 *self. dy



def main():
pygame.init() # Pygameの初期化
screen = pygame.display.set_mode((WINDX, WINDY)) # 大きさ1500*yyの画面を生成
myclock = pygame.time.Clock()
screen.fill((0,0,0)) # 画面を黒色に塗りつぶし
pygame.display.set_caption("object-oriented") # タイトルバーに表示する文字

ball= list(range(10)) # 配列は1個でよくなった

for a in range(10):
x= random.randrange(20,WINDX-20)
y= random.randrange(20,WINDY-20)
dx= random.randrange(-5,5)
dy= random.randrange(-5,5)
siz= 20
red= random.randrange(20,255)
gre= random.randrange(20,255)
blu= random.randrange(20,255)
col= red,gre,blu
ball[a]= Ball(x,y,dx,dy,siz,col) # クラス設定

for time in range(10000):
screen.fill((0,0,0)) # 画面を黒色 # 画面を黒色に塗りつぶし
for a in range(10):

ball[a].move()

for b in range(10):
if a != b and (ball[a].siz+ball[b].siz)**2 > (ball[b].x -ball[a].x)**2 + (ball[b].y - ball[a].y)**2:
ball[a].dx,ball[b].dx=ball[b].dx,ball[a].dx #多重代入 スピード入れ替え
ball[a].dy,ball[b].dy=ball[b].dy,ball[a].dy


pygame.draw.circle(screen,(ball[a].col),(int(ball[a].x),int(ball[a].y)),ball[a].siz)
pygame.display.update() # 画面を更新
pygame.display.flip()
endflag = 0

for event in pygame.event.get(): # イベント処理
if event.type == pygame.QUIT:# 閉じるボタンが押されたら終了
sys.exit() # Pygameの終了(画面閉じられる)

if __name__ == "__main__":
main()



コメント

Pythonと Xubuntu Lubuntu

2019-08-25 17:18:14 | 日記
Pythonのバージョンと Xubuntu Lubuntu

Xubuntu Lubuntu でPythonを動作させるとき、
Python のバージョンを気を付ける必要があります。
linux には、すでに、Python 2 と Python 3 が入っていて
ディフォルメの時は Python 2 で実行されます。

これが理解できなくて、ずっとプログラムが間違えているのだろうと思っていた頃があり、
しかたなくwindows でpython を実行していました。
なんだかんだ言って、linuxオンリーは、私のような素人には難しいのでwindowsとの併用は、欠かせません。
なお、ラズベリーパイでも同じくpython 2 が標準です。(たしか。)

自分でプログラムを作るときは、早いパソコンは必要ないので
プログラムの勉強は 軽量linuxの古いパソコンで実行するのがちょど良いです。

詳細

python のバージョン確認方法

ターミナルで python -V と入力すれば、python のバージョンを確認できます。
:~$ python -V
Python 2.7.12

この結果だと、python 3 はどこに行ったの? という感じです。
python3 -V や python2 -V と入力すればそれぞれのpythonのバージョンを確認できます。
:~$ python3 -V
Python 3.5.2
:~$ python2 -V
Python 2.7.12


同様にプログラムを実行する時(例:text.pyの実行)
python 3 text.py と実行します。

また、
pip (Pythonのパッケージを管理するためのツール)も
pip install numpy と入力すると
python ver2 でインストールされていまうので、
ver3 でインストールする時は
pip3 istall numpy と入力する必要があります。






コメント

清瀬ひまわりフェスティバル

2019-08-25 10:14:33 | 東所沢
2919年 清瀬ひまわりフェスティバルに行きました。
ひまわりといえば炎天下ですから、日差しが強いです。





清瀬で毎年行っているひまわりフェスティバル 10年ぶりに行きました。
武蔵の線の広告にも出ていて、ずいぶん盛大になっています。

東京とは思えない広大さです。




やぐらの上から

ひまわりは、日光と逆に向いているので、逆光です。

コメント

東所沢 ナムチャイ (/タイ料理)

2019-08-14 20:40:04 | 東所沢
東所沢には、『ここは本当に埼玉にいるのだろうか』
と、旅行に来ている感覚にを思わせるわせる場所が(個人的に)2か所あります。

1つ目は 東所沢駅近くの ”なごみの”
2つ目は、今回のタイトルの、所沢街道沿いの”ナムチャイ”です。

所沢から、所沢インターに向かって左側に見えるので、
すぐに気が付く場所にあります。

所沢街道は、飲食のチェーン店が並んでいる街道なので、気軽に入るにはちょっと勇気がいるかもしれません。
(幸楽苑のほうが、そりゃ入りやすいです。)

私は、2度ほど、タイに行った経験がありますが、アジアの感じが非常に出ていて、
エスニックの感じが所沢にいるのを忘れる、別世界です。(個人の感想)

入口のショーウインドウがエスクックを感じさせます。

エスクック料理屋はいくらでもあると思いますが、
広い店内を全部エスニックで、飾りをできるのは郊外ならではと思います。

味はこだわりがないので、自分はコメントできませんが、
雰囲気を味わえるのは、高くないと思います。
物珍しいのでお勧めです。




次回は柳瀬川花火と、 清瀬のひまわり畑をアップする予定です。





コメント