スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Python クラス作成

http://shonen9th.blog.fc2.com/blog-entry-51.html

ここに載せた簡単なシューティングゲームをクラスを使ったソースコードに書き換えた。
playershottimeの挙動が変わっていますが、他に変化は無いはず。


関数名や変数名を「__func」のようにするとカプセル化(private、外部から参照不可)できるそうです。使いませんでしたが。

「def func(self,prm1,prm2)」のように、selfが付いています。本来ならば、
classname.func(classval,prm1,prm2)
と呼び出す必要があるのですが、
classval.func(prm1,prm2)
とも記述することが可能。こちらの方が慣れ親しんでいるはずなので、大抵はこちらを採用。
実はhsp3の#modfuncも、これに似た形に展開されるし、上に似た形式で呼び出す必要がある。


公式のチュートリアルがselfだったから、selfという名前にしているだけであって、もっと読みやすい名前にすべきだったかも。


EnemyBulletクラスとPlayerBulletクラスの中身は大差ないので統合すべきだった。
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pygame
from pygame.locals import *
import sys

import random
import math

class Player:
def __init__(self,x,y):
self.x = x
self.y = y
self.shottime = 0
def control(self,key,bullet):
if key[K_LEFT] and 0 < self.x:
self.x -= 4
if key[K_RIGHT] and self.x < 320:
self.x += 4
if key[K_UP] and 0 < self.y:
self.y -= 4
if key[K_DOWN] and self.y < 480:
self.y += 4
if key[K_SPACE] and self.shottime <= 0:
self.shottime = 40
bullet.append(PlayerBullet(self.x,self.y))
self.shottime -= 1
def get_dist2(self,tx,ty):
return (self.x-tx)*(self.x-tx)+(self.y-ty)*(self.y-ty)

class Enemy:
def __init__(self,x,y,type):
self.x = x
self.y = y
self.type = type
self.time = 0
self.rnd = random.uniform(-1,1)
def action(self,bullet,player):
if self.type == 0:
self.y += 2
if self.time%60 == 40 and self.y<player.x:
bullet.append(EnemyBullet(self.x,self.y,math.atan2(player.y-self.y,player.x-self.x),4.0))
if self.type == 1:
if self.time < 60:
self.y += 3.5
else:
self.x += 2 if self.rnd<0 else -2
if self.time%60 == 10:
bullet.append(EnemyBullet(self.x, self.y, math.atan2(player.y-self.y,player.x-self.x),4.0))
bullet.append(EnemyBullet(self.x, self.y, math.atan2(player.y-self.y,player.x-self.x)+math.pi/6,4.0))
bullet.append(EnemyBullet(self.x, self.y, math.atan2(player.y-self.y,player.x-self.x)-math.pi/6,4.0))
if self.type == 2:
self.x += 2.0 * math.sin(self.rnd)
self.y += 2.0 * math.cos(self.rnd)
if (self.x<5 or 315<self.x):
self.rnd = -self.rnd
if self.time%60 == 40 and self.y<player.y:
bullet.append(EnemyBullet(self.x,self.y, math.atan2(player.y-self.y,player.x-self.x),4.0))
if self.type == 3:
self.y += 5
if self.time%22 == int(10+5*self.rnd):
bullet.append(EnemyBullet(self.x,self.y,0.0,2.5))
bullet.append(EnemyBullet(self.x,self.y,math.pi,2.5))
self.time += 1
def get_dist2(self,tx,ty):
return (self.x-tx)*(self.x-tx)+(self.y-ty)*(self.y-ty)

class PlayerBullet:
def __init__(self,x,y):
self.x = x
self.y = y
def action(self):
self.y -= 9

class EnemyBullet:
def __init__(self,x,y,angle,speed):
self.x = x
self.y = y
self.angle = angle
self.speed = speed
def action(self):
self.x += self.speed * math.cos(self.angle)
self.y += self.speed * math.sin(self.angle)


pygame.init()
screen = pygame.display.set_mode((480,480))

pygame.display.set_caption(u"Hello")

random.seed();

clock = pygame.time.Clock()

font = pygame.font.SysFont(None, 20)

gamestatus = 1 # started

player = Player(160,400)

enemy = list()
playerbullet = list()
enemybullet = list()

score = 0

frame = 0
while True:
screen.fill((0,128,255))

keys = pygame.key.get_pressed()

pygame.display.set_caption(u"Hello "+str(frame))

# input
if gamestatus == 1:
player.control(keys,playerbullet)

# enemy generator
if gamestatus == 1:
if frame % 100 == 30:
enemy.append(Enemy(random.uniform(10,310),-30.0,random.randint(0,3)))

# player bullet update
for bl in playerbullet:
pygame.draw.circle(screen,(255,255,0),(int(bl.x),int(bl.y)),8)
bl.action()
for em in enemy:
if em.get_dist2(bl.x,bl.y)<256:
enemy.remove(em)
score += 100
if bl.y < -20:
playerbullet.remove(bl)

# enemy bullet update
for bl in enemybullet:
pygame.draw.circle(screen,(255,0,0),(int(bl.x),int(bl.y)),8)
bl.action()
dist = player.get_dist2(bl.x,bl.y)
if dist<224:
gamestatus = 2 # gameover
if dist<2000 and gamestatus == 1:
score += 3
if (bl.x<-20 or 340<bl.x or bl.y<-50 or 500<bl.y):
enemybullet.remove(bl)

#enemy update
for em in enemy:
pygame.draw.rect(screen,(255,128,0),pygame.Rect(em.x-15,em.y-15,30,30))
em.action(enemybullet,player)
if (em.x<-20 or 340<em.x or em.y<-50 or 500<em.y):
enemy.remove(em)

# player draw
if gamestatus == 1:
pygame.draw.rect(screen,(255,255,0),pygame.Rect(player.x-15,player.y-15,30,30))

# UI
pygame.draw.rect(screen,(0,0,0),pygame.Rect(320,0,160,480))
screen.blit(font.render("Score:"+str(score), True, (255,255,255)),(330,50))

clock.tick(60)
frame +=1

pygame.display.update()

for event in pygame.event.get():
if event.type == QUIT:
sys.exit()
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

tag : Python

コメントの投稿

非公開コメント

ブログ移転のお知らせ
ブログをshonen.hateblo.jpに移転します. 新規の記事はこちらに投稿します.
プロフィール

舞葉(ぶよう)

Author:舞葉(ぶよう)
github.io
はてなブログ(競プロ)

古い記事のソースコードは色分けしていないので、高機能テキストエディタに貼り付けたほうが見やすいかも。

検索フォーム
このブログについて
自分がつまづいた話題、なんとなく書きたいと思ったこと、ググったけど殆ど資料なかったぞオイ な話等をアップする予定。通りすがりでも、参考になっていただければと。プログラムの例外入力、メモリリークは責任負いません。投稿された記事は修正・削除する場合があります。
カテゴリ
タグ

HSP3アルゴリズムとデータ構造c++RubyJavaUnity画像解析C機械学習C#LinuxcodeIQKinectMinecraftTonyuSystemraspberrypiPythonHTML5音声制御Simulinkruby俺ルール通信制御Javascriptシミュレーション

counter-shinobi
固定記事
最新記事
最新コメント
月別アーカイブ
ブロとも申請フォーム

この人とブロともになる

アクセスランキング
[ジャンルランキング]
コンピュータ
995位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
199位
アクセスランキングを見る>>
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。