c語言寫俄羅斯方塊的教程「簡單俄羅斯方塊程序代碼」

C/C++編程入門基礎系列:俄羅斯方塊小遊戲製作,直接源代碼分享

1.要先下載一個 graphics.h 的頭文件來繪圖。

2.初始化窗口:initgraph(x, y);這是先創建一個窗口的函數,以左上角為(0,0),向右為x軸,向下為y軸,其中x表示長x個單位,y表示寬y個單位。

3.關閉圖像窗口:closegraph();結束時用來關閉用的。

4.按任意鍵繼續:getch();這個就和getchar();差不多,為了防止以運行完就關了,這樣能停頓一下,他的頭文件是:conio.h 。

5.畫線:line(x1, y1, x2, y2);在你創建的那麼窗口裡以(x1,y1)和(x2,y2)為兩個端點畫線。

6.畫矩形:rectangle(x1,y1,x2,y2);以(x1,y1)和(x2,y2)為對角畫一個矩形。

7.畫圓:circle(x,y,r);以(x,y)為圓點,r為半徑畫圓。

8.顏色:setcolor(x);用來設置顏色的,其中x是你要設置的顏色,可以填這16種:黑 BLACK、藍 BLUE、綠 GREEN、青 CYAN、紅 RED、紫 MAGENTA、棕 BROWN、淺灰 LIGHTGRAY、深灰 DARKGRAY、亮藍 LIGHTBLUE、亮綠 LIGHTGREEN、亮青 LIGHTCYAN、亮紅 LIGHTRED、亮紫 LIGHTMAGENTA、黃 YELLOW、白 WHITE;當然,你也可以根據光的三原色來調自己喜歡的顏色,方法是:setcolor(RGB(x,y,z));其中RGB分別代表紅綠藍,對應的x,y,z是你選的該顏色的多少,範圍是[0,255]。

C/C++編程入門基礎系列:俄羅斯方塊小遊戲製作,直接源代碼分享

#include <stdio.h>

#include <windows.h>

#include <conio.h>

#include <time.h>

//遊戲窗口

#define FrameX 4 //遊戲窗口左上角的X軸坐標

#define FrameY 4 //遊戲窗口左上角的Y軸坐標

#define Frame_height 20 //遊戲窗口的高度

#define Frame_width 18 //遊戲窗口的寬度

//定義全局變量

int i,j,temp,temp1,temp2; //temp,temp1,temp2用於記住和轉換方塊變量的值

int a[80][80]={0}; //標記遊戲屏幕的圖案:2,1,0分別表示該位置為遊戲邊框、方塊、無圖案;初始化為無圖案

int b[4]; //標記4個”口”方塊:1表示有方塊,0表示無方塊

//聲明俄羅斯方塊的結構體

struct Tetris

{

int x; //中心方塊的x軸坐標

int y; //中心方塊的y軸坐標

int flag; //標記方塊類型的序號

int next; //下一個俄羅斯方塊類型的序號

int speed; //俄羅斯方塊移動的速度

int count; //產生俄羅斯方塊的個數

int score; //遊戲的分數

int level; //遊戲的等級

};

//函數原型聲明

//光標移到指定位置

void gotoxy(HANDLE hOut, int x, int y);

//製作遊戲窗口

void make_frame();

//隨機產生方塊類型的序號

void get_flag(struct Tetris *);

//製作俄羅斯方塊

void make_tetris(struct Tetris *);

//打印俄羅斯方塊

void print_tetris(HANDLE hOut,struct Tetris *);

//清除俄羅斯方塊的痕迹

void clear_tetris(HANDLE hOut,struct Tetris *);

//判斷是否能移動,返回值為1,能移動,否則,不動

int if_moveable(struct Tetris *);

//判斷是否滿行,並刪除滿行的俄羅斯方塊

void del_full(HANDLE hOut,struct Tetris *);

//開始遊戲

void start_game();

void main()

{

//製作遊戲窗口

make_frame();

//開始遊戲

start_game();

}

/******光標移到指定位置**************************************************************/

void gotoxy(HANDLE hOut, int x, int y)

