パーソナルブログメモリ

a = [1, 1]
for _ in "*" * 999: a += [sum(a[-2:])]
print(a)

プチコンBIGのプログラムをパソコンに転送してみる。

2017-09-20 | プチコン3、4、BIG
かつてモーゼはエジプトを脱出した。
それにならってWiiU内にあるプチコンBIGのソースリストを脱出させることにした。

旅は相当困難であった。
最初はデータを色画像として脱出させようとしたがjpgの謎圧縮に阻まれて
第8画像までは元の生活に戻ることはできなかった。
もう旅をやめようかと思ったが最後に1ドット1ビットの最低限の状態にしてみる。
画像ははじめて認識できる元の状態に戻った。

寝て起きたあとのプログラムがプログラマの旅にとって重要である。

モーゼが旅を終えた時、最初にしたかったことは「ただ眠る」に違いない。

----すみません 駄文は以上です。----

prg.jpg


すみませんグラフィックドライバの故障ではありません。


上記のプチコンBIGのプログラムでedit0にあるプログラムを画像化したものです。

(1)ソースの画像化
上記プログラムをプチコンBIG edit0以外から実行するとedit0のプログラムソースを画像化します。
(注854x30文字まで対応 utf-16からutf-8のため一部文字は文字化けするかも)

(2)画像化して投稿
パッド画面に同じような画像が表示された状態でhomeボタンを押してインターネットブラウザを開きます。
WiiU 画像投稿ツール https://i.nintendo.net/wiiu/を開きます。
(ブックマークに入ってました)
下画面をTumblrに投稿します。TwitterでもFacebookでも画像を854x480のサイズで取得できるならばOK
(下画面が重要)

(3)投稿画像を取得
原寸表示させた画面を保存 ファイル名はprg.jpgに変更

(4)画像からテキストに戻す
この画像をPython3 pygameを使ってプログラムに戻します。
実行場所にprg.jpgがあること。
下記プログラムを
$ python3 imagedec.py
で実行すると
text.txtに戻ります。

ubuntu16.04環境で作成しているのでwindowsだとファイル名の設定とかが少し違うかもしれません。


プログラムがIndexError: pixel index out of rangeを起こした場合は画像サイズが854x480かどうか確認してみてください。

imagedec.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import pygame
from pygame.locals import *

pygame.init()
window_size = (100, 100)
screen = pygame.display.set_mode(window_size)
img_map = pygame.image.load('prg.jpg')

gx = 0
gy = 0

def decode8():
    global gx
    global gy
    a = 0

    for i in range(8):
        col = img_map.get_at((gx, gy))
        if col.r>200:
            a=a+pow(2,(7-i))
        gx=gx+1
        if gx==854:
            gx=0
            gy=gy+1
    return a

def imgtotext():
    st=""
    for x in range(854*30):
        s=decode8()*0x100+decode8()
        if s>0:
            st=st+chr(s)
        #st=st+hex(decode8()*0x100+decode8())+" "
    f = open('text.txt', 'w')
    f.write(st)
    f.close()

imgtotext()

pygame.quit()
quit()



<参考文献>
Python: テキストファイルに書き込み – write()、writelines()メソッド
pythonゲームコーディング10時間目

サンプル画像

デコード後
-----------------------------------------------------------------------------------------------
DIM SX[20],SY[20]
DIM VSX[20],VSY[20]

DIM AX[20],AY[20],ALV[20],ADX[20],ADY[20]
DIM VAX[20],VAY[20]


GRIPS=-1

CX=0
CY=0
CDX=0
CDY=0
TIME=MILLISEC
OWARISW=0

GAME

DEF STARSET
 FOR  I=0 TO 19
  SPSET I,226
  @S
  SX[I]=RND(384)
  SY[I]=RND(224)
  FOR J=0 TO I-1
   IF DIST(SX[I]-SX[J],SY[I]-SY[J])<20 THEN GOTO @S
  NEXT
  SPOFS I,SX[I],SY[I]
 NEXT
