【初心者】課題をクリアしていくスレ【講習会】

■ このスレッドは過去ログ倉庫に格納されています
1名前は開発中のものです。
垢版 |
04/06/10 18:05ID:VshiFFV8
ゲームに必要な要素を先生が出してくれます

その課題をクリアしていく講習会です
04/06/28 10:30ID:Ten9Dr/x
ちと訂正・・orz

×holdobj = SelectObject(hdc, holdobj);// 以前のオブジェクトに戻す
○SelectObject(hdc, holdobj);// 以前のオブジェクトに戻す
04/06/28 15:51ID:W33tIq0j
>>190
変な質問ですいません
バイナリってなんですか?
195生徒A
垢版 |
04/06/28 16:36ID:D8BhR1kS
>>194 190じゃないですが、もともとは2進数という意味だと思います。
だから、この場合は、1と0の組み合わせで作られた機械語データ
(実行ファイル)の意味だと思います。
他にも、テキストデータ以外のファイル全てを指す事もあります。
196生徒A
垢版 |
04/06/28 16:40ID:D8BhR1kS
>>192 ありがとうございます。
DeleteObjectのやり方は分かったのですが、
オフスクリーンのやり方がちょっとよく分からないです。
具体的には、オフスクリーンの作成方法です。
04/06/28 17:06ID:cdlT0cfW
CreateCompatibleBitmap
198副担任
垢版 |
04/06/28 17:37ID:HdfIcXTc
>>194
Windowsの実行ファイルのことです。"〜.exe" ってやつ。
C言語とかはコンパイルして実行ファイルを作らないとプログラムが動きません。
HSPはインタプリタ言語なので実行ファイルは作らなくていいみたいですね。

>>195
正解です
199Ruby@課題6当たり判定
垢版 |
04/06/28 18:32ID:1FRiXQWF
require 'sdl'
SDL.init( SDL::INIT_VIDEO )
screen = SDL.setVideoMode( 640, 480, 16, SDL::SWSURFACE )
x=(639-32)/2
y=(479-32)/2
enemyX=rand(639-32)
enemyY=0
loop do
while event = SDL::Event2.poll
case event
when SDL::Event2::Quit
exit
end
end
SDL::Key.scan
y -= 1 if SDL::Key.press?( SDL::Key::UP )
x += 1 if SDL::Key.press?( SDL::Key::RIGHT )
y += 1 if SDL::Key.press?( SDL::Key::DOWN )
x -= 1 if SDL::Key.press?( SDL::Key::LEFT )
x=0 if x<0
x=(639-32) if x>(639-32)
y=0 if y<0
y=(479-32) if y>(479-32)
enemyY=enemyY+1
enemyY=0 if enemyY>479
if (x-enemyX).abs<32 and (y-enemyY).abs<32 then
exit
end
200Ruby@課題6当たり判定
垢版 |
04/06/28 18:33ID:1FRiXQWF
screen.fillRect( 0, 0, 640, 480, [ 0, 0, 0 ] )
screen.fillRect( x, y, 32, 32, [ 255, 0, 0 ] )
screen.fillRect( enemyX, enemyY, 32, 32, [ 0, 255, 0 ] )
screen.updateRect( 0, 0, 0, 0 )
end

課題6当たり判定(実行ファイル付き)
http://gamdev.org/up/img/764.zip

【Rubyスクリプトを実行ファイルにする方法】
http://exerb.sourceforge.jp/ からExerbををダウンロード
レシピファイルを書く
add_ruby_script[TAB](スクリプト名)
add_extension_library[TAB](ライブラリ名)[TAB](パスを含めたライブラリ名)
例)
add_ruby_script[TAB]collision.rb
add_extension_library[TAB]sdl.so[TAB]sdl.so

※注意
[TAB]はTABキーで入力してください
通常のエディタだと空白と判別できませんので注意

Exerb添付ドキュメントは旧式の書き方になっているようです
サンプルは新しいものだったのでそちらを参考にしました
04/06/28 20:48ID:W33tIq0j
>>195
>>198
ありがとうございました。
202生徒BLUE
垢版 |
04/06/28 21:18ID:mIyMN4GH
指摘された所を全部直しました

課題5キー入力再提出
http://gamdev.org/up/img/766.zip
2034 ◆3VUXqvbfSY
垢版 |
04/06/28 21:39ID:kLFrYp0l
参考程度に…
オフスクリーン:
変数宣言 前略

hdcOFF=CreateCompatibleDC(hdcON);//空の描画ハンドルを作る
CopyBitmap=CreateCompatibleBitmap(hdcON,640,480);//表のウィンドウと互換のビットマップをつくる。
SelectObject(hdcOFF,CopyBitmap);//んで、設定

中略

BitBlt(hdcON,0,0,640,480,hdcOFF,0,0,SRCCOPY);//裏に書かれた内容を、表に上書きする。

後略


こんな感じ。…VC++だけでごめんなさい…
204LGP@課題1数当て
垢版 |
04/06/28 23:47ID:1FRiXQWF
スクリプト組はあまり時間もかからず有利なので
複数言語同時習得を目指してみます

CH = G@SETUP( 640 , 480 , 16 , 1 )
RANDSET(SYSTIME())
RN = RAND()%9+1

G@PRINT(CH,0,0,"1〜9の数を入力せよ")
G@FLIP()
LOOP
I@KEYGET2( )
IF I@KEYBTN2(1)=2 THEN
    ANS=I@KEYBTN2(0)-1
    IF ANS=RN THEN
        SYSEXIT()
    ENDIF
    IF (ANS>0) AND (ANS<10) THEN
    N=N+1
    G@GDIBOXFULL( CH , 0, 100, 640, 480 )
    G@PRINT(CH,0,100,"はずれ"+STR(N)+"回目")
    ENDIF
    G@FLIP()
ENDIF
S@WAIT()
ENDLOOP