{

COORD pos;

pos.X = x; //橫坐標

pos.Y = y; //縱坐標

SetConsoleCursorPosition(hOut, pos);

}

/******製作遊戲窗口******************************************************************/

void make_frame()

{

HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //定義顯示器句柄變量

gotoxy(hOut,FrameX+Frame_width-5,FrameY-2); //打印遊戲名稱

printf(“俄羅斯方塊”);

gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+7); //打印選擇菜單

printf(“**********下一個方塊:”);

gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+13);

printf(“**********”);

gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+17);

printf(“↑鍵:變體”);

gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+19);

printf(“空格:暫停遊戲”);

gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+15);

printf(“Esc :退出遊戲”);

gotoxy(hOut,FrameX,FrameY); //打印框角並記住該處已有圖案

printf(“╔”);

gotoxy(hOut,FrameX+2*Frame_width-2,FrameY);

printf(“╗”);

gotoxy(hOut,FrameX,FrameY+Frame_height);

printf(“╚”);

gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+Frame_height);

printf(“╝”);

a[FrameX][FrameY+Frame_height]=2;

a[FrameX+2*Frame_width-2][FrameY+Frame_height]=2;

for(i=2;i<2*Frame_width-2;i+=2)

{

gotoxy(hOut,FrameX+i,FrameY);

printf(“═”); //打印上橫框

}

for(i=2;i<2*Frame_width-2;i+=2)

{

gotoxy(hOut,FrameX+i,FrameY+Frame_height);

printf(“═”); //打印下橫框

a[FrameX+i][FrameY+Frame_height]=2; //記住下橫框有圖案

}

for(i=1;i<Frame_height;i++)

{

gotoxy(hOut,FrameX,FrameY+i);

printf(“║”); //打印左豎框

a[FrameX][FrameY+i]=2; //記住左豎框有圖案

}

for(i=1;i<Frame_height;i++)

{

gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+i);

printf(“║”); //打印右豎框

a[FrameX+2*Frame_width-2][FrameY+i]=2; //記住右豎框有圖案

}

}

/******製作俄羅斯方塊********************************************************************/

void make_tetris(struct Tetris *tetris)

