ミスが多かったのでもう一度投稿します
すみません
テトリスをC言語で作っているのですが
その際コンパイラとしてCygwin、テキストエディタとしてEmacsを使っています
まだC言語歴がかなり浅く初心者です。
よろしくお願いします。
まず僕が思い描いているテトリスの要素というか実現したいことを箇条書きします
①フィールドを作る
フィールドは20×10マスでそのまわりに[]という壁を作成して
その上に番号を割り振っています
僕のソースは
#include <stdio.h>
void init(char A[22][12]){
//壁を1、フィールドを0とする。
int i,j;
int EMPTY = 0;
int WALL = 1;
for(i=0;i<22;i++){
for(j=0;j<12;j++){
if((i == 0)||(i == 21)||(j == 0)||(j == 11)){
A[i][j] = WALL;
}else{
A[i][j] = EMPTY;
}
}
}
}
void showGameField(char A[22][12]){
//壁を[]、フィールドを として表示する。
int k,i,j;
for(k=0;k<11;k++){
if(k){
printf("%2d", k);
}else{
printf(" ");
}
}
for(i=0;i<22;i++){
printf("\n");
for(j=0;j<12;j++){
if(A[i][j] == 1){
printf("[]");
}else{
printf(" ");
}
}
}
}
int main(){
char A[22][12];
init(A);
showGameField(A);
return 0;
}
②7種類のテトリスのブロックを作成する
4×4のブロックフィールドにブロックの部分は2、ブロック以外のところは0として
2の部分には7種類の色を付けたいのですが
Cygwinではどうも白、マゼンタ、シアン、青、黒、黄、緑、赤の8種類しかないみたいなので
壁の[]を白で背景は黒、フィールドは で背景も文字色も黒、ブロックは黒以外の7色を使いたいと思います。
その際ブロックがある部分は■として色付けしてしまうと
ブロックが■
■
となりくっついてる感じがなくなってしまいます
これを解消するために
ブロックの部分は で文字色を7種類に変えればうまいこといくんじゃないかと仮説をたてたのですが
そのブロックを作って表示する方法がわからないです。
どのようにすればいいんでしょうか?
今この段階です。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void createBlock(void){
//7種類のブロックの作成
int i,j;
char Block[i][j];
for(i=0;i<4;i++) {
for(j=0;j<4;j++) {
Block[i][j]=0;
}
}
switch(rand() % 7){
case 0:
Block[1][1]=1; Block[2][1]=1; Block[1][2]=1; Block[2][2]=1;
for(i=0;i<4;i++) {
for(j=0;j<4;j++) {
if(Block[i][j]){
printf("■");
}else{
printf(" ");
}
}
printf("\n");
}
return;
case 1:
Block[1][0]=1; Block[1][1]=1; Block[1][2]=1; Block[1][3]=1;
for(i=0;i<4;i++) {
for(j=0;j<4;j++) {
if(Block[i][j])
printf("■");
}else{
printf(" ");
}
}
printf("\n");
}
return;
case 2:
Block[1][1]=1; Block[1][2]=1; Block[2][2]=1; Block[1][3]=1;
for(i=0;i<4;i++) {
for(j=0;j<4;j++) {
if(Block[i][j])
printf("■");
}else{
printf(" ");
}
}
printf("\n");
}
return;
case 3:
Block[1][1]=1; Block[2][1]=1; Block[1][2]=1; Block[1][3]=1;
for(i=0;i<4;i++) {
for(j=0;j<4;j++) {
if(Block[i][j])
printf("■")
}else{
printf(" ");
}
}
printf("\n");
}
return;
case 4:
Block[1][1]=1; Block[2][1]=1; Block[2][2]=1; Block[2][3]=1;
for(i=0;i<4;i++) {
for(j=0;j<4;j++) {
if(Block[i][j])
printf("■");
}else{
printf(" ");
}
}
printf("\n");
}
return;
case 5:
Block[2][1]=1; Block[1][2]=1; Block[2][2]=1; Block[1][3]=1;
for(i=0;i<4;i++) {
for(j=0;j<4;j++) {
if(Block[i][j])
printf("■");;
}else{
printf(" ");
}
}
printf("\n");
}
return;
case 6:
Block[1][1]=1; Block[1][2]=1; Block[2][2]=1; Block[2][3]=1;
for(i=0;i<4;i++) {
for(j=0;j<4;j++) {
if(Block[i][j])
printf("■");
}else{
printf(" ");
}
}
printf("\n");
}
return;
}
}
int main(){
int i,j;
char Block[i][j];
srand((unsigned int)time(NULL));
for(i=0;i<10;i++){
printf("%c", createBlock());
}
return 0;
}
案としてはランダムの数を7で割った余りで
そのあまりが0なら正方形のブロック、
1なら横棒のブロックが生成されるというブロックを作っているつもりなのですが
間違っているでしょうか?
これを表示することもできません。
③ブロックをフィールドで移動させる
まずブロックフィールド4×4の左上の部分がフィールドのi=1,j=4の部分から落ちるように設定し
そのままキーボードのカーソル右を押すとブロックが右に
左を押すとブロックが左に
上を押すと回転
下を押すと落下といった風にしたいのですがどうしたらいいのでしょうか?
また下までブロックが落ちると次のブロックがまたランダムで選ばれて下りてくるようにするにはどうしたらいいでしょうか?
④衝突判定
ブロックが回転しようとしたときに
横の壁にあたったり
落下しているときや移動しているときに下の壁やすでに存在するブロックと衝突したときにエラーがでるように設定するにはどうしたらいいんでしょうか?
たぶん壁を1、ブロックも1、フィールドを0、ブロックフィールドのブロックがない部分は0という風にしているので
1が重なるときはその操作を無効にするといった方法がただしいんでしょうか?
どのようにソースを書けばいいのでしょうか?
⑤ゲームオーバー処理
一番上まできても動けなくなった時にゲームオーバーになって
CONTINUE?[Y/N]と聞き
Yならばもう一度はじめから
Nならばプログラミングを終了といった風に設定したいです
どのようにすればいいでしょうか?
全然わからないことだらけで申し訳ないですが
ちょっとでもいいので力を貸していただけませんか?
よろしくお願いします。
返信まってます