質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1048閲覧

forループを使ってコードをまとめたい

kappar

総合スコア12

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/06/18 02:20

編集2020/06/18 03:03

前提・実現したいこと

python(pygame)を使って、簡単なゲームのようなものを作っています。
キー押しで〇が左右に動き、道の間を走らせるようなゲームです。
コードが長くわかりにくいため、forループを使ってまとめようとしています。

発生している問題・エラーメッセージ

forループ(というよりリスト?)の使い方に問題があるのか、
while文中の6行目(全体の50行目)の
「pygame.draw.line (screen, WHITE, st_right, en_right)」に対して
以下のメッセージが表示されます。

whileに入る前にスタート位置は示しているつもりです…。
どこに問題があるのか教えていただけると幸いです。

Invalid start position argument

該当のソースコード

python

1import pygame 2from pygame.locals import * 3import sys 4import time 5import datetime as dt 6import random 7import numpy as np 8 9now=dt.datetime.now() 10date = now.strftime('%Y%m%d-%H%M%S') 11'output_{}.txt'.format(date) 12 13start=time.time() 14 15BLACK = (0, 0, 0) 16RED = (255, 0, 0) 17WHITE = (255, 255, 255) 18 19pygame.init() #初期化 20screen = pygame.display.set_mode((640, 500)) #画面サイズ 21myclock = pygame.time.Clock() 22myclock.tick(30) 23pygame.display.flip() 24 25ys=[450] #Lineの各点のy座標 26for _ in range(14): 27 ys.append(ys[-1]-50) 28 29velocity_y=5 #Lineの動く速さ 30 31xs = [random.randint(0,590)] #Lineの各点のx座標 32for _ in range(10): 33 xs.append( 34 random.randint(max(0, xs[-1]-50), min(590, xs[-1]+50)) 35 ) 36 37x = xs[1]+25 #circleの初期位置指定 38 39st_right=[xs[+1]+50,ys[+1]] #Lineの右側の線のstart座標, Lineの太さは50 40en_right=[xs[+0]+50,ys[+0]] #Lineの右側の線のend座標, Lineの太さは50 41st_left=[xs[+1],ys[+1]] #Lineの右側の線のstart座標 42en_left=[xs[+0],ys[+0]] #Lineの右側の線のend座標 43 44 45while True: 46 process_time=time.time()-start 47 time.sleep(0.1) 48 ys=np.array(ys) + velocity_y #Lineの各点のy座標+速さ 49 screen.fill(BLACK) 50 pygame.draw.line (screen, WHITE, st_right, en_right) 51 for _ in range(11): #Lineの右側の線 52 st_right.append(st_right) 53 en_right.append(en_right) #最初の線以外,enの座標は1つ前のstの座標と同じ 54 pygame.draw.line (screen, WHITE, st_left, en_left) 55 for _ in range(11): 56 st_left.append(st_left) 57 en_left.append(en_left) #最初の線以外,enの座標は1つ前のstの座標と同じ 58 pygame.draw.circle(screen, RED, (x, 400), 5) #円 59 pygame.display.update() 60 for event in pygame.event.get(): 61 if event.type==pygame.QUIT: 62 pygame.quit() 63 sys.exit() 64 pressed_key=pygame.key.get_pressed() 65 if (pressed_key[K_LEFT] and x>0): 66 x -= 5 67 if (pressed_key[K_RIGHT] and x<640): 68 x += 5 69 if pressed_key[K_ESCAPE]: 70 pygame.quit() 71 sys.exit() 72 if time.time()-start>120: 73 pygame.quit() 74 sys.exit() 75

試したこと

短縮前のコードがこちらです。

python