LGP@課題1数当て(実行ファイル付き)
http://gamdev.org/up/img/767.zip
04/06/29 06:26ID:Ngmzz0xf
課題6

実行方法:@メモ帳にコピペ、A名前をつけて保存でinvader.html、BブラウザにD&D

<html><head><title>Invader Game?</title><style type="text/css"><!--
.self{background-color:#FF0000;position:absolute;width:32px;height:32px;}
.enemy{background-color:#0000FF;position:absolute;width:32px;height:32px;}
--></style></head>
<body onLoad="m()"onKeyDown="k[event.keyCode]=1"onKeyUp="k[event.keyCode]=0">
<div id=c class=self></div><div id=e class=enemy></div>
<script language="Javascript"><!--
var alive=true,timerID,k=[],x=304,y=448,eX,eY= 480;
var charElm=document.getElementById('c'),enemyElm=document.getElementById('e');
function m(){clearTimeout(timerID);
x+=k[37]&&x?-8:k[39]&&x<608?8:0;y+=k[38]&&y?-8:k[40]&&y<448?8:0;
charElm.style.left=x;charElm.style.top=y;
eY+=8;if(eY>480){eY=-32;enemyElm.style.left=eX=Math.floor(Math.random()*640);}
enemyElm.style.top=eY;
if(Math.abs(x-eX)>32||Math.abs(y-eY)>32)timerID=setTimeout(m,30);}
//--></script></body></html>
206LGP@課題2素数
垢版 |
04/06/29 09:54ID:OSp1CFcf
FH=F@OPEN("PrimeNumber.txt" , 3 )
F@WRITES( FH , STR(2) )
COUNT=COUNT+1

I=3
WHILE COUNT<1000
    SOSU=-1
    FOR J=3 TO I/2 STEP 2
        IF I%J=0 THEN
            SOSU=0
        ENDIF
    NEXT
    IF SOSU=-1 THEN
        F@WRITES( FH , STR(I) )
        COUNT=COUNT+1
    ENDIF
    I=I+2
    S@WAIT()
ENDWHILE

F@CLOSE( FH )
04/06/29 13:12ID:WW/6W0k2
dpかwinsockでチャット作りたひ。
208名前は開発中のものです。
垢版 |
04/06/29 18:46ID:vpUdLCjy
>>207
自分で作ったチャットソフトで皆と繋げられたら楽しそうな予感!
209名前は開発中のものです。
垢版 |
04/06/29 21:15ID:OSp1CFcf
もの凄い勢いで進行してるのでまとめの意味もあって統計をとってみました
抜けてる人がいたらごめんなさい

JavaScript         ****** 6
Ruby..            ****** 6
生徒A(Win32API).     ***** 5
生徒BLUE (Win32API).  ***** 5
Delphi            ***** 5
D言語            ** 2
LGP             ** 2
x≠先生かつx=生徒 ⇒ x=俺(VB) 測定不能

まとめページ
http://gamdev.org/w/?%5B%5B%A1%DA%BD%E9%BF%B4%BC%D4%A1%DB%B2%DD%C2%EA%A4%F2%A5%AF%A5%EA%A5%A2%A4%B7%A4%C6%A4%A4%A4%AF%A5%B9%A5%EC%A1%DA%B9%D6%BD%AC%B2%F1%A1%DB%A4%DE%A4%C8%A4%E1%5D%5D
アップローダ
http://gamdev.org/up/
04/06/29 21:28ID:gNXtRGm+
>>209
VBを使った覚えは無いんですが…というよりVB使えません。
>>134のことかな?
04/06/29 22:14ID:OSp1CFcf
>>210
混同してました
2人も先行者がいたのかorz
修正しました
HSPのほうはもうやらないの?

JavaScript         ****** 6
Ruby..            ****** 6
生徒A(Win32API).     ***** 5
生徒BLUE (Win32API).  ***** 5
Delphi            ***** 5
D言語            ** 2
LGP             ** 2
x≠先生かつx=生徒 ⇒ x=俺(Win32API) 測定不能
VB 測定不能
212LGP@課題3赤い四角
垢版 |
04/06/29 22:53ID:OSp1CFcf
//640x480、16ビット色、ウィンドウ画面
CH = G@SETUP( 640 , 480 , 16 , 1 )
//ブラシを赤色に設定(RGBはそれぞれ0〜1.0で設定)
G@GDISETBRUSH( 0 , 1.0 , 0 , 0 )
//四角を描画
G@GDIBOXFULL( CH , 0, 0, 320, 240 )
//フリップ
G@FLIP()
//無限ループ
LOOP
  S@WAIT()
ENDLOOP
213生徒BLUE
垢版 |
04/06/30 00:29ID:HYWm3For
>>181
>「ANDでマスクとる」とかはわかる?
はい、この場合は2進数に直して一番左のビット以外を全部0にするってことですよね
MSDN読んだりあれからさらに調べてみたので前よりはちょっとわかったのですが
左端のビットが1ならボタンが押されているという程度の理解でいいのでしょうか

・定数書いちゃダメ
defineを積極的に使ってみました
C++の場合だとdefineは使わずにconstを使ったほうがいいと書いてあるホームページも
みつけましたがどうなんでしょう?

・拡張子がcppなのにC言語風
意識せずに全部cppにする習慣がついてたので……
クラスを使う→cpp、使わない→cでいいですか?
拡張子の使い分けむずかしい

・バックバッファあたりは毎回生成&破棄しなくても最初に一度だけ
GetDCを使えばいいんだ!と前回は気づいてませんでした


WEBの情報をあちこちからつまみ食いしてるので全体的にチグハグな感じに
なっていたようで指摘してもらって勉強になります
ソースみていただける方は2ちゃんねるに貼り付けとアップローダのどちらが見やすいでしょうか?
それとも両方のほうがよい?
04/06/30 11:43ID:0T8fXV58
そろそろ本気で見にくくなってきたわけだが、
ちょっと言語が大杉やしないかい?
もうちょっと絞ろうよ
04/06/30 12:46ID:qBs2hfFg
>>213
> 左端のビットが1ならボタンが押されているという程度の理解でいいのでしょうか

HELPには...
最上位ビットがセットされたときは現在キーが押されていることを示し、
最下位ビットがセットされたときは直前のGetAsyncKeyState関数呼び出し以降に
キーが押されたことを示します。
って書いてある。つまり・・・
#include<windows.h>
#include<stdio.h>

void main()
{
 intRv;

 for(;;) {
  Sleep(1);
  Rv = GetAsyncKeyState(VK_SPACE);
  if (Rv != 0) {
   printf("%08x\n", Rv );
  }
 }
}
スペースをバシッと叩くとわかるんだけど、初回だけ最下位ビットが変化してる。
つまり、リピート状態なのかを判断できるわけ。
216生徒BLUE
垢版 |
04/06/30 17:09ID:HYWm3For
>>215
早速、コンパイルして試してみました
最下位ビットに注目してみると
1000000000100100100100100100......
といったように変化します
初回だけということなので10000000......というものを期待していたのですがうまくいかないです
217生徒BLUE
垢版 |
04/06/30 17:38ID:HYWm3For
課題6 当たり判定
赤い四角のサイズを元に当たり判定をしました

//****** 変更箇所 ******

//乱数の初期化
srand((unsigned)time(NULL));

//敵の移動
++ty;
if (ty>YMAX)
{
  ty=0;
  tx=rand()*640/RAND_MAX;
}

//当たり判定
if (abs(x-tx)<BOXWIDTH && abs(y-ty)<BOXHEIGHT)
{
  PostQuitMessage(0);
}

http://gamdev.org/up/img/775.zip
04/06/30 18:49ID:3iu2d+4i
>>216
ん?スペースキーを押すと、こんな風に表示されませんか?
ffff8001
ffff8000
ffff8000
ffff8000
ffff8000
ffff8000
ffff8000
ffff8000
ffff8000
ffff8000
ffff8000
219生徒BLUE
垢版 |
04/06/30 19:04ID:HYWm3For
>>218
ならないです
もうちょっと調べてみます
04/06/30 19:39ID:3iu2d+4i
>>219
あ〜、押しっぱなしの場合は違う結果になるかもです。
OSのキーボードバッファとか、その辺の兼ね合いだと思うけど。
04/06/30 19:52ID:/EAv0A9z
>>215試して見たけど確かに>>216の現象が出るな。
他の出力で確認したらちゃんと立ち上がりだけ1が出るので
printf()絡みでキー状態が変化してるっぽい。
普通はこんな使い方しないので気にしなくて良いと思われ。
04/06/30 21:22ID:qAZjVMDs
>>211
今回のは敵の大きさとか動きとかよくわからないのでやらないです。
223名前は開発中のものです。
垢版 |
04/06/30 22:22ID:j1/sm794
320x240で一度作ったけど即死しすぎて32x32に縮小したよ
サイズ指定してないから何でもいいと思ったけどそのあたりどうなんですか?>先生

wikiのほうにまとめコーナー作っておいたので各自書きたいことがあったら適当にどうぞ
というか書いてくださいおながいします
名無しさんを消して自分の名前にして提出状況とかコンパイラは何を使ってるとかそんなのでいいので

http://gamdev.org/w/?%5B%5B%A1%DA%BD%E9%BF%B4%BC%D4%A1%DB%B2%DD%C2%EA%A4%F2%A5%AF%A5%EA%A5%A2%A4%B7%A4%C6%A4%A4%A4%AF%A5%B9%A5%EC%A1%DA%B9%D6%BD%AC%B2%F1%A1%DB%A4%DE%A4%C8%A4%E1%5D%5D
224LGP@課題4sin波形
垢版 |
04/07/01 00:05ID:TMNGfYFe
//画面初期化、最後を0にすると全画面
CH = G@SETUP( 640 , 480 , 16 , 1 )
//ペンの設定、実線、線の幅1、赤色
G@GDISETPEN(LG_GDI_PS_SOLID,1,1.0,0,0)
//sin波形の始点になる点を描画(LINETOの都合)
G@GDILINE(CH,0,239,0,239)
FOR I=0 TO 360
X=I
//SINの引数と戻り値は固定小数点定数(float)
//整数を固定小数点定数にキャストするには65536を掛ける
//固定小数点定数を整数にキャストするには65536で割る
Y=SIN(I*65536)*100/65536+239
//最後にG@GDILINEかG@GDILINETOで線を引いた場所からX,Yまで線を引く
G@GDILINETO(CH,X,Y)
NEXT
G@FLIP()

//無限ループ
LOOP
S@WAIT()
ENDLOOP
2254 ◆3VUXqvbfSY
垢版 |
04/07/01 08:34ID:KOe6GSoY
>>222,223
サイズは自由で結構です。
敵の動きは…だからy++;だけですよ?
226生徒A
垢版 |
04/07/01 14:26ID:MCi74o/R
数日間ソースとにらめっこしてるのですが、バックバッファーの処理が上手くいかないです…
04/07/01 15:45ID:bdPAbTo6
>>226
キミのソースに少し手を加えたやつをうpろだにあげたから試してみれ。780.lzhだ。
ただしオフスクリーン処理以外(後始末とか)は端折ってるのでそこは参考にしないように。
228LGP@課題5キー入力
垢版 |
04/07/01 22:17ID:TMNGfYFe
CH = G@SETUP( 640 , 480 , 16 , 1 )
LOOP //無限ループ
//赤い四角を黒で塗りつぶして消す
  G@GDISETBRUSH( 0 , 0 , 0 , 0 )
  G@GDIBOXFULL( CH , X, Y, X+320, Y+240 )
  I@KEYGET() //キーの状態を得る
//I@KEYBTNの引数に調べたいキーをいれ、戻り値が1なら押してる状態
  IF I@KEYBTN(0xC8)=1 THEN //0xC8はカーソルキー↑
    IF Y>0 THEN
      Y=Y-1
    ENDIF
  ENDIF
  IF I@KEYBTN(0xCB)=1 THEN
    IF X>0 THEN
      X=X-1
    ENDIF
  ENDIF
  IF I@KEYBTN(0xCD)=1 THEN
    IF X<320 THEN
      X=X+1
    ENDIF
  ENDIF
  IF I@KEYBTN(0xD0)=1 THEN
    IF Y<240 THEN
      Y=Y+1
    ENDIF
  ENDIF
//赤い四角を描く
  G@GDISETBRUSH( 0 , 1.0 , 0 , 0 )
  G@GDIBOXFULL( CH , X, Y, X+320, Y+240 )
  G@FLIP()
ENDLOOP
229LGP@課題6当たり判定
垢版 |
04/07/02 03:30ID:4ZvlEEie
CH = G@SETUP( 640 , 480 , 16 , 1 )
X=320
Y=240
//無限ループ
LOOP
//黒で塗りつぶし
  G@GDISETBRUSH( 0 , 0 , 0 , 0 )
  G@GDIBOXFULL( CH , 0, 0, 640, 480)
//キー入力
//キーの状態を得る
  I@KEYGET()
//I@KEYBTNの引数に調べたいキーをいれ、戻り値が1なら押してる状態
//0xC8はカーソルキー↑
  IF I@KEYBTN(0xC8)=1 THEN
    IF Y>0 THEN
      Y=Y-1
    ENDIF
  ENDIF
  IF I@KEYBTN(0xCB)=1 THEN
    IF X>0 THEN
      X=X-1
    ENDIF
  ENDIF

230LGP@課題6当たり判定
垢版 |
04/07/02 03:30ID:4ZvlEEie
  IF I@KEYBTN(0xCD)=1 THEN
    IF X<(640-32) THEN
      X=X+1
    ENDIF
  ENDIF
  IF I@KEYBTN(0xD0)=1 THEN
    IF Y<(480-32) THEN
      Y=Y+1
    ENDIF
  ENDIF //敵移動
  TY=TY+1;
  IF TY>(640-32) THEN
    TY=0
    TX=RAND()%(640-32)
  ENDIF

//赤い四角を描く
  G@GDISETBRUSH( 0 , 1.0 , 0 , 0 )
  G@GDIBOXFULL( CH , X, Y, X+32, Y+32 )
//敵を描く
  G@GDISETBRUSH( 0 , 0 , 1.0 , 0 )
  G@GDIBOXFULL( CH , TX, TY, TX+32, TY+32 )

//当たり判定
  IF (ABS(X-TX)<32) AND (ABS(Y-TY)<32) THEN
    END
  ENDIF

  G@FLIP()
ENDLOOP
231名前は開発中のものです。
垢版 |
04/07/04 00:00ID:UWWF49AF
保守age
04/07/04 11:07ID:3DUC6+Xf
課題1
   title "数当てゲーム"
   screen 0,150,65   ;ウィンドウのサイズを調整
   mes "1〜9から一つ入力"
   input a   ;入力ボックスを出す

*random
   rnd b,9   ;0〜8の乱数発生
   b+=1   ;1〜9にする
   c=1

*number
   button "これだ!",*judge
   stop

*judge
   if a=b:dialog "当たり!",0,""+c+"回目":goto *random
   if a>b:dialog "もっと小さい",0,""+c+"回目"
   if a<b:dialog "もっと大きい",0,""+c+"回目"
   c+=1
   goto *number

課題3
   title "赤い四角の描画"
   screen 0,640,480,1
   color 255,0,0:boxf 0,0,320,240
   stop

http://gamdev.org/up/img/801.zip

課題2はヨクワカラナイです。ヒントくれませんか?
04/07/04 11:13ID:dw9vgL9Y
>>232
自分以下で2以上の全ての整数の割り算の余りが0にならなければ素数
別の解放にエラトステネスのふるいってのがあるけど別に使わなくていい
04/07/04 11:14ID:dw9vgL9Y
自分未満の整数の間違い
以下だったら自分も含むからね
04/07/04 12:05ID:WDudAYFD
自分の1/2で十分じゃね?

04/07/04 12:35ID:yqwpjhZT
(√自分)でよくない?
04/07/04 12:38ID:WDudAYFD
平方根求めるより楽だし
04/07/04 12:55ID:9GihiSR8
>>236-237
なんで平方根まででいいんだっけ?
04/07/04 13:00ID:WDudAYFD
それ以上のは今までに計算した分と対応してるだけ
04/07/04 19:58ID:3DUC6+Xf
えと、素数はどういうものかはわかるんですが、プログラムというかHSPでの算出方法が…
04/07/04 20:45ID:WDudAYFD
; 素数判定 with HSP 少しだけ高速版
sdim log, 7000: notesel log
title "素数判定 - Calculating..."
mesbox log, 640, 480
log = "2": n = 1
repeat 999
repeat
n += 2: f = 1
repeat n>>1-1,3
if n \ cnt = 0: f = 0: break
continue cnt+2
loop
if f: break
loop
noteadd ""+n
await
loop
objprm 0, log
title "素数判定"
stop
04/07/04 20:47ID:WDudAYFD
あ、インデントかけるの忘れとった。。。

; 素数判定 with HSP 単純版
sdim log, 7000: notesel log
title "素数判定 - Calculating..."
mesbox log, 640, 480
repeat ,2
    n = cnt
    repeat cnt-2, 2
        if n \ cnt = 0: n = 0: break
    loop
    if n{
        noteadd ""+cnt
        i++
        if i >= 1000: break
        await
    }
loop
objprm 0, log
title "素数判定"
stop
243Ruby@素数高速化
垢版 |
04/07/05 00:33ID:K58VA1M5
以前のバージョン
43.702999830246秒
ループ 31343403回
新しいバージョン(奇数のみ評価、平方根までチェック)
0.921999931335449秒(約47倍)
ループ 225062回(約139倍)
思ったより高速化されてビクーリ

print "2\n"
count=1
loopCount=0
i=3
old=Time.now.to_f;
while count<1000 do
  sosu=true
  for j in 3..Math.sqrt(i) do
    loopCount=loopCount+1
    if ( (i % j) == 0)
      sosu=false
    end
  end
  if (sosu)
    print "#{i}\n"
    count=count+1
  end
  i=i+2
end
print " #{Time.now.to_f - old}秒かかりました\n"
print " #{loopCount}回ループしました\n"
print "素数を#{count}個みつけました\n"
244名前は開発中のものです。
垢版 |
04/07/05 01:37ID:o/9mlWPU
>>241を改良してみた。

; 素数判定 with HSP 何気に高速版
title "素数判定 - Calculating..."
#const MAX_COUNT 1000
ll_libload dll,"kernel32.dll" :ll_getproc func,"GetTickCount", dll
ll_libfree dll :ll_retset refunc

sdim log, 7 * MAX_COUNT :notesel log
dim result, MAX_COUNT
mesbox log, 640, 480
noteadd "2",0,1 :result.0 = 2 :count = 3 :i = 1
;測定
ll_callfunc temp,0,func
start = refunc
repeat
  flg = 1;
  repeat i
   if count \ result.cnt = 0 : flg = 0 :break
  loop
  if flg {
   noteadd ""+count, -1 :result.i = count
   i++ :if i >= MAX_COUNT: break
   await
  }
count += 2
loop
ll_callfunc temp,0,func
refunc -= start :dialog "" + refunc + "ms"
objprm 0, log :title "素数判定"
stop
04/07/05 07:17ID:LZQQVRIy
Delphiで素数
http://gamdev.org/up/img/805.zip
04/07/05 13:04ID:LZQQVRIy
最速の素数判定アルゴリズム
http://pc.2ch.net/tech/kako/993/993457354.html
04/07/05 20:13ID:axn64mRQ
すごいスレの流れと違うような気がしますが、
Cで、ウインドウ表示とか(課題3)、できないんですが・・・どうしたらいいんでしょうか?
04/07/05 20:40ID:q8IB8pY7
できないだけ書かれてもどうしようもない。
04/07/05 20:57ID:0DOOfkU1
>>247
猫でもわかるプログラミング
ttp://www.kumei.ne.jp/c_lang/

このへんでまず勉強してこよう
04/07/05 22:48ID:LZQQVRIy
>>247
WinMainからはじまって
CreateWindowでウィンドウの設定して
ShowWindowで表示するだけだ
04/07/05 22:51ID:ZZjGGIiZ
sdim m,4000 : notesel m
mesbox m,640,480
noteadd "2" m : noteadd "3" m : noteadd "5" m : noteadd "7" m

n=7
c=4

*judge
n+=2

if n\3=0 : goto *judge
if n\5=0 : goto *judge
if n\7=0 : goto *judge

noteadd "n" m : c+

if c=1000 : goto *s

goto *judge

*s
stop

素数はこれで出るカナと思ったんですが、エラー発生。原因を突き止められませんTT
04/07/05 23:00ID:pTJ3lo22
エラーを読も・・・・・Σ(;゚Д゚)HSPがエラー吐いてない!

noteadd "*" m
        ~|~
   要らない。ここでエラーが出てる。

noteadd "n"
      ~|~
エラーの原因ではないが、""+nの誤り。

あと、objprm 0, mをstopの前に入れて出力させてあげよう。
04/07/05 23:07ID:ZZjGGIiZ
>>252
thx
でも、4363で終わりますがあってるんでしょうか?

sdim m,4000 : notesel m
mesbox m,640,480
noteadd "2" : noteadd "3" : noteadd "5" : noteadd "7"

n=7
c=4

*judge
n+=2

if n\3=0 : goto *judge
if n\5=0 : goto *judge
if n\7=0 : goto *judge

noteadd ""+n : c+

if c=1000 : goto *s

goto *judge

*s
objprm 0, m
stop
04/07/05 23:24ID:pTJ3lo22
たしか7919のはずだけど・・・

暇だしPerlとJava版の素数判定作ってみようかな。。。
04/07/05 23:25ID:MIzlaErt
>>253
間違ってるよ・・・
121とかあるし・・・11からの素数の合成数が出まくりやね。
04/07/06 00:11ID:hNVuoewj
>>247
それは簡単だって!どっかのサイトに張ってあるやつをそのままコピペで完成だぁよぉ!
04/07/06 01:48ID:IHRV3HSb
素数スレになってるのだが・・・
258名前は開発中のものです。
垢版 |
04/07/06 02:29ID:pkSoPn0/
Delphi エラトステネスの篩
http://gamdev.org/up/img/810.zip
04/07/06 07:38ID:BOq5Vq10
#!D:\perl\bin\perl.exe

print "Content-type: text/plain\n\n";
print "Start\n";
print "2\n";
$table[0] = 2;
$i = 1;
for(2..1000){
    for($i += 2; ; $i += 2){
        if(&IsPrime($i)){ last; }
    }
}
print "Finish";
exit(1);

sub IsPrime{
    (my $src) = @_;
    for($j = 0; $table[$j] <= sqrt($src); $j++){
        if($src % $table[$j] == 0){ return 0; }
    }
    print $src."\n";
    push(@table, $src);
    return 1;
}

# Perl版。printを取ってみると分かるけどPerlはインタープリタなのに
# 結構処理速いね。。。
04/07/06 12:03ID:IHRV3HSb
>>259
Perlは見かけ上インタプリタだけど、
処理はコンパイル後実行だと聞いたことがある。
261名前は開発中のものです。
垢版 |
04/07/06 16:54ID:pkSoPn0/
C#で素数
static void Main(string[] args)
{
    int sosuCount=0;
    for (int i = 2; sosuCount<1000; i++)
    {
        Boolean nososu;
        nososu = false;
        for (int j = 2; j < i ; j++)
        {
            if ((i % j) == 0)
            {
                nososu = true;
                break;
            }
        }
        if (!nososu)
        {
            Console.WriteLine(i);
            sosuCount++;
        }
    }
    Console.WriteLine(sosuCount + "個の素数を発見しました");
}
04/07/06 17:32ID:BOq5Vq10
public class Prime {
public final static int PRIME_MAX = 1000;
static int PrimeTable[] = new int [PRIME_MAX];
static int TableLast = 1;

public static void main(String[] args) {
int l = 1;
PrimeTable[0] = 2;
System.out.println(2);
for(; TableLast < PRIME_MAX; TableLast++)
for(l += 2; ; l += 2)
if(IsPrime(l)) break;
System.out.println("Finish");
}
public static boolean IsPrime(int src) {
for(int i = 0; PrimeTable[i] <= Math.sqrt(src) && i < TableLast; i++)
if(src % PrimeTable[i] == 0) return false;
PrimeTable[TableLast] = src;
System.out.println(src);
return true;
}
}

// Java版。
// あと手を付けてない言語は何だっけ。
// ・・・ひまわりでもやってみるか。
263名前は開発中のものです。
垢版 |
04/07/06 18:09ID:pkSoPn0/
//PHPで素数
<?php
    for ($i=2; $sosuCount<1000; $i++)
    {
        $nososu=false;
        for ($j=2; $j<$i; $j++)
        {
            if (($i % $j) == 0)
            {
                $nososu=true;
                break;
            }
        }
        if (!$nososu)
        {
            echo $i;
            echo "\n";
            $sosuCount++;
        }
    }
    echo $sosuCount + "個の素数を発見しました";
?>
264名前は開発中のものです。
垢版 |
04/07/06 18:57ID:pkSoPn0/
#Pythonで素数
sosuCount=0
i=2
while sosuCount<1000:
        nososu=False
        j=2
        while j<i:
                if ((i % j) == 0):
                        nososu=True
                        j=99999
                        break
                j=j+1
        if (not nososu):
                print i
                sosuCount=sosuCount+1
        i=i+1
print sosuCount
print "個の素数を発見しました"
265生徒A
垢版 |
04/07/06 19:10ID:B1nIIlBn
素数スレに変化していたらしい
04/07/06 19:57ID:2QvbUldx
いろんな言語で素数プログラムつくるとゲーム作れるようになるですか
2674 ◆3VUXqvbfSY
垢版 |
04/07/06 20:22ID:sRW7wZ6D
>>266
なるわけありませんw

だだし、解らない方をホっといて課題を進める訳には…

うーん…

じゃあ、課題外伝でも出しますか…
余力が有ればどうぞ。

弾道シミュレーション:とは言え、何も波動方程式を使えとはいわない。
真空空間で結構。
画面を横を640kmと仮定し、初速、角度を入力させ、弾の軌道を描いてくれ。
ちなみに、初速は29000m/s以下で
重力加速度は10m/(s^2)でお願いします。
04/07/06 20:28ID:BOq5Vq10
(;゚Д゚)ノ先生!…まだ高1なので習ってません
04/07/06 21:30ID:Oq4N2t0v
>>268
高一だけどもう習ったよ
04/07/06 21:32ID:tJWPmmxn
とりあえず初速度を三角関数でxとyに分解した後、
重力加速度をyに対して適用していきましょう。

しかし初速29000m/sだと、軽々地球を離脱して重力圏外に吹っ飛んでいきそうです。
04/07/06 21:37ID:jam3e6md
地球の半径は6370kmぐらいでいいですか?
04/07/06 22:03ID:GhTVD8Z+
>>242
> if n{
このnって何の意味があるんですか?


それから>>241にある「>>」の使い方がわかりません…
04/07/06 22:06ID:GhTVD8Z+
連レス済みません

HSPでの平方根の出すのと、その整数か否かの判断てできますか?
できれば、教えてください。

質問ばっかで済みません
04/07/06 23:17ID:BOq5Vq10
>>269
ガ━━(゚Д゚;)━━━ン!!
物理じゃなくて化学だし・・・

>>270
何をすればいいのか全くわからそ( ´・ω・`)

>>271
ループを抜けるときにn = 0にされていたら(割り切れたときにn = 0にして抜けている)無視、
されていない(素数)のとき、いろいろしてる。

>>はビットシフト。2進数が関わってきます。
で、結果的には
x >> nは、xを2のn乗で割るのと同じ。
x << nは、xに2のn乗をかけるのと同じ。
だから、n>>1はn/2と同じ。

平方根も求められるには求められるけど、自分で求めるアルゴリズムは用意しないといけない。
その整数か否かとは・・・?
04/07/06 23:53ID:pkSoPn0/
//HSPヘルプではincludeするのはhspext.hsになってますがhspext.asじゃないと動きません
//なぜ?(´・ω・`)
//
//平方根の求め方
//
//HSP2.61で動作確認しますた
//
#include "hspext.as"
//100の平方根を求めます
i=100
//iの平方根を固定少数点型でjに代入
emsqr j,i
//jの値を整数型にキャスト(少数点以下切り捨て)
j=j>>4
//jを表示
print j
stop
276名前は開発中のものです。
垢版 |
04/07/07 04:08ID:FL+3iUiB
これであってるのかな
よくわからんので実行しても合ってるのか確認しようがない(´・ω・`)
ググった式をそのまま当てはめてみました

弾道シミュレーション
http://gamdev.org/up/img/814.zip
04/07/07 21:29ID:dX/NBYiw
>>274
返答有難う御座います。
学校で考えてたら、平方根だけじゃダメだとわかったんで、
>>233にあった2以上〜自分未満ってのをやってみようと思います。

因みに整数か否かとは、平方根出したときのことです。
例えば√2は1.414…ですよね?だから整数じゃないですし、√4なら2ですから整数で、
整数じゃなかったら素数に入れよう!とか思ってたんですが、
11*13(適当に思いついた)だとダメなんですよね…
04/07/07 21:32ID:W6JVsWwD
ゲームに必要なのは実現できるか否かだ
ちょっぱやな素数判定できることに課題としての価値はないよ
ガンガレ
04/07/07 22:18ID:lBWiEqny
√27 = 5.1961...
27 = 3 * 9
04/07/07 23:08ID:B0lUGdqJ
>>275
> HSPヘルプではincludeするのはhspext.hsになってますがhspext.asじゃないと動きません
HSPヘルプは電波入っているから気にしないがよし。
つかhspソースファイルの拡張子は".as"以外使わないと思うが。

>>274
>267を簡単に表現すると、
   __
 /   \           /
〇     〇←B.止まる A/) 角度 R

A.初速<29000m/s

こんな感じの軌道を描画する。
で、真空中なのでX軸方向の速度は 初速 * cosR
Y軸は 初速 * sinR で、毎秒-10していく。
04/07/07 23:51ID:lBWiEqny
>>280
#include "hspext.as"
screen 2, 300, 100, 4: title "Config"
pos 5, 8: mes "初速:": pos 50, 5: input speed, 215, 25: pos 270, 8: mes "m/s"
pos 5, 38: mes "角度:": pos 50, 35: input angle, 210, 25: pos 265, 38: mes "/255"
pos 5, 70: objsize 290, 25: button "Start", *start
gsel 0: stop
*start
emsin sin, angle: emsin cos, angle
mx = speed * sin / 255: my = speed * cos / 255
x = 0: y = 480000: pos x/1000, y/1000
repeat
x += mx: y -= my: my -= 10
line x / 1000, y / 1000
wait 10
loop
stop

こんな感じかぇ・・・?
04/07/08 14:31ID:oFd7+xVG
>>281
sin と cos が逆だけど、だいたいOKじゃないか?
俺も281参考に一応作ってみた。
…なんでcos7がマイナスになるんだ、理解できん。

#include "hspext.as"
#define EDIT_X 160
#define EDIT_Y 24
#define G 10
#define SCREEN_X 640
#define SCREEN_Y 480
width SCREEN_X, SCREEN_Y
title "C / HSPの生徒 orz"
color 200, 200, 200:boxf
pos 120, 70:button "描画", *ready
goto config_sub
04/07/08 14:31ID:oFd7+xVG
*ready
color 200, 200, 200:boxf
if v0 > 29000:stop
uchar_r = r \ 360 * 255 / 360
color 240
emsin sin, uchar_r:emcos cos, uchar_r
vx = -v0 * cos / 255:vy = -v0 * sin / 255
x = 0:y = SCREEN_Y:pos x, y
repeat
x += vx:y += vy:vy += G
line x, y
if (y > SCREEN_Y) || (x < 0) || (x > SCREEN_X):break
await 0
loop
*config_sub
color
pos 40, 15:mes "初速 :":pos 100, 10:input v0, EDIT_X, EDIT_Y
pos 40, 45:mes "角度 :":pos 100, 40:input r, EDIT_X, EDIT_Y
stop
04/07/08 17:42ID:gJH4XEvh
おっと、emcosがemsinになってたか・・・
04/07/08 17:45ID:f5vo4Z1w
なんていうかさ。素数よりも、もっと普通にゲームでよく使うようなやつを
やったほうがいいんじゃないかな?

ボールが跳ねるのをシミュレート、とかなら
ジャンプするゲームでは確実に使うだろうし。
2864 ◆3VUXqvbfSY
垢版 |
04/07/08 19:00ID:xmAVGw0W
なんか…確かに素数ばっかりに見えますが…違うんですよ。
素数で詰まってる人が多いってだけで…


あとですね…ボールが跳ね返るシミュレーション、ジャンプに使いますかねぇ?
マリオが勝手に地面で跳ね返ったら、俺は切れますがw


…ああ、何時になったらインベーダーが…本来なら、そろそろ、赤い四角に弾でも撃って貰おうと思ってたんですが…

わかりました。二つ出します

メイン課題 前の、赤い四角に弾を撃って貰います。さらに前課題の降ってくる物体と相殺させて下さい。
弾丸は横2ドット、縦16ドットで黄緑色
動きは Y座標(初期値は赤い四角のY座標+16)その後Y--; X座標(初期値は赤い四角のX座標÷2)その後固定;
当たった時点もしくは、画面外にでたら再発射が可能となる。
基本一発。ただし、複数発実装できるならしても良い。




課題外伝 ボールの跳ね返りシミュ
ボールを(0,0)から水平投射する。(速度は自由)
床の反発係数は0.8
壁は1.0
重力加速度は10m/s^2
04/07/08 20:05ID:kembbGf8
トランポリンでも使うつもりなんですかね
ジャンプで跳ね返りって…
そいやマリオには敵ふんだときちょっと浮くけどあれなのかな・・・
04/07/08 21:00ID:gJH4XEvh
名古屋撃ちのために、実装しない方向で行こう。。。

>>286
こんな感じでOK?

#include "hspext.as"
screen 2, 300, 100, 4: title "Config"
pos 5, 8: mes "初速:": pos 50, 5: input speed, 215, 25: pos 270, 8: mes "m/s"
pos 5, 38: mes "角度:": pos 50, 35: input angle, 210, 25: pos 265, 38: mes "/255"
pos 5, 70: objsize 290, 25: button "Start", *start
gsel 0: stop
*start
cls
emsin sin, angle: emcos cos, angle
mx = speed * sin / 255: my = speed * cos / 255
x = 320000: y = 240000: pos x/1000, y/1000
repeat
x += mx: y -= my: my -= 10
if x<0: x=0: mx = -mx
if x>640000: x=640000: mx = -mx
if y>480000: y=480000: my = -my * 8 / 10: if my<80: my = 0: stop
line x / 1000, y / 1000
wait 1
loop
stop
04/07/08 23:33ID:UCn/khb4
#include "hspext.as"
#const G 10
#const Coeff 10
#const Wall_e 10
#const Floor_e 8

screen 0, 640, 480, 1
dim sin,256 :dim cos,256
repeat 256 :emsin sin.cnt,cnt :emcos cos.cnt,cnt :loop

screen 2, 150, 100, 4: title "Config"
pos 5, 8: mes "初速:": pos 50, 5: input V, 50, 25: pos 100, 8: mes "m/s"
pos 5, 38: mes "角度:": pos 50, 35: input C, 50, 25: pos 100, 38: mes "°"
pos 5, 70: objsize 120, 25: button "Start", *main
gsel 0 :stop
*main
if V > 29000 : 29000
if C > 90 : C = 90
C = C * 256 / 360 :Vx = V :Vy = V :Ycnt = 0 :x = 0 :y = 0

repeat
redraw 0 :await 1
color 255,255,255 :boxf :color 255,0,0 :pos 0, 460 : mes "■" :color 0,0,255 :line 0, 475, 640, 475
color 0,0,0 :x += Vx * (-cos.C) / 256 :y += Vy * sin.C / 256 - (G * Ycnt)

if x / 1000 < 0 :Vx = -Vx * Wall_e / Coeff :x = 0
if x / 1000 > 624 :Vx = -Vx * Wall_e / Coeff :x = 624000
Ycnt++ :if y < 0 :Vy = Vy * Floor_e / Coeff :y = 0 :Ycnt = 0
pos x / 1000, -y / 1000 + 460 : mes "○" :if cnt > 0 & (Vy <= 0) :break
redraw 1 :loop :stop
投下
04/07/09 00:10ID:bufBX0Vb
#include "hspext.as"
screen 2, 300, 100, 4: title "Config"
pos 5, 8: mes "初速:": pos 50, 5: input speed, 215, 25: pos 270, 8: mes "m/s"
pos 5, 38: mes "角度:": pos 50, 35: input angle, 210, 25: pos 265, 38: mes "/255"
pos 5, 70: objsize 290, 25: button "Start", *start
gsel 0: stop
*start
cls
emsin sin, angle: emcos cos, angle
mx = speed * sin / 255: my = speed * cos / 255
x = 320000: y = 240000: pos x/1000, y/1000
repeat
ox = x: oy = y: x += mx: y -= my: my -= 10
if x<0: x=0: mx = -mx
if x>624000: x=624000: mx = -mx
if y>464000: y=464000: mx = mx * 8 / 10: my = -my * 8 / 10: if my<80|(mx==0): my = 0: stop
;redraw 0
color 255, 255, 255: pos ox/1000, oy/1000: mes "○"
color 0, 0, 0: pos x/1000, y/1000: mes "○"
;redraw 1
wait 1
loop
stop

改造版。

>>289
スゲー・・・
04/07/09 10:25ID:nlM8j7wC
>>286の課題作ってみたが、ゲーム性を考えて数値をアレンジしています。
#define RED_SIZE 32
#define ENEMY_SIZE 32
#define MOVE_TIME 32
#define OBJ_SX 2
#define OBJ_SY 16
#define OBJ_SPEED 16
randomize
width 640, 480
red_x = 640 - RED_SIZE / 2:red_y = 480 - RED_SIZE
repeat
redraw 2:color 255, 255, 255:boxf
if enemy_stat = 0:enemy_y = -ENEMY_SIZE:enemy_stat = 1:title "C / HSPの生徒 orz 撃破数: "+obj_cnt
enemy_timer++:if enemy_timer > MOVE_TIME:enemy_timer = 0
if enemy_timer = 0:rnd enemy_x, 640 - ENEMY_SIZE
stick key, 15:if key & 1{red_x-4}if key & 4{red_x+4}
stick key, 16:if key = 16 & (obj_stat = 0){
obj_stat = 1:obj_x = RED_SIZE / 2 - (OBJ_SX / 2) + red_x:obj_y = red_y - 16}
if (enemy_x < obj_x) & (obj_x + OBJ_SX < (enemy_x + ENEMY_SIZE)) {
if (enemy_y < obj_y) & (obj_y + OBJ_SY < (enemy_y + ENEMY_SIZE)) {
obj_cnt++:obj_stat = 0:enemy_stat = 0:color 255, 0, 0:boxf} }if obj_y + OBJ_SY < 0:obj_stat = 0
if enemy_stat:color 100, 100, 200:boxf enemy_x, enemy_y, enemy_x + ENEMY_SIZE, enemy_y + ENEMY_SIZE
color 200, 100, 100:boxf red_x, red_y, red_x + RED_SIZE, red_y + RED_SIZE
if obj_stat:color 100, 200, 100:boxf obj_x, obj_y, obj_x + OBJ_SX, obj_y + OBJ_SY:obj_y-OBJ_SPEED
enemy_y++:if enemy_y > 480{enemy_stat = 0}await 20:redraw 1
loop
292285
垢版 |
04/07/09 10:46ID:mw4kM0V8
すまん、言葉足らずだった。
ジャンプの軌道の加速減速だ。

ボールが跳ねるって部分は蛇足だったな。
293285
垢版 |
04/07/09 10:48ID:mw4kM0V8
>ボールが跳ねるって部分は蛇足だったな。

>ボールが跳ねるって言い方は変だったな。


言葉足らずって言うより、俺、言い回しが変だね。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況