{

a[tetris->x][tetris->y]=b[0]; //中心方塊位置的圖形狀態:1-有,0-無

switch(tetris->flag) //共6大類,19種類型

{

case 1: //田字方塊

{

a[tetris->x][tetris->y-1]=b[1];

a[tetris->x+2][tetris->y-1]=b[2];

a[tetris->x+2][tetris->y]=b[3];

break;

}

case 2: //直線方塊:—-

{

a[tetris->x-2][tetris->y]=b[1];

a[tetris->x+2][tetris->y]=b[2];

a[tetris->x+4][tetris->y]=b[3];

break;

}

case 3: //直線方塊: |

{

a[tetris->x][tetris->y-1]=b[1];

a[tetris->x][tetris->y-2]=b[2];

a[tetris->x][tetris->y+1]=b[3];

break;

}

case 4: //T字方塊

{

a[tetris->x-2][tetris->y]=b[1];

a[tetris->x+2][tetris->y]=b[2];

a[tetris->x][tetris->y+1]=b[3];

break;

}

case 5: //T字順時針轉90度方塊

{

a[tetris->x][tetris->y-1]=b[1];

a[tetris->x][tetris->y+1]=b[2];

a[tetris->x-2][tetris->y]=b[3];

break;

}

case 6: //T字順時針轉180度方塊

{

a[tetris->x][tetris->y-1]=b[1];

a[tetris->x-2][tetris->y]=b[2];

a[tetris->x+2][tetris->y]=b[3];

break;

}

case 7: //T字順時針轉270度方塊

{

a[tetris->x][tetris->y-1]=b[1];

a[tetris->x][tetris->y+1]=b[2];

a[tetris->x+2][tetris->y]=b[3];

break;

}

case 8: //Z字方塊

{

a[tetris->x][tetris->y+1]=b[1];

a[tetris->x-2][tetris->y]=b[2];

a[tetris->x+2][tetris->y+1]=b[3];

break;

}

case 9: //Z字順時針轉90度方塊

{

a[tetris->x][tetris->y-1]=b[1];

a[tetris->x-2][tetris->y]=b[2];

a[tetris->x-2][tetris->y+1]=b[3];

break;

}

case 10: //Z字順時針轉180度方塊

{

a[tetris->x][tetris->y-1]=b[1];

a[tetris->x-2][tetris->y-1]=b[2];

a[tetris->x+2][tetris->y]=b[3];

break;

}

case 11: //Z字順時針轉270度方塊

{

a[tetris->x][tetris->y+1]=b[1];

a[tetris->x+2][tetris->y-1]=b[2];

a[tetris->x+2][tetris->y]=b[3];

break;

}

case 12: //7字方塊

{

a[tetris->x][tetris->y-1]=b[1];

a[tetris->x][tetris->y+1]=b[2];

a[tetris->x-2][tetris->y-1]=b[3];

break;

}

case 13: //7字順時針轉90度方塊

{

a[tetris->x-2][tetris->y]=b[1];

a[tetris->x-2][tetris->y+1]=b[2];

a[tetris->x+2][tetris->y]=b[3];

break;

}

case 14: //7字順時針轉180度方塊

{

a[tetris->x][tetris->y-1]=b[1];

a[tetris->x][tetris->y+1]=b[2];

a[tetris->x+2][tetris->y+1]=b[3];

break;

}

case 15: //7字順時針轉270度方塊

{

a[tetris->x-2][tetris->y]=b[1];

a[tetris->x+2][tetris->y-1]=b[2];

a[tetris->x+2][tetris->y]=b[3];

break;

}

case 16: //倒7字方塊

{

a[tetris->x][tetris->y+1]=b[1];

a[tetris->x][tetris->y-1]=b[2];

a[tetris->x+2][tetris->y-1]=b[3];

break;

}

case 17: //倒7字順指針轉90度方塊

{

a[tetris->x-2][tetris->y]=b[1];

a[tetris->x-2][tetris->y-1]=b[2];

a[tetris->x+2][tetris->y]=b[3];

break;

}

case 18: //倒7字順時針轉180度方塊

{

a[tetris->x][tetris->y-1]=b[1];

a[tetris->x][tetris->y+1]=b[2];

a[tetris->x-2][tetris->y+1]=b[3];

break;

}

case 19: //倒7字順時針轉270度方塊

{

a[tetris->x-2][tetris->y]=b[1];

a[tetris->x+2][tetris->y+1]=b[2];

a[tetris->x+2][tetris->y]=b[3];

break;

}

}

}

//******判斷是否可動*************************************************************************/

int if_moveable(struct Tetris *tetris)