END

DEF ALIENSET
 FILL ALV,1
 FOR  I=0 TO 19
  SPSET I+20,958
  SPCOLOR I+20,RGB(255,180,255)
  @S
  AX[I]=RND(384)
  AY[I]=RND(224)
  FOR J=0 TO I-1
   IF DIST(AX[I]-AX[J],AY[I]-AY[J])<20 THEN GOTO @S
  NEXT
  SPOFS I+20,AX[I],AY[I]
 NEXT
END

DEF ALIENMOVE
 FOR I=0 TO 19
  IF ALV[I]==0 THEN CONTINUE
  R=RND(10)
  IF R==0 THEN ADX[I]=1
  IF R==1 THEN ADX[I]=-1
  IF R==2 THEN ADY[I]=1
  IF R==3 THEN ADY[I]=-1
  AX[I]=AX[I]+ADX[I]
  AY[I]=AY[I]+ADY[I]
  AX[I]=MAX(0,MIN(AX[I],384))
  AY[I]=MAX(0,MIN(AY[I],224))
  IF R==5 THEN SPSET I+20,958+RND(10):SPCOLOR I+20,RGB(255,180,255)
  SPOFS I+20,AX[I],AY[I]
 NEXT
END


DEF GAME 
 @START
 ACLS

 TITLE

 CX=100
 CY=100
 CDX=0
 CDY=0
 'KEYでグリップ
 SPSET 100,464
 SPOFS 100,CX,CY
 SPCOLOR 100,RGB(256,220,180)
 @GAME
 TIME=MILLISEC
 OWARISW=0
 STARSET
 ALIENSET
 BWAIT

 WHILE 1
  B=BUTTON()
  IF B==0 THEN
   CDY=CDY+1
  ELSE
   IF B == #A THEN
    RNEARSTAR OUT N,D
    IF N==-1 THEN CDY=CDY+1:GOTO @PASS
    SPCOLOR N,RGB(255,0,0)
    CDY=0
    SWING N,D,-15
    SPCOLOR N,RGB(255,255,255)
   ENDIF 
   IF B == #B THEN 
    LNEARSTAR OUT N,D
    IF N==-1 THEN CDY=CDY+1:GOTO @PASS
    SPCOLOR N,RGB(255,0,0)
    CDY=0
    SWING N,D,15
    SPCOLOR N,RGB(255,255,255)
   ENDIF 
  ENDIF
  @PASS
  CX=CX+CDX
  CY=CY+CDY
  IF CDY>16 THEN CDY=16
  SPOFS 100,CX,CY
  IF CY>300 THEN CY=0
  IF CX<-300 THEN CX=600
  IF CX>700 THEN CX=-200
  ALIENMOVE
  WOMANKICK
  TIMEWRITE
  IF OWARISW==1 THEN GOTO @CLEAR
  WAIT 2
 WEND

 @CLEAR
 ENDTIME MILLISEC-TIME
 OFFWAIT
 BWAIT
 GOTO @START
END

DEF ENDTIME T
 FOR I=0 TO 300 STEP 2
  GCLS
  GPUTCHR 30,100,"TIME "+STR$(T),I+1,I+1
  IF I>100 AND BUTTON()!=0 THEN GOTO @E
  WAIT 1
 NEXT
 FOR I=300 TO 3 STEP -2
  GCLS
  GPUTCHR 30,100,"TIME "+STR$(T),I+1,I+1,RGB(60,60,60)
  IF BUTTON()!=0 THEN GOTO @E
  WAIT 1
 NEXT
 @E
 GCLS
 GPUTCHR 30,100,"TIME "+STR$(T),4,4,RGB(60,60,60)
  
END

DEF TIMEWRITE
 LOCATE 40,29:PRINT "TIME:";MILLISEC-TIME;
END

