// Pongゲーム試作(Fck=10MHz) // ISPで書き込み時はVRの位置を左端や右端に置かないように注意!! // DELAY1/DELAY2は「プレイヤー側のラケットにボールが当たってからコンピュータ側 // のラケットが移動を開始するまでの遅延」 // DELAY1=15...(プレイヤー>コンピュータ)の時はコンピュータが強く // DELAY2=16...(プレイヤー<=コンピュータ)の時はコンピュータが弱く // 2007.5.28 koyama@cc.hirosaki-u.ac.jp #include #include #include #include #define DELAY1 15 #define DELAY2 16 #define Fck 10 #define VS 106 #define HS 8 #define SCREEN_W 48 #define SCREEN_H 32 #define LINEtop 72 #define LINEdup 4 #define LINEext (LINEtop+SCREEN_H*LINEdup) #define SCROLL 2 #define FONT_W 8 #define FONT_H 16 #define SYN 0x00 #define BLK 0x01 #define WHT 0x03 #define RSIZE 6 #define R1x 43 #define R2x 4 #define max(x,y) ((x>y)?(x):(y)) #define min(x,y) ((x=LINEtop && line=r1y&&y<=r1y+RSIZE) dx=-dx;//ラケット1にHit else if(x==R2x&&y>=r2y&&y<=r2y+RSIZE) dx=-dx;//ラケット2にHit y+=dy; if(y==0 || y==SCREEN_H-1 || x==R1x&&(dy==1&&y==r1y||dy==-1&&y==r1y+RSIZE-1)) dy=-dy; // y方向転換 if(x==0 || x==SCREEN_W-1){ if(score1==9 || score2==9) S=0; // ゲームオーバー else{ fcntr=0; S=1; } //1秒後にプレイ開始 }else Vplot(x,y,2); // ボール表示 }else if(line==LINEext+4){ // ラケット1の更新 Vline(R1x,r1y, R1x,r1y+RSIZE-1,2); // ラケット1消去 r1y=min(SCREEN_H-RSIZE-1,max(0,SCREEN_H-1-(ADCH>>3))); }else if(line==LINEext+5){ // ラケット1の更新 Vline(R1x,r1y, R1x,r1y+RSIZE-1,2); // ラケット1表示 }else if(line==LINEext+6){ Vline(R2x,r2y, R2x,r2y+RSIZE-1,2); // ラケット2消去 }else if(line==LINEext+7 && fcntr%4==0 && S==2 && dx==-1 && xscore2)?DELAY1:DELAY2)){ if(dy==1){ r2y_=y+x-R2x; if(r2y_>=SCREEN_H) r2y_=SCREEN_H-(r2y_-SCREEN_H); }else{ r2y_=y-x+R2x; if(r2y_<0) r2y_=-r2y_; } }else if(line==LINEext+8 && fcntr%4==0 && S==2 && dx==-1 && xscore2)?DELAY1:DELAY2)){ if(r2y+RSIZE/2>r2y_ && r2y>0) r2y--; if(r2y+RSIZE/2