{

if(a[tetris->x][tetris->y]!=0)//當中心方塊位置上有圖案時,返回值為0,即不可移動

{

return 0;

}

else

{

if( //當為田字方塊且除中心方塊位置外,其他”口”字方塊位置上無圖案時,返回值為1,即可移動

( tetris->flag==1 && ( a[tetris->x][tetris->y-1]==0 &&

a[tetris->x+2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]==0 ) ) ||

//或為直線方塊且除中心方塊位置外,其他”口”字方塊位置上無圖案時,返回值為1,即可移動

( tetris->flag==2 && ( a[tetris->x-2][tetris->y]==0 &&

a[tetris->x+2][tetris->y]==0 && a[tetris->x+4][tetris->y]==0 ) ) ||

( tetris->flag==3 && ( a[tetris->x][tetris->y-1]==0 &&

a[tetris->x][tetris->y-2]==0 && a[tetris->x][tetris->y+1]==0 ) ) ||

( tetris->flag==4 && ( a[tetris->x-2][tetris->y]==0 &&

a[tetris->x+2][tetris->y]==0 && a[tetris->x][tetris->y+1]==0 ) ) ||

( tetris->flag==5 && ( a[tetris->x][tetris->y-1]==0 &&

a[tetris->x][tetris->y+1]==0 && a[tetris->x-2][tetris->y]==0 ) ) ||

( tetris->flag==6 && ( a[tetris->x][tetris->y-1]==0 &&

a[tetris->x-2][tetris->y]==0 && a[tetris->x+2][tetris->y]==0 ) ) ||

( tetris->flag==7 && ( a[tetris->x][tetris->y-1]==0 &&

a[tetris->x][tetris->y+1]==0 && a[tetris->x+2][tetris->y]==0 ) ) ||

( tetris->flag==8 && ( a[tetris->x][tetris->y+1]==0 &&

a[tetris->x-2][tetris->y]==0 && a[tetris->x+2][tetris->y+1]==0 ) ) ||

( tetris->flag==9 && ( a[tetris->x][tetris->y-1]==0 &&

a[tetris->x-2][tetris->y]==0 && a[tetris->x-2][tetris->y+1]==0 ) ) ||

( tetris->flag==10 && ( a[tetris->x][tetris->y-1]==0 &&

a[tetris->x-2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]==0 ) ) ||

( tetris->flag==11 && ( a[tetris->x][tetris->y+1]==0 &&

a[tetris->x+2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]==0 ) ) ||

( tetris->flag==12 && ( a[tetris->x][tetris->y-1]==0 &&

a[tetris->x][tetris->y+1]==0 && a[tetris->x-2][tetris->y-1]==0 ) ) ||

( tetris->flag==13 && ( a[tetris->x-2][tetris->y]==0 &&

a[tetris->x-2][tetris->y+1]==0 && a[tetris->x+2][tetris->y]==0 ) ) ||

( tetris->flag==14 && ( a[tetris->x][tetris->y-1]==0 &&

a[tetris->x][tetris->y+1]==0 && a[tetris->x+2][tetris->y+1]==0 ) ) ||

( tetris->flag==15 && ( a[tetris->x-2][tetris->y]==0 &&

a[tetris->x+2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]==0 ) ) ||

( tetris->flag==16 && ( a[tetris->x][tetris->y+1]==0 &&

a[tetris->x][tetris->y-1]==0 && a[tetris->x+2][tetris->y-1]==0 ) ) ||

( tetris->flag==17 && ( a[tetris->x-2][tetris->y]==0 &&

a[tetris->x-2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]==0 ) ) ||

( tetris->flag==18 && ( a[tetris->x][tetris->y-1]==0 &&

a[tetris->x][tetris->y+1]==0 && a[tetris->x-2][tetris->y+1]==0 ) ) ||

( tetris->flag==19 && ( a[tetris->x-2][tetris->y]==0 &&

a[tetris->x+2][tetris->y+1]==0 && a[tetris->x+2][tetris->y]==0 ) ) )

{

return 1;

}

}

return 0;

}

/******隨機產生俄羅斯方塊類型的序號**********************************************************/

void get_flag(struct Tetris *tetris)

{

tetris->count++; //記住產生方塊的個數

srand((unsigned)time(NULL)); //初始化隨機數

if(tetris->count==1)

{

tetris->flag = rand()%19+1; //記住第一個方塊的序號

}

tetris->next = rand()%19+1; //記住下一個方塊的序號

}

/******打印俄羅斯方塊**********************************************************************/

void print_tetris(HANDLE hOut,struct Tetris *tetris)

{

for(i=0;i<4;i++)

{

b[i]=1; //數組b[4]的每個元素的值都為1

}

make_tetris(tetris); //製作俄羅斯方塊

for( i=tetris->x-2; i<=tetris->x+4; i+=2 )

{

for(j=tetris->y-2;j<=tetris->y+1;j++)

{

if( a[i][j]==1 && j>FrameY )

{

gotoxy(hOut,i,j);

printf(“□”); //打印邊框內的方塊

}

}

}

//打印菜單信息

gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+1);

printf(“level : %d”,tetris->level);

gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+3);

printf(“score : %d”,tetris->score);

gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+5);

printf(“speed : %dms”,tetris->speed);

C/C++編程入門基礎系列:俄羅斯方塊小遊戲製作,直接源代碼分享

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/281903.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-21 13:20
下一篇 2024-12-21 13:20

相關推薦

發表回復

登錄後才能評論