0

シンプルな×と○のゲーム。1 ~ 9 のキーが押された場合は、ボード上の適切な場所に X または O を描画します。

7|8|9

4|5|6

1|2|3

コードは以下のとおりです。changePlayer() 関数はプレーヤー (含まれていません) を変更するだけで、board[0] を使用してどのプレーヤーであるかを保持します。

プログラム ボードを実行すると正しく表示されますが、キーを押しても X と O が描画されません。

すべてをバッファーに描画してから、バッファーを画面に描画しようとしましたが、うまくいきません。バッファを使用せず、すべてを画面に直接描画すると、完全に機能します!

私は単純なものが欠けていると確信しています:Sコードは次のとおりです:

int main()
{
int winner = 0;
BITMAP *xSprite;
BITMAP *oSprite;
BITMAP *newSprite;

int board[10];
int i = 0;

for(i=0; i<10; i++)
{
    board[i] = 0;
}

allegro_init();
install_keyboard();
set_color_depth(16);
set_gfx_mode( GFX_AUTODETECT, 1920, 1080, 0, 0);

xSprite = load_bitmap( "x.bmp", NULL);

oSprite = load_bitmap( "o.bmp", NULL);

BITMAP *buffer = create_bitmap(1920, 1080);

//draw black background
rectfill(buffer,0,0,1920,1080,makecol(0,0,0));
//draw white grid
line( buffer, 200, 0, 200, 480, makecol( 255, 255, 255));
line( buffer, 400, 0, 400, 480, makecol( 255, 255, 255));
line( buffer, 0, 150, 680, 150, makecol( 255, 255, 255));
line( buffer, 0, 300, 680, 300, makecol( 255, 255, 255));

acquire_screen();
blit(buffer, screen, 0, 0, 0, 0, 1920, 1080);
clear_bitmap(buffer);
release_screen();

while(!key[KEY_ESC])
{
  clear_keybuf();

  if (board[0] == 0)
    newSprite = xSprite;
  else
    newSprite = oSprite;

  acquire_screen();

  if(key[KEY_7] && board[7] == 0) {draw_sprite( screen, newSprite, 0, 0); board[7] = 1+board[0]; board[0] = changePlayer(board[0]);}
  if(key[KEY_8] && board[8] == 0) {draw_sprite( screen, newSprite, 200, 0); board[8] = 1+board[0]; board[0] = changePlayer(board[0]);}
  if(key[KEY_9] && board[9] == 0) {draw_sprite( screen, newSprite, 400, 0); board[9] = 1+board[0]; board[0] = changePlayer(board[0]);}

  if(key[KEY_4] && board[4] == 0) {draw_sprite( screen, newSprite, 0, 150); board[4] = 1+board[0]; board[0] = changePlayer(board[0]);}
  if(key[KEY_5] && board[5] == 0) {draw_sprite( screen, newSprite, 200, 150); board[5] = 1+board[0]; board[0] = changePlayer(board[0]);}
  if(key[KEY_6] && board[6] == 0) {draw_sprite( screen, newSprite, 400, 150); board[6] = 1+board[0]; board[0] = changePlayer(board[0]);}

  if(key[KEY_1] && board[1] == 0) {draw_sprite( screen, newSprite, 0, 300); board[1] = 1+board[0]; board[0] = changePlayer(board[0]);}
  if(key[KEY_2] && board[2] == 0) {draw_sprite( screen, newSprite, 200, 300); board[2] = 1+board[0]; board[0] = changePlayer(board[0]);}
  if(key[KEY_3] && board[3] == 0) {draw_sprite( screen, newSprite, 400, 300); board[3] = 1+board[0]; board[0] = changePlayer(board[0]);}

  release_screen();
}
return 0;

}   
END_OF_MAIN(); 
4

1 に答える 1

2

Allegro 4 は非常に古く、最新の OS では常にうまく動作するとは限らないことを考えると、いくつかの一般的な指針:

  • 始めたばかりの場合は、Allegro 5 を使用してください

  • set_color_depth(desktop_color_depth())互換性を最大限に高めるために常に使用してください。

  • GFX_GDI互換性を最大限に高めるために使用します。(明らかに最速のドライバーではありませんが、単純なゲームでは問題ありません。)

  • acquire_screen()使用しないでください。release_screen()

特定の問題については、投稿したコードが明らかに機能するため、何も言うことはありません。バッファを使用している場合は、もちろん、すべてのフレームで必ず画面にブリットする必要があります。

于 2012-12-23T05:42:29.020 に答える