本文目錄一覽:
- 1、用c語言編寫俄羅斯方塊程序 求詳解
- 2、C語言 掃雷
- 3、c語言 貪吃蛇 程序
- 4、c語言俄羅斯方塊問題
用c語言編寫俄羅斯方塊程序 求詳解
1、用C語言繪製圖形界面
EasyX圖形庫()即TC的圖形庫在VC下的移植。
包含庫#include graphics.h
先初始化圖形窗口
initgraph(WINDOW_WIDTH, WINDOW_HIGH) ;WINDOW_WIDTH為窗口的寬頻,WINDOW_HIGH為窗口的高度。
清空繪圖設備
cleardevice();
設置畫筆顏色
setcolor(RED) ;
設置線條風格
setlinestyle(PS_SOLID, NULL, 0);
畫矩形
rectangle
還有畫線、顯示文字等函數,可以參照其幫助文檔。
注意:由於我們用的是EasyX圖形庫,故源文件後綴要為.cpp,但其中內容都是C的語法。
2、存儲表示出俄羅斯方塊的形狀
一、我們可以用編號,不同的編號代表不同的俄羅斯方塊,根據編號把不同方塊的畫法寫在代碼中,這樣19種
方塊就得有19種相應的代碼來描繪。而且這樣擴展性不好,若以後設計了新的方塊,則需要更改大量源代碼。
二、我們很自然的想到可用字模點陣的形式來表示,即設置一個4行4列的數組,元素置1即代表這個位置有小
方塊,元素置0即代表這個位置無小方塊,這個整個的4*4的數組組成俄羅斯方塊的形狀。
1000
1000
1100
0000
這個方法挺靠譜,但我們還可以優化一下:不用4*4的數組,而是用16個bit位來表示這個點陣。這樣存儲起來比較方便,故我們用unsigned int 的低16位來表示方塊的點陣。
我們可以用掩碼與表示俄羅斯方塊的位進行操作,來識別並在屏幕上畫出方塊。
我們把俄羅斯方塊點陣的數位存在rockArray中,我們可以事先把這19種方塊的字模點陣自己轉化成十六進位,然後在rockArray數組的初始化時賦值進去。
但這樣做未免有點太費力,且擴展性也不太好,若以後設計的新方塊種類加入,要改變數組rockArray中的值。
我們可以考慮把所有俄羅斯方塊的點陣存儲在配置文件中,在程序初始化時讀取文件,把這些點陣轉換成unsigned int的變數存儲在rockArray中。
這樣,以後我們增添新的方塊形狀只需要在配置文件中增加新的點陣即可。
@###
@###
@@##
#### (為使得看起來更醒目,我們用@表示1,用#表示0)
3、讓圖形動起來
在某位置處用函數DrawRock在屏幕上畫出俄羅斯方塊,然後再擦除掉(即用背景色在原位置處重繪一次方塊),最後在下落的下一個位置處用函數DrawRock在屏幕上畫出俄羅斯方塊,如此循環,中間用計時器間隔一段時間以控制下落的速度。
同理,按下屏幕的左右鍵也是如此,只是在按下鍵盤時把方塊的位置重新計算了。
那麼按下上方向鍵時,如何讓方塊翻轉呢?
我們在配置文件中就把方塊的順時針翻轉形態放在了一起:
@###
@###
@@##
####
@@@#
@###
####
####
@@##
#@##
#@##
####
##@#
@@@#
####
####
我們每按一次上方向鍵改變一次方塊的形狀即可。若一直按上鍵,形狀應該是循環地翻滾。
我們想到了循環鏈表的數據結構可實現這個效果。
可是我們若把這些一種類的方塊的各種形態串成循環鏈表形式,那麼每次重新生成方塊時我們就難以隨機地生成方塊了。
故還是得用數組來存儲,但又要有循環鏈表的功能,於是我們想到了靜態循環鏈表。
我們用結構體來作為一個方塊在rockArray中的元素
typedef struct ROCK
{ //用來表示方塊的形狀(每一個位元組是8位,用每4位表示方塊中的一行)
unsigned int rockShapeBits ;
int nextRockIndex ; //下一個方塊,在數組中的下標
} RockType ;
這樣,當我們按下上方向鍵時,把傳入函數DrawRock中的rockIndex變為當前方塊結構體中的nextRockIndex即可。
參考資料:C語言圖形界面篇
C語言 掃雷
#includestdio.h
int main(void)
{
char plat[100][100]; //雷的地圖
char plat_new[100][100]; //數字映射圖
int n, m; //存儲行、列數
int in, im;
int mark = 0; //記錄該點附近8個坐標雷的總數
int j = 1;
scanf(“%d %d”, n, m);
getchar(); //消除回車符的影響
do {
if (n == 0 m == 0)
break;
for (in = 0; in n; in++)
{
for (im = 0; im m; im++)
{
scanf(“%c”, plat[in][im]);
}
getchar();
}
for (in = 0; in n; in++)
for (im = 0; im m; im++)
{
if (plat[in][im] == ‘*’) /*該點有雷,無需檢測*/
{
plat_new[in][im]= plat[in][im];
continue;
}
if (in – 1 = 0) //檢測上面3個點的雷數
{
if (plat[in – 1][im] == ‘*’)
mark++;
if (im – 1 = 0 plat[in -1][im – 1] == ‘*’)
mark++;
if (im + 1 mplat[in -1][im + 1] == ‘*’)
mark++;
}
if (im – 1 = 0 plat[in][im- 1] == ‘*’) //檢測左右兩個點的雷數
mark++;
if (im + 1 m plat[in][im+ 1] == ‘*’)
mark++;
if (in + 1 n) //檢測下面3個點的雷數
{
if (plat[in + 1][im] == ‘*’)
mark++;
if (im – 1 = 0 plat[in +1][im – 1] == ‘*’)
mark++;
if (im + 1 mplat[in +1][im + 1] == ‘*’)
mark++;
}
switch (mark)
{
case 0:plat_new[in][im] = ‘0’; break;
case 1:plat_new[in][im] = ‘1’; break;
case 2:plat_new[in][im] = ‘2’; break;
case 3:plat_new[in][im] = ‘3’; break;
case 4:plat_new[in][im] = ‘4’; break;
case 5:plat_new[in][im] = ‘5’; break;
case 6:plat_new[in][im] = ‘6’; break;
case 7:plat_new[in][im] = ‘7’; break;
case 8:plat_new[in][im] = ‘8’; break;
}
mark = 0; //重置雷數
}
if (j != 1)
putchar(‘\n’);
printf(“Field#%d:\n”, j);
for (in = 0; in n; in++) //列印數字地圖
{
for (im = 0; im m; im++)
{
printf(“%c”, plat_new[in][im]);
}
if(in!=n-1)
putchar(‘\n’);
}
scanf(“%d %d”, n, m);
getchar();
j++;
} while (1);
return 0;
}
c語言 貪吃蛇 程序
基本思路:
蛇每吃一個食物蛇身子就增加一格,用UP, DOWN, LEFT, RIGHT控制蛇頭的運動,而蛇身子跟著蛇頭走,每後一格蛇身子下一步走到上一格蛇身子的位置,以此類推。
#include stdio.h
#include conio.h
#include windows.h
#define BEG_X 2
#define BEG_Y 1
#define WID 20
#define HEI 20
HANDLE hout;
typedef enum {UP, DOWN, LEFT, RIGHT} DIR;
typedef struct Snake_body
{
COORD pos;//蛇身的位置
struct Snake_body *next;//下一個蛇身
struct Snake_body *prev;//前一個蛇身
}SNAKE, *PSNAKE;
PSNAKE head = NULL;//蛇頭
PSNAKE tail = NULL;//蛇尾
//畫遊戲邊框的函數
void DrawBorder()
{
int i, j;
COORD pos = {BEG_X, BEG_Y};
for(i = 0; i HEI; ++i)
{
SetConsoleCursorPosition(hout, pos);
for(j = 0; j WID; ++j)
{
if(i == 0)//第一行
{
if(j == 0)
printf(“┏”);
else if(j == WID – 1)
printf(“┓”);
else
printf(“━”);
}
else if(i == HEI – 1)//最後一行
{
if(j == 0)
printf(“┗”);
else if(j == WID – 1)
printf(“┛”);
else
printf(“━”);
}
else if(j == 0 || j == WID – 1)//第一列或最後一列
printf(“┃”);
else
printf(” “);
}
++pos.Y;
}
}
//添加蛇身的函數
void AddBody(COORD pos)
{
PSNAKE pnew = (PSNAKE)calloc(1, sizeof(SNAKE));
pnew-pos = pos;
if(!head)
{
head = tail = pnew;
}
else
{
pnew-next = head;//新創建蛇身的next指向原先的蛇頭
head-prev = pnew;//原先的蛇頭的prev指向新創建的蛇身
head = pnew;//把新創建的蛇身作為新的蛇頭
}
SetConsoleCursorPosition(hout, head-pos);
printf(“◎”);
}
//蛇身移動的函數
void MoveBody(DIR dir)
{
PSNAKE ptmp;
COORD pos = head-pos;
switch(dir)
{
case UP:
if(head-pos.Y BEG_Y + 1)
–pos.Y;
else
return;
break;
case DOWN:
if(head-pos.Y BEG_Y + HEI – 2)
++pos.Y;
else
return;
break;
case LEFT:
if(head-pos.X BEG_X + 2)
pos.X -= 2;
else
return;
break;
case RIGHT:
if(head-pos.X BEG_X + (WID – 2) * 2)
pos.X += 2;
else
return;
break;
}
AddBody(pos);//添加了一個新的蛇頭
ptmp = tail;//保存當前的蛇尾
tail = tail-prev;
if(tail)
tail-next = NULL;
SetConsoleCursorPosition(hout, ptmp-pos);
printf(” “);
free(ptmp);
}
int main()
{
int ctrl;
DIR dir = RIGHT;//初始蛇的方向是向右的
COORD pos = {BEG_X + 2, BEG_Y + HEI / 2};
system(“color 0E”);
system(“mode con cols=90 lines=30”);
hout = GetStdHandle(STD_OUTPUT_HANDLE);
printf(” ————貪吃蛇的移動————“);
DrawBorder();
//自定義幾個蛇的身體
AddBody(pos);
pos.X += 2;
AddBody(pos);
pos.X += 2;
AddBody(pos);
pos.X += 2;
AddBody(pos);
pos.X += 2;
AddBody(pos);
pos.X += 2;
AddBody(pos);
pos.X += 2;
AddBody(pos);
//控制蛇的移動
while(ctrl = getch())
{
switch(ctrl)
{
case ‘w’:
if(dir == DOWN)
continue;
dir = UP;
break;
case ‘s’:
if(dir == UP)
continue;
dir = DOWN;
break;
case ‘a’:
if(dir == RIGHT)
continue;
dir = LEFT;
break;
case ‘d’:
if(dir == LEFT)
continue;
dir = RIGHT;
break;
case ‘q’:
return 0;
}
MoveBody(dir);
}
return 0;
}
擴展資料:
實現邏輯
1,可以設置游標,就能實現制定位置列印製定符號。
2,涉及一個結構體,包含兩個元素坐標元素和一個結構體指針。
3,結構體串聯形成鏈表,遍歷獲取成員坐標,列印符號得到蛇身。
4,不斷的加頭,去尾,重新遍歷坐標,再列印形成蛇的移動。
5,食物產生的位置判定,不能越界,也不能與蛇身體重合。
6,蛇的轉向判定,一條規則,不允許倒退。
7,轉向的實現,跟行進方向決定新的關節坐標(當前頭的上下左右)
8,死亡檢測,是否頭節點坐標是否與牆壁重合,是否與身體其他關節重合。
9,加速減速,設置刷新休眠時間實現。
參考資料來源:百度百科-C語言
c語言俄羅斯方塊問題
在寫一個程序之前得先有思路,本題中得思路是:
隨機給出不同的形狀(長條形、Z字形、反Z形、田字形、7字形、反7形、T字型)下落填充給定的區域,若填滿一條便消掉,記分,當達到一定的分數時,過關,每關方塊下落的速度不同,若在遊戲中各形狀填滿了給定區域,為輸者。
有了思路再動手,如果不會可以參考一下別人開源的項目!
因為項目複雜性,我給出了一個俄羅斯方塊程序的項目地址在最後,祝您好運!
項目地址:俄羅斯方塊遊戲
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/157565.html