Hatena::ブログ(Diary)

泣きながら覚えるSwift日記

2017-11-26

人工知能が問題なのだ_孫と遊ぶためのPython日記(17)

いつのまにかゲーム作りに夢中になり、そもそもの課題を忘れかけていた。
目指すのはゲーム作りではなく迷路問題だった。
ここで軌道を初心に戻すことにした。
色々学んでいると、迷路問題はプログラムの本質にふれることだと気がついた。
自分で判断して、正しい道を自分で判定することは人工知能そのものに違いない。
アルゴリズムを学ぶに従って奥が深い未知の世界に入り込んだことに気がつく。
解を求めることはこの難題にチャレンジすること、そのものだ。
そのためには、しばらくプログラムを離れてもっと基本を学ぶ必要がある。
f:id:yasui_swift:20171126150416j:image
立ち止まって考えてみると、おそらく人工知能への希求潜在的にあって迷路問題を解決したいと思い立ったのかもしれない。

迷路問題の解決は、経路の探索そのものである。

スタート地点(開始条件)、
ゴール地点(終了条件)、
中間地点(中間状態)、
どこからどこへ移動できるかの情報(各状態からどの状態に変化できるかという情報)、
各地点間の距離(状態変異のコスト)

迷路問題は解決のための条件やステップを一般的な言葉に置き換えるとこのようになる(「おうちで学べる人工知能のきほん」東中竜一郎著、翔泳社)を参照)。

本質は探索である。

探索の基本を理解するためには以下の基礎知識がどうしても必要だ。
・ランダムな検索
深さ優先探索
幅優先探索
・均一コスト探索
・A*(エースター)探索
・ビタビアルゴリズム
・最適性の原理
動的計画法

これはけっこう学び甲斐があるゾ。
f:id:yasui_swift:20171127081826j:image

2017-08-25

pygameで作った初めてのゲーム__孫と遊ぶためのPython日記(16)

学習の効果を検証するために初めてゲームを作成した。
初歩的なゲームだが学ぶことが多かった。
要点は何回かに分けて記載したい。
ゲームでは赤い爆弾がタンクのキャタピラを当たると得点できる。
このプログラムは田中賢一郎氏のcave.pyを参考にした。
〜〜〜 手順 〜〜〜
キャラクターはインターネットで検索し、背景を透明にしてpngフォルダーに保管。
キーボードの操作は初めにimportで記載。
赤い爆弾をキーボードのキーで操作できるようにする。
ゲームの終了条件を決める。ここではカウンターで時間を決めてある。
爆弾が当たると爆発が起きて得点する。
タンクは右から左にスクロールさせ、y座標位置は乱数で上下に動かす。
スコアは右肩、残り時間は左肩に表示する。
幼稚だが得点するのは結構難しい。
D

2017-08-23

pygameでアニメーション(2)サイン軌道を動かす_孫と遊ぶためのPython日記(15)

円軌道を修正してサインカーヴの軌道を動かすように変形。
D

〜〜〜〜サイン軌道を動かす 〜〜〜〜〜
円軌道のwihle True:以下を以下のように書き換える(インデントに注意。今回はコードを画像にして張り付けてみる。小さくてよく見えないなあ)
f:id:yasui_swift:20170823092024p:image:w640

胆は、この部分・・・、

#角度はラジアンで計算

GAMEN.fill(0xFFFFFF)
count += 1
rad = math.radians(count)

y = int(ratio*math.sin(rad))+ 300 #yの座標300を上下する
x = count #xの座標

#print(rad,x,y)

GAMEN.blit(image,(x,y))
pygame.display.update()

CLOCK.tick(50) #タイマー

#画面X軸の端720で原点0に戻るようにする
if count >= 720 :
count = 0

2017-08-22

pygameでアニメーション(1)円軌道を動かす_孫と遊ぶためのPython日記(14)

pygameの学習が少し進んだ。
pygameはゲーム作成用のモジュールで、GUIコードはtkinterとかなり違う。
どちらがよいのかわからないが、学習目的でしばらくチャレンジすることにした。
f:id:yasui_swift:20170822081945j:image
暗夜行路ですが・・・。一縷の光)

D

とりあえずイメージ・キャラクターを円軌道に動かすアニメーションを作成した。

〜〜〜〜〜smallRedMonster〜〜〜〜〜〜
#### 始めにモジュールのimport

import sys
import math
import pygame
from pygame.locals import QUIT

### pygame初期化
pygame.init()

### 画面の設定。ここでは600×600に設定
GAMEN = pygame.display.set_mode(ここにサイズを記入、(600、600))

### キャプションの表示
pygame.display.set_caption(ここに名前を記載、"smallRedMonster")

### クロックの設定はpygame.time.Clock()で行う
CLOCK = pygame.time.Clock()

### main routineを def main():と記述

def main(): ###以下、インデントが必要
""" main routine """
radius = 100
y_center = 300 ### 円の中心座標y
x_center = 300 ### 円の中心座標x

count = 0
a = 3.14/360
deg = 0
rad = 0

### キャラクターの呼び込み、コードと同じホルダーに記録が便利

image = pygame.image.load(ここで画像をロードする、"redmonster.png")

### 以下がキャラクターを動かすコード。以下すべてインデントが必要。

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

#角度はラジアンで計算

GAMEN.fill(0xFFFFFF)
count += a/3.14

rad += count

y = int(radius * math.sin(rad)) + y_center #yの座標
x = int(radius * math.cos(rad)) + x_center #xの座標

### 画面にimageを表示。blitを用いる。

GAMEN.blit(image,(x,y))
### 画面の初期化

pygame.display.update()
### タイム・ディレイの挿入

CLOCK.tick(50)
### 角度の初期化

if count >= 3.14/180 :
count = 0

### runで動かす場合の常套句、コードの最後に記載

if __name__ == '__main__':
main()

###

全体にアニメーションが簡単にできるようになっている。
tkinterよりも記載が単純で、直感的に理解しやすいかもしれない。

<注意>HATENAブログでは、インデントが表示できないので、これまではインデント部分には”___”で書いてきたが、みにくので今回からは省略することにした。

2017-07-26

アルゴリズムと行列式_孫と遊ぶためのPython日記(13)

迷路作りの暗中模索が続いている。
気がついたことがいくつかある。

まず、迷路を作ることは迷路の解法を考えることと同義であることに気がついた。
当たり前のことであるが、基本に帰り、しっかりとしたアルゴリズムこそがものづくりの基本であることに今更ながらに気がついたのである。

二つ目の気づきは迷路を作るには行列式が必要であることがわかったことだ。
この理由は結構難しい話になる。列と行で構成する迷路を考えていてたどり着いた。

そこで、また新たに参考書が増えた。
f:id:yasui_swift:20170726093326j:image
写真の田中賢一郎著の入門書はこれまでの教科書とはだいぶ違う。
ゲームを作るための入門書であるが、具体的な目的が掲げられていて、簡潔にコードが解説してある。

実はこの本買う前に同じ著者の、この本の続編とも言えるゲーム作りのための数学と物理の解説書を買ってしまった。
高校卒業以来実に50年ぶりにベクトル行列式を目にした。

いやあ、驚いた。
著者も書いているように、受験勉強以外にこんなものを使うことはないと思っていたが、まさかの再会である。
なんと!無駄なことを習っていたわけではないことが50年たってわかったのだ。

続編を読んで行くうちに基本となる本編が必要であることがわかり買い足した。
まだまだ道は遠いのである。
f:id:yasui_swift:20170726094735j:image

Connection: close