ページ 11

テトリスのコードが実行できない....

Posted: 2015年3月17日(火) 16:04
by XIII
MacのXcode環境で下記のテトリスのコードを実行したところ、ビルドエラーがでて先にすすみません。
エラーの内容は
・Apple Match-O Linker(id) Error
"Initialize()",referenced from:

・Apple Match-O Linker(id) Error
Linker command failed with exit code 1(use -v to see invocation)

てでます。


このソースコードをWindowsのVisual Studioでも実行してみたところ
エラーがでて、上手くいきませんでした。


#include <stdio.h>
#include <stdlib.h>


int stage[21][12] = {0};

int block[4][4] =
{{0,0,0,0},
{0,1,1,0},
{0,1,1,0},
{0,0,0,0}};

int field[21][12] = {0};

int y = 0; //ブロックのステージ上でのy座標
int x = 4; //ブロックのステージ上でのx座標
int gameover = 0; //ゲームオーバー判定。1でゲームオーバー


//関数プロトタイプ宣言
void Initialize();
int CreateBlock();
void ShowGameField();
void MoveBlock(int,int);
int CheckOverlap(int,int);
void LockBlock();

int main(){
int time = 0;

Initialize();//ステージの初期化

while(!gameover){
if(time < 8000000){
time++;
}
else{
//重なりがなければ移動
if(!CheckOverlap(x,y+1)){
MoveBlock(x,y+1);
}
//重なりがあれば壁にする
else{
LockBlock();
CreateBlock();
ShowGameField();
}
time = 0;
}
}
return 0;
}

void Initailize(){
int i,j; //forループ制御用変数

//画面と壁を初期設定
for(i = 0; i < 20;i++){
for(j = 0;j < 11;j++){

if(j == 0 || j == 11 || i == 20){
field[j] = stage[j] = 9;
}
else{
field[j] = stage[j] = 0;
}
}
}
CreateBlock();
ShowGameField(); //ゲーム直後の画面を描画
}

int CreateBlock(){
int i,j;

//ブロックの座標を最上段中央にセット
x = 4;
y = 0;

for(i = 0;i < 4;i++){
for(j = 0;j < 4;j++){
field[j+4] = stage[j+4] + block[j];

//初期位置に置いたブロックがすでに固定ブロックにかさなって
//いればゲームオーバー
if(field[j+4]>1){
gameover = 1;
return 1;
}
}
}
return 0;
}

//画面表示
void ShowGameField(){
int i,j; //forループ制御用変数

//画面を一旦クリア
system("cls");

//データに応じてブロックや空白を画面表示
for(i = 0; i < 21;i++){
for(j = 0; j < 12;j++){

switch(field[j]){
case 0:
printf(" ");
break;
case 9:
printf("◻︎");
break;
default:
printf("▪︎");
break;
}
}
printf("\n");
}
//ゲームオーバーの場合はGAME OVERを表示
if(gameover){
system("cls");
printf("\n\n\n\n\nGAME OVER\n\n");
}
}

void MoveBlock(int x2,int y2){
int i,j; //forループ制御用変数

//今までのブロックを消して
for(i = 0; i < 4;i++){
for(j = 0; j < 4;j++){
field[y+i][x+j] -= block[j];
}
}
//ブロックの座標を更新
x = x2;
y = y2;

//新しい座標でブロックをおれなおす
for(i =0;i < 4;i++){
for(j = 0;j < 4;j++){
field[y+i][x+j] += block[i][j];
}
}
ShowGameField();
}

int CheckOverlap(int x2,int y2){
int i,j; //forループ制御用変数

//ブロックが向かう位置に固定ブロックもしくは壁があるかどうかを検査
for(i = 0;i < 4;i++){
for(j = 0;j < 4;j++){
if(block[i][j]){
if(stage[y2 + i][x2 + j] !=0)
return 1;
}
}
}
return 0;
}

void LockBlock(){
int i,j; //forループ制御用変数

//ブロックを壁に加える
for(i =0; i < 21;i++){
for(j = 0 ;j < 12;j++){

stage[i][j] = field[i][j];
}
}
}


このコードはまだ制作段階ですが、実行して確認できずに
困っています。
どなたか、原因をおしえてください。

Re: テトリスのコードが実行できない....

Posted: 2015年3月17日(火) 17:07
by みけCAT
適切なインデントをされたコードはBBcodeを有効にした状態でcodeタグで囲んでいただけると、見やすくてありがたいです。
XIII さんが書きました:どなたか、原因をおしえてください。
原因はInitialize関数の実体が無いことです。
コードの最後に

コード:

void Initialize(void) {}
という1行を追加すると、コンパイルは通るはずです。

Re: テトリスのコードが実行できない....

Posted: 2015年3月18日(水) 10:14
by lbfuvab
読みづらいのでインデントは付けてください。

後、画面消去をsystem("cls")でやっている様ですが、これは画面がチラつくので良くないです。
消さずに上書きすれば良いです。