1import pygame 2from pygame.locals import * 3import sys 4import time 5import datetime as dt 6import random 7 8now=dt.datetime.now() 9date = now.strftime('%Y%m%d-%H%M%S') 10'output_{}.txt'.format(date) 11 12start=time.time() 13 14BLACK = (0, 0, 0) 15RED = (255, 0, 0) 16WHITE = (255, 255, 255) 17 18pygame.init() #初期化 19screen = pygame.display.set_mode((640, 500)) #画面サイズ 20myclock = pygame.time.Clock() 21myclock.tick(30) 22pygame.display.flip() 23 24pos_2y=380 #1本目 25pos_3y=500 26pos_4y=380 27pos_5y=500 28pos_6y=330 #2本目 29pos_7y=380 30pos_8y=330 31pos_9y=380 32pos_10y=280 #3本目 33pos_11y=330 34pos_12y=280 35pos_13y=330 36pos_14y=230 #4本目 37pos_15y=280 38pos_16y=230 39pos_17y=280 40pos_18y=180 #5本目 41pos_19y=230 42pos_20y=180 43pos_21y=230 44pos_22y=130 #6本目 45pos_23y=180 46pos_24y=130 47pos_25y=180 48pos_26y=80 #7本目 49pos_27y=130 50pos_28y=80 51pos_29y=130 52pos_30y=30 #8本目 53pos_31y=80 54pos_32y=30 55pos_33y=80 56pos_34y=-20 #9本目 57pos_35y=30 58pos_36y=-20 59pos_37y=30 60pos_38y=-70 #10本目 61pos_39y=-20 62pos_40y=-70 63pos_41y=-20 64pos_42y=-120 #11本目 65pos_43y=-70 66pos_44y=-120 67pos_45y=-70 68pos_46y=-170 #12本目(これで一周) 69 70velocity_y=5 71 #速さ1にした&45度だから1ずつ動く 72 73x99=random.randint(10,590) 74x100=random.randint(max(0,x99-50), min(590,x99+50)) 75x101=random.randint(max(0,x100-50), min(590,x100+50)) 76x102=random.randint(max(0,x101-50), min(590,x101+50)) 77x103=random.randint(max(0,x102-50), min(590,x102+50)) 78x104=random.randint(max(0,x103-50), min(590,x103+50)) 79x105=random.randint(max(0,x104-50), min(590,x104+50)) 80x106=random.randint(max(0,x105-50), min(590,x105+50)) 81x107=random.randint(max(0,x106-50), min(590,x106+50)) 82x108=random.randint(max(0,x107-50), min(590,x107+50)) 83x109=random.randint(max(0,x108-50), min(590,x108+50)) 84 85x = x99+25 86 87while True: 88 process_time=time.time()-start 89 time.sleep(0.1) 90 pos_2y+=velocity_y 91 pos_3y+=velocity_y 92 pos_4y+=velocity_y 93 pos_5y+=velocity_y 94 pos_6y+=velocity_y 95 pos_7y+=velocity_y 96 pos_8y+=velocity_y 97 pos_9y+=velocity_y 98 pos_10y+=velocity_y 99 pos_11y+=velocity_y 100 pos_12y+=velocity_y 101 pos_13y+=velocity_y 102 pos_14y+=velocity_y 103 pos_15y+=velocity_y 104 pos_16y+=velocity_y 105 pos_17y+=velocity_y 106 pos_18y+=velocity_y 107 pos_19y+=velocity_y 108 pos_20y+=velocity_y 109 pos_21y+=velocity_y 110 pos_22y+=velocity_y 111 pos_23y+=velocity_y 112 pos_24y+=velocity_y 113 pos_25y+=velocity_y 114 pos_26y+=velocity_y 115 pos_27y+=velocity_y 116 pos_28y+=velocity_y 117 pos_29y+=velocity_y 118 pos_30y+=velocity_y 119 pos_31y+=velocity_y 120 pos_32y+=velocity_y 121 pos_33y+=velocity_y 122 pos_34y+=velocity_y 123 pos_35y+=velocity_y 124 pos_36y+=velocity_y 125 pos_37y+=velocity_y 126 pos_38y+=velocity_y 127 pos_39y+=velocity_y 128 pos_40y+=velocity_y 129 pos_41y+=velocity_y 130 pos_42y+=velocity_y 131 pos_43y+=velocity_y 132 pos_44y+=velocity_y 133 pos_45y+=velocity_y 134 pos_46y+=velocity_y 135 screen.fill(BLACK) 136 st1=(x99+50, pos_2y) 137 en1=(x99+50, pos_3y) 138 pygame.draw.line (screen, WHITE, st1, en1) 139 st2=(x99, pos_4y) 140 en2=(x99, pos_5y) 141 pygame.draw.line (screen, WHITE, st2, en2) 142 st3=(x100+50, pos_6y) 143 en3=(x99+50, pos_7y) 144 pygame.draw.line (screen, WHITE, st3, en3) 145 if(pos_6y>=500): 146 pos_6y=-50 147 pos_7y=0 148 st4=(x100, pos_8y) 149 en4=(x99, pos_9y) 150 pygame.draw.line (screen, WHITE, st4, en4) 151 if(pos_8y>=500): 152 pos_8y=-50 153 pos_9y=0 154 st5=(x101+50, pos_10y) 155 en5=(x100+50, pos_11y) 156 pygame.draw.line (screen, WHITE, st5, en5) 157 if(pos_10y>=500): 158 pos_10y=-50 159 pos_11y=0 160 st6=(x101, pos_12y) 161 en6=(x100, pos_13y) 162 pygame.draw.line (screen, WHITE, st6, en6) 163 if(pos_12y>=500): 164 pos_12y=-50 165 pos_13y=0 166 st7=(x102+50, pos_14y) 167 en7=(x101+50, pos_15y) 168 pygame.draw.line (screen, WHITE, st7, en7) 169 if(pos_14y>=500): 170 pos_14y=-50 171 pos_15y=0 172 st8=(x102, pos_16y) 173 en8=(x101, pos_17y) 174 pygame.draw.line (screen, WHITE, st8, en8) 175 if(pos_16y>=500): 176 pos_16y=-50 177 pos_17y=0 178 st9=(x103+50, pos_18y) 179 en9=(x102+50, pos_19y) 180 pygame.draw.line (screen, WHITE, st9, en9) 181 if(pos_18y>=500): 182 pos_18y=-50 183 pos_19y=0 184 st10=(x103, pos_20y) 185 en10=(x102, pos_21y) 186 pygame.draw.line (screen, WHITE, st10, en10) 187 if(pos_20y>=500): 188 pos_20y=-50 189 pos_21y=0 190 st11=(x104+50, pos_22y) 191 en11=(x103+50, pos_23y) 192 pygame.draw.line (screen, WHITE, st11, en11) 193 if(pos_22y>=500): 194 pos_22y=-50 195 pos_23y=0 196 st12=(x104, pos_24y) 197 en12=(x103, pos_25y) 198 pygame.draw.line (screen, WHITE, st12, en12) 199 if(pos_24y>=500): 200 pos_24y=-50 201 pos_25y=0 202 st13=(x105+50, pos_26y) 203 en13=(x104+50, pos_27y) 204 pygame.draw.line (screen, WHITE, st13, en13) 205 if(pos_26y>=500): 206 pos_26y=-50 207 pos_27y=0 208 st14=(x105, pos_28y) 209 en14=(x104, pos_29y) 210 pygame.draw.line (screen, WHITE, st14, en14) 211 if(pos_28y>=500): 212 pos_28y=-50 213 pos_29y=0 214 st15=(x106+50, pos_30y) 215 en15=(x105+50, pos_31y) 216 pygame.draw.line (screen, WHITE, st15, en15) 217 if(pos_30y>=500): 218 pos_30y=-50 219 pos_31y=0 220 st16=(x106, pos_32y) 221 en16=(x105, pos_33y) 222 pygame.draw.line (screen, WHITE, st16, en16) 223 if(pos_32y>=500): 224 pos_32y=-50 225 pos_33y=0 226 st17=(x107+50, pos_34y) 227 en17=(x106+50, pos_35y) 228 pygame.draw.line (screen, WHITE, st17, en17) 229 if(pos_34y>=500): 230 pos_34y=-50 231 pos_35y=0 232 st18=(x107, pos_36y) 233 en18=(x106, pos_37y) 234 pygame.draw.line (screen, WHITE, st18, en18) 235 if(pos_36y>=500): 236 pos_36y=-50 237 pos_37y=0 238 st19=(x108+50, pos_38y) 239 en19=(x107+50, pos_39y) 240 pygame.draw.line (screen, WHITE, st19, en19) 241 if(pos_38y>=500): 242 pos_38y=-50 243 pos_39y=0 244 st20=(x108, pos_40y) 245 en20=(x107, pos_41y) 246 pygame.draw.line (screen, WHITE, st20, en20) 247 if(pos_40y>=500): 248 pos_40y=-50 249 pos_41y=0 250 st21=(x109+50, pos_42y) 251 en21=(x108+50, pos_43y) 252 pygame.draw.line (screen, WHITE, st21, en21) 253 if(pos_42y>=500): 254 pos_42y=-50 255 pos_43y=0 256 st22=(x109, pos_44y) 257 en22=(x108, pos_45y) 258 pygame.draw.line (screen, WHITE, st22, en22) 259 if(pos_44y>=500): 260 pos_44y=-50 261 pos_45y=0 262 pygame.draw.circle(screen, RED, (x, 400), 5) 263 pygame.display.update() 264 for event in pygame.event.get(): 265 if event.type==pygame.QUIT: 266 pygame.quit() 267 sys.exit() 268 pressed_key=pygame.key.get_pressed() 269 if (pressed_key[K_LEFT] and x>0): 270 x -= 5 271 if (pressed_key[K_RIGHT] and x<640): 272 x += 5 273 if pressed_key[K_ESCAPE]: 274 pygame.quit() 275 sys.exit() 276 if time.time()-start>120: 277 pygame.quit() 278 sys.exit() 279

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jeanbiego

