C语言---------俄罗斯方块(源代码)
#include<stdio.h>
#include<windows.h>//字體顏色,窗口
#include<conio.h>
#include<stdlib.h>
#include<time.h>
#include <mmsystem.h>
#pragma comment(lib,“winmm.lib”)
#define zuobiaox 13 //游戲窗口左上角的x軸坐標
#define zuobiaoy 3 //游戲窗口左上角y軸的坐標
#define height 20 //游戲窗口的高度
#define width 20 //游戲窗口的寬度
int i, j, Temp, Temp1, Temp2;
int a[80][80] = { 0 }; //標記游戲屏幕的圖案:2表示游戲邊框,1表示方塊,0表無圖案
int b[4];//標記4個口方塊,0表示沒有方塊1表示有方塊
struct fangkuai
{
int x;
int y;
int flag;
int next;
int speed;
int number;
int score;
int level;
};
HANDLE hOUT;//控制臺句柄
int color(int c);//控制臺中的文字顏色
void gotoxy(int x, int y);//光標移動到指定位置
void drwa();//繪制游戲邊框
void falg(struct fangkuai *);//隨機產生方塊類型的序號
void makefangkuai(struct fangkuai *);//繪制俄羅斯方塊
void printffangkuai(struct fangkuai *);//打印俄羅斯方塊
void clean(struct fangkuai *);//清楚方塊的痕跡
int ifmove(struct fangkuai *);//判斷是否能移動,返回值為1能移動
void del(struct fangkuai *);//滿行刪減
void gameplay();
void regulation();//游戲規則
void explation();//按鍵說明
void welcome();//歡迎界面
void replay(struct fangkuai *);//重新開始
void title();//歡迎界面上方的標題
void flower();//裝飾
void close();//關閉游戲
//獲取光標的位置
void gotoxy(int x, int y)
{
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
//控制文字顏色
int color(int c)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);
return 0;
}
//制作游戲窗口
void drwa()
{
gotoxy(zuobiaox + width - 7, zuobiaoy - 2);
color(11);
printf(“Welcome to the game!”);
gotoxy(zuobiaox + 2 * width + 3, zuobiaoy + 8);
color(2);
printf("***************************");
gotoxy(zuobiaox + 2 * width + 3, zuobiaoy + 7);
color(3);
printf("下一出現方塊: “);
gotoxy(zuobiaox + 2 * width + 3, zuobiaoy + 13);
color(2);
printf(”**************************");
gotoxy(zuobiaox + 2 * width + 3, zuobiaox + 17);
color(14);
printf(“↑鍵:旋轉”);
gotoxy(zuobiaox + 2 * width + 3, zuobiaox + 19);
printf(“空格:暫停游戲”);
gotoxy(zuobiaox + 2 * width + 3, zuobiaoy + 15);
printf(“Esc:退出游戲”);
gotoxy(zuobiaox, zuobiaoy);
color(12);
printf(“╔”);
gotoxy(zuobiaox + 2 * width - 2, zuobiaoy);
printf(“╗”);
gotoxy(zuobiaox, zuobiaoy + height);
printf(“╚”);
gotoxy(zuobiaox + 2 * width - 2, zuobiaoy + height);
printf(“╝”);
a[zuobiaox][zuobiaoy + height] = 2;//記住該處已有的圖案
a[zuobiaox + 2 * width - 2][zuobiaoy + height] = 2;
for (i = 2; i < 2 * width; i += 2)
{
gotoxy(zuobiaox + i, zuobiaoy);
printf(“═”);//打印橫框
}
for (i = 2; i < 2 * width - 2; i += 2)
{
gotoxy(zuobiaox + i, zuobiaoy + height);
printf(“═”);//打印下橫框
a[zuobiaox + i][ zuobiaoy + height] = 2;
}
for (i = 1; i < height; i++)
{
gotoxy(zuobiaox, zuobiaoy + i);
printf(“║”);//打印左豎框
a[zuobiaox][zuobiaoy + i] = 2;//記住左豎框有圖案
}
for (i = 1; i < height; i++)
{
gotoxy(zuobiaox + 2 * width - 2, zuobiaoy + i);
printf(“║”);//打印左豎框
a[zuobiaox+2width-2][zuobiaoy + i] = 2;//記住左豎框有圖案
}
}
void makefangkuai(struct fangkuai Fangkuai)
{
a[Fangkuai->x][Fangkuai->y] = b[0];//中心方塊位置的圖形狀態
switch (Fangkuai->flag)//共七大類,19種類型
{
case 1: //田字方塊
{
color(10);
a[Fangkuai->x][Fangkuai->y - 1] = b[1];
a[Fangkuai->x + 2][Fangkuai->y-1]=b[2];
a[Fangkuai->x + 2][Fangkuai->y] = b[3];
break;
}
case 2://直線方塊■■■
{
color(13);
a[Fangkuai->x - 2][Fangkuai->y] = b[1];
a[Fangkuai->x + 2][Fangkuai->y] = b[2];
a[Fangkuai->x + 4][Fangkuai->y] = b[3];
break;
}
case 3://直線方塊
/ ■
■
■*/
}
/打印俄羅斯方塊/
void printffangkuai(struct fangkuai *Fangkuai)
{
for (i = 0; i < 4; i++)
{
b[i] = 1;//數組b[4]的每個元素的值都是1
}
makefangkuai(Fangkuai);
for (i = Fangkuai->x - 2; i <= Fangkuai->x + 4; i += 2)
{
for (j = Fangkuai->y - 2; j <= Fangkuai->y + 1; j++)
{
if (a[i][j] == 1 && j > zuobiaoy)//j>zuobiaoy是框定圖案在框中才有
{
gotoxy(i, j);
printf(“■”);
}
}
}
//打印菜單信息
gotoxy(zuobiaox + 2 * width + 3, zuobiaoy + 1);
color(4);
printf(“level:”);
color(12);
printf("%d", Fangkuai->level);
gotoxy(zuobiaoy + 2 * width + 13, zuobiaoy + 3);
color(4);
printf(“score:”);
color(12);
printf("%d", Fangkuai->score);
gotoxy(zuobiaox + 2 * width + 3, zuobiaoy + 5);
color(4);
printf(“speed:”);
color(12);
printf("%d", Fangkuai->speed);
}
/判斷是否可移動/
int ifmove(struct fangkuai* Fangkuai)
{
if (a[Fangkuai->x][Fangkuai->y] != 0) //當中心方塊位置上有圖案時,返回值為0,既不可移動
{
return 0;
}
else
{//當為田字方塊且中心方塊位置外,其他■字方塊位置上無圖案時,說明這個位置能夠放下田字方塊,可以移動到這個位置,返回值為1,即可移動
//比如田字方塊,它的中心方塊時左下角的■,如果它的上,右,右上的位置為空,則這個位置就可以放一個田字方塊;如果有一個位置上不為空,都放不下一個田
}
/隨機產生俄羅斯方塊類型的序號/
void flag(struct fangkuai *Fangkuai)
{
Fangkuai->number++;//記住產生方塊的個數
srand(time(NULL));
if (Fangkuai->number == 1)
{
Fangkuai->flag = rand() % 19 + 1;//記住第一個方塊的序號
}
Fangkuai->next = rand() % 19 + 1;//記住下一個方塊的序號
}
/清除痕跡/
void clean(struct fangkuai *Fangkuai)
{
for (i = 0; i < 4; i++)
b[i] = 0;//數組b[4]的每個元素的值都為0
makefangkuai(Fangkuai);
for (i = Fangkuai->x - 2; i <= Fangkuai->x + 4; i += 2)
{
for (j = Fangkuai->y - 2; j <= Fangkuai->y + 1; j++)
{
if (a[i][j] == 0 && j > zuobiaoy)
{
gotoxy(i, j);
printf(" “);
}
}
}
}
/判斷是否滿行并刪減/
void del(struct fangkuai *Fangkuai)//當某行有width-2個方塊時,則滿行消除
{
int k=0, Del = 0;//分別用于記錄某行方塊的個數和刪除方塊的行數的變量
for (j = zuobiaoy + height ; j >= zuobiaoy + 1; j–)
{
for (i = zuobiaox + 2; i < zuobiaox + 2 * width - 2; i += 2)
{
if (a[i][j] == 1)//豎坐標依次從下往上,橫坐標依次由左至右判斷是否滿行
{
k++;//記錄此行方塊的個數
if (k == width - 2)//如果滿行
{
for (k = zuobiaox + 2; k < zuobiaox + 2 * width - 2; k += 2)//刪除滿行的方塊
{
a[k][j] = 0;
gotoxy(k, j);
printf(” “);
}
for (k = j - 1; k > zuobiaoy; k–)//如果刪除行以上的位置有方塊,則先清除,再將方塊下移一個位置
{
for (i = zuobiaox + 2; i < zuobiaox + 2 * width - 2; i += 2)
{
if (a[i][k] == 1)
{
a[i][k] = 0;
gotoxy(i, k);
printf(” ");
a[i][k + 1] = 1;
gotoxy(i, k + 1);
printf(“■”);
}
}
}
j++;//方塊下移后,重新判斷刪除行是否滿行
Del++;//記錄刪除方塊的行數
}
}
}
}
Fangkuai->score += 100 * Del;//沒刪除一行,得100分
if (Del > 0 && (Fangkuai->score % 200 == 0 || Fangkuai->score / 200 > Fangkuai->level - 1))
{
}
void gameplay()
{
int n;
struct fangkuai t, *Fangkuai = &t;//定義結構體的指針并指向結構體變量
char ch;//接受鍵盤輸入的變量
Fangkuai->number = 0;
Fangkuai->speed = 150;
Fangkuai->score = 0;
Fangkuai->level = 1;
while (1)
{
flag(Fangkuai);//隨機方塊序號
Temp = Fangkuai->flag;//記住當前方塊序號
Fangkuai->x = zuobiaox + 2 * width + 6;//獲得預覽界面方塊的x坐標
Fangkuai->y = zuobiaoy + 10;//獲得預覽界面方塊的y 坐標
Fangkuai->flag = Fangkuai->next;//獲得下一個序號
printffangkuai(Fangkuai);
Fangkuai->x = zuobiaox + width;//獲得游戲窗口中心方塊y的坐標
Fangkuai->y = zuobiaoy - 1;
Fangkuai->flag = Temp;//獲得當前的方塊序號
while (1)//控制方塊方向,直至方塊不再下移
{
label:printffangkuai(Fangkuai);//打印方塊
Sleep(Fangkuai->speed);
clean(Fangkuai);
Temp1 = Fangkuai->x;//記住當前中心方塊橫坐標的值
Temp2 = Fangkuai->flag;//記住當前方塊的序號
if (kbhit())
{
ch = getch();
if (ch == 75)//按←向左
{
Fangkuai->x -= 2;
}
if (ch == 77)//→
{
Fangkuai->x += 2;
}
if (ch == 80)//↓加快下落
{
if (ifmove(Fangkuai) != 0)
{
Fangkuai->y += 2;
}
if (ifmove(Fangkuai) == 0)
{
Fangkuai->y = zuobiaoy + height - 2;
}
}
if (ch == 72)//↑變形
{
if (Fangkuai->flag >= 2 && Fangkuai->flag <= 3)
{
Fangkuai->flag++;
Fangkuai->flag %= 2;
Fangkuai->flag += 2;
}
void replay(struct fangkuai*)
{
system(“cls”);
memset(a, 0, 6400 * sizeof(int));
drwa();
gameplay();
}
int main()
{
title();
mciSendString(L"open D:\饒品德作品\ConsoleApplication1\aa.mp3", NULL, 0, 0);
mciSendString(L"play D:\饒品德作品\ConsoleApplication1\aa.mp3", NULL, 0, 0);
flower();
welcome();
}
/歡迎界面/
void welcome()
{
int n;
int i, j = 1;
color(14);
for (i = 9; i <= 20; i++)//輸出上下邊框
{
for (j = 15; j <= 60; j++)//輸出左右邊框
{
gotoxy(j, i);
if (i == 9 || i == 20)
printf("=");
else if (j == 15 || j == 59)
printf("||");
}
void title()
{
color(15);
gotoxy(16, 3);
printf(“趣 味 俄 羅 斯 方 塊\n”);
color(11);
gotoxy(18, 5);
printf(“■”);
gotoxy(18, 6);
printf(“■■”);
gotoxy(18, 7);
printf(“■”);
}
void flower()
{
gotoxy(66, 11);
color(12);
printf("()");
gotoxy(64, 12);
printf("()");
gotoxy(66, 13);
printf("()");
gotoxy(67, 12);
color(6);
printf("@");
gotoxy(72, 10);
color(13);
printf("()");
gotoxy(76, 10);
printf("()");
gotoxy(74, 9);
printf("()");
gotoxy(74, 11);
printf("(_)");
gotoxy(75, 10);
color(6);
printf("@");
gotoxy(71, 12);
printf("|");
gotoxy(72, 11);
printf("/");
gotoxy(70, 13);
printf("\|");
gotoxy(70, 14);
printf("~|/");
gotoxy(70, 15);
printf("\|");
gotoxy(71, 16);
printf("|/");
gotoxy(71, 17);
printf("|");
gotoxy(67, 17);
color(10);
printf("///");
gotoxy(73, 17);
printf("//");
gotoxy(67, 18);
color(2);
printf("^^^^^^^");
}
void close()
{
exit(0);
}
void explation()
{
int i, j = 1;
system(“cls”);
color(13);
gotoxy(32, 3);
printf(“按鍵說明”);
color(2);
for (i = 6; i <= 16; i++)
{
for (j = 15; j <= 60; j++)
{
gotoxy(j, i);
if (i == 6 || i == 16)
printf("=");
else if (j == 15 || j == 59) printf("||");
}
}
color(3);
gotoxy(18, 7);
printf(“玩家可通過←→移動方塊”);
color(10);
gotoxy(18, 9);
printf(“↑使方塊旋轉”);
color(14);
gotoxy(18, 11);
printf(“↓加速下落”);
color(11);
gotoxy(18, 13);
printf(“空格暫停,Esc退出”);
getch();
system(“cls”);
main();
}
void regulation()
{
int i, j = 1;
system(“cls”);
color(13);
gotoxy(34, 3);
printf(“游戲規則”);
color(2);
for (i = 6; i <= 18; i++)
{
for (j = 12; j <= 70; j++)
{
gotoxy(j, i);
if (i == 6 || i == 18) printf("=");
else if (j == 12 || j == 69) printf("||");
}
}
color(12);
gotoxy(16, 7);
printf(“每消除一行,積分增加100”);
color(11);
gotoxy(16, 15);
printf(“每積累1000分提升一個等級”);
getch();
system(“cls”);
welcome();
}
//注意:
主函數中:
mciSendString(L"open D:\饒品德作品\ConsoleApplication1\aa.mp3", NULL, 0, 0);
mciSendString(L"play D:\饒品德作品\ConsoleApplication1\aa.mp3", NULL, 0, 0);
這兩句作用是添加 背景音樂,你需要下載一首歌曲,格式如上代碼所示,把歌曲路徑放入與代碼相同的文件中,aa.mp3就是XXX.mp3,歌曲名字而已,說的不詳細,這個可以百度搜。
總結
以上是生活随笔為你收集整理的C语言---------俄罗斯方块(源代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 接口Interface和抽象类abstr
- 下一篇: [转]Xcode的重构功能