這篇文章主要為大家詳細介紹了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]。
#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() 1; //記住第一個方塊的序号
}
tetris->next = rand() 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 編程知識,想要成為一個更加優秀的程序員,或者你學習C/C 的時候有難度,可以關注 私信小編【C/C 編程】,裡面不僅有學習視頻和文件資料,還有更多志同道合的朋友,和大家一起交流成長會比自己琢磨更快哦!
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!