2020/06/18 02:41

そのエラーはどの行に対して発生しているのでしょうか
kappar

2020/06/18 02:43

while文中の6行目(全体の50行目)の 「pygame.draw.line (screen, WHITE, st_right, en_right)」 です。 記載不足でした、申し訳ありません。
jeanbiego

2020/06/18 03:01

他の方が回答しやすいように、質問文を編集してください。 ところで、Invalid start position argumentということなので、pygame.draw.line (screen, WHITE, st_right, en_right)の引数、screenに問題がありそうですが... 手元に環境がないので試行できていません。 下記リンクの最下部の話は参考になりますか? https://stackoverflow.com/questions/37361443/how-to-move-non-rectangular-objects-in-pygame
kappar

2020/06/19 01:55

リンクありがとうございます、同じエラーが生じていたようですね。この方の場合は図形の重ね方の問題?だったのでしょうか…。 座標を出してからzipを使ってまとめてみたら Invalid start position argumentのエラーは出なくなりました。 すみません、お騒がせしました。
guest

回答1

0

自己解決

そもそもの書き方が違っていました。

st_right=[xs[+1]+50,ys[+1]]
の中身を確認したところ、思っていたデータ型とは異なっていたため、
xs,ysのそれぞれのリストをzipで結合させることにしました。

投稿2020/06/19 01:57

kappar

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問