DEF SWING N,D,DT
 BEEP 12
 KX=SX[N]:KY=SY[N]
 WHILE 1
  R=ATAN(KY-CY,KX-CX)
  KAKU=R*180/PI()
  'IF KAKU<0 THEN KAKU=360+KAKU
  KAKU=KAKU+DT
  SPOFS 100,CX,CY
  CX=KX-COS(RAD(KAKU))*D
  CY=KY-SIN(RAD(KAKU))*D
  IF BUTTON()==0 THEN
   IF D==0 THEN CDX=0:CDY=0:RETURN
   IF D>10 THEN D=10
   CDX=-COS(RAD(KAKU+90*DT/15))*D
   CDY=-SIN(RAD(KAKU+90*DT/15))*D
   RETURN
  ENDIF
  ALIENMOVE
  WOMANKICK
  TIMEWRITE
  IF OWARISW==1 THEN RETURN
  WAIT 2
  VSYNC
 WEND
END

DEF BWAIT
 @S
 IF BUTTON()!=0 THEN RETURN
 GOTO @S
END

DEF OFFWAIT
 @S
 IF BUTTON()==0 THEN RETURN
 GOTO @S
END

DEF AWAIT
 @S
 IF BUTTON()==#A THEN RETURN
 GOTO @S
END

DEF NEARSTAR OUT R,BD
 BD=1000
 R=-1
 FOR I=0 TO 19
  D=DIST(SX[I]-CX,SY[I]-CY)
  IF D<BD THEN BD="D:R=I
" NEXT
 RETURN R 
END

DEF RNEARSTAR OUT R,BD
 BD="1000
" R="-1
" FOR I="0" TO 19
  IF SX[I]-CX<0 THEN CONTINUE
  D="DIST(SX[I]-CX,SY[I]-CY)
"  IF D<BD THEN BD="D:R=I
" NEXT
 RETURN R 
END

DEF LNEARSTAR OUT R,BD
 BD="1000
" R="-1
" FOR I="0" TO 19
  IF SX[I]-CX>0 THEN CONTINUE
  D=DIST(SX[I]-CX,SY[I]-CY)
  IF D<BD THEN BD="D:R=I
" NEXT
 RETURN R 
END


DEF DIST(DX,DY)
 RETURN SQR(DX*DX+DY*DY)
END

DEF WOMANKICK
 SW="0
" FOR I="0" TO 19
  IF ALV[I]==0 THEN CONTINUE
  IF DIST(CX-AX[I],CY-AY[I])<16 THEN BEEP 82,RND(2000):ALV[I]=0:SPCLR 20+I ELSE SW="1
" NEXT
 IF SW="=0" THEN OWARISW="1
END

DEF" TITLE
 FOR I="0" TO 300 STEP 2
  GCLS
  GPUTCHR 0,0,"STAR UMAN 3",I+1,I+1
  IF I>100 AND BUTTON()!=0 THEN GOTO @E
  WAIT 1
 NEXT
 FOR I=300 TO 3 STEP -2
  GCLS
  GPUTCHR 0,0,"STAR UMAN 3",I+1,I+1,RGB(60,60,60)
  IF BUTTON()!=0 THEN GOTO @E
  WAIT 1
 NEXT
 @E
 GCLS
 GPUTCHR 0,0,"STAR UMAN 3",4,4,RGB(60,60,60)
END

'1/2M*V*V
'MGH

DEF UNNUIWATCH VX,VY
'DIM SX[20],SY[20]
'DIM VSX[20],VSY[20]

'DIM AX[20],AY[20],ALV[20],ADX[20],ADY[20]
'DIM VAX[20],VAY[20]
 ARYOP #AOPSUB VSX,SX,VX
 ARYOP #AOPSUB VSY,SY,VY
 ARYOP #AOPSUB VAX,AX,VX
 ARYOP #AOPSUB VAY,AY,VY
 
 FOR I=0 TO 19
  SPOFS I,VSX[I],VSY[I]
  SPOFS I+20,VAX[I],VAY[I]
 NEXT 

END

-----------------------------------------------------------------------------------------------

最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。