Linux下C語(yǔ)言實(shí)現(xiàn)彈彈方塊小游戲
掃描二維碼
隨時(shí)隨地手機(jī)看文章
微信公眾號(hào):嵌入式開(kāi)發(fā)圈
關(guān)注可了解更多的教程。問(wèn)題或建議,請(qǐng)公眾號(hào)留言;
如果你覺(jué)得本文對(duì)你有幫助,歡迎贊賞,點(diǎn)廣告就可以了噢!^^
▲長(zhǎng)按圖片保存可分享至朋友圈
彈彈方塊項(xiàng)目實(shí)現(xiàn)需求
本項(xiàng)目是在Linux下實(shí)現(xiàn)的,實(shí)現(xiàn)效果就是在Linux終端上顯示一個(gè)方塊,方塊的大小由編寫(xiě)者自行決定。然后畫(huà)一個(gè)方框,小方塊會(huì)在這個(gè)方框的范圍中來(lái)回彈,如圖3-7-12所示。
我們用上一篇文章的VT100控制碼來(lái)實(shí)現(xiàn)這個(gè)需求。
VT100控制碼表
項(xiàng)目實(shí)現(xiàn)步驟規(guī)劃
一、畫(huà)一個(gè)方框,從終端的哪一個(gè)位置(行,列)坐標(biāo)開(kāi)始畫(huà)起,顏色又是什么?
二、畫(huà)一個(gè)方塊,方塊的起始位置,方塊的大小,方塊移動(dòng)的方向,方塊的顏色是什么?
三、移動(dòng)的時(shí)候,為了不要方塊留下移動(dòng)的痕跡,那么需要清除方塊的痕跡,如何實(shí)現(xiàn)?
具體實(shí)現(xiàn)
一、方塊結(jié)構(gòu)體
1struct block
2{
3 int W ; //方塊的寬度
4 int H ; //方塊的高度
5 int row ; //方塊的起始坐標(biāo)row和col
6 int col ;
7 int drow ; //方塊的移動(dòng)方向drow和dcol
8 int dcol ;
9 void (*show)(struct block block) ; //方塊顯示
10 void (*clear)(struct block block); //方塊清除
11 void (*move)(struct block *block) ; //方塊移動(dòng)
12};
該結(jié)構(gòu)體描述方塊的一切信息,包括顯示的位置、方塊的大小、移動(dòng)的方向以及方塊的顏色。
二、操作方塊的API函數(shù)
1//顯示邊框的函數(shù)
2void show_map(void);
3//顯示方塊
4void show_block(struct block_t *array , int size);
5//清除方塊
6void clear_block(struct block_t *array , int size);
7//移動(dòng)方塊
8void move_block(struct block_t *array , int size);
9//檢測(cè)方塊是否在邊框內(nèi)
10int check_block(struct block_t *array , int size);
三、源代碼實(shí)現(xiàn) block.c
1#include
2#include
3//窗體的大小
4#define ROW 20
5#define COL 60
6//定義延遲函數(shù)
7#define msleep(x) usleep(x*1000)
8
9
10//方塊操作結(jié)構(gòu)體
11struct block
12{
13 int W ; //方塊的寬度
14 int H ; //方塊的高度
15 int row ; //方塊的起始坐標(biāo)row和col
16 int col ;
17 int drow ; //方塊的移動(dòng)方向drow和dcol
18 int dcol ;
19 void (*show)(struct block block) ; //方塊顯示
20 void (*clear)(struct block block); //方塊清除
21 void (*move)(struct block *block) ; //方塊移動(dòng)
22};
23
24void show_background(void);
25void show_block(struct block block);
26void clear_block(struct block block);
27void move_block(struct block *block);
28int main(void)
29{
30 struct block b1 = {4,2,5,5,1,1,show_block , clear_block , move_block};
31 system(“clear”);
32 show_background();
33 printf("\033[?25l");
34 while(1)
35 {
36 b1.show(b1);
37 msleep(100);
38 b1.clear(b1);
39 b1.move(&b1);
40 }
41 return 0 ;
42}
43//顯示方塊
44void show_block(struct block block)
45{
46 int i ,j ;
47 for(i = 0 ; i < block.H ; i++)
48 {
49 for(j = 0 ; j < block.W ; j++)
50 {
51 printf("\033[%d;%dH\033[43m \033[0m" ,block.row+i, block.col+j);
52 }
53 }
54 fflush(stdout);
55}
56//清除方塊
57void clear_block(struct block block)
58{
59 int i ,j ;
60 for(i = 0 ; i < block.H ; i++)
61 {
62 for(j = 0 ; j < block.W ; j++)
63 {
64 printf("\033[%d;%dH \033[0m" ,block.row+i, block.col+j);
65 }
66 }
67 fflush(stdout);
68}
69//移動(dòng)方塊
70void move_block(struct block *block)
71{
72 if(block->row < 3 || block->row > ROW-block->H-1)
73 block->drow = -block->drow ;
74 if(block->col < 3 || block->col > COL-block->W-1)
75 block->dcol = -block->dcol ;
76
77 block->row += block->drow ;
78 block->col += block->dcol ;
79}
80//顯示背景
81void show_background(void)
82{
83 int i ,j ;
84 //畫(huà)出上下和左右邊框
85 for(i = 1 ; i <= ROW ; i++)
86 {
87 printf("\033[%d;1H\033[43m \033[0m" , i);
88 printf("\033[%d;%dH\033[43m \033[0m" , i , COL);
89 }
90
91 for(i = 1 ; i <= COL ; i++)
92 {
93 printf("\033[1;%dH\033[43m \033[0m" , i);
94 printf("\033[%d;%dH\033[43m \033[0m" ,ROW, i);
95 }
96}
在Linux下,使用gcc命令編譯程序生成可執(zhí)行文件,然后運(yùn)行。顯示效果如圖3-7-13所示:
那么,如果我想一次性顯示多個(gè)同時(shí)移動(dòng)的方塊呢?如何是兩個(gè),該如何編寫(xiě)程序呢?其實(shí)很簡(jiǎn)單,多定義一個(gè)方塊結(jié)構(gòu)體。然后在循環(huán)中,調(diào)用對(duì)應(yīng)的顯示方塊,清除方塊,移動(dòng)方塊的函數(shù)即可。再看看效果,如圖3-7-14所示。
1struct block b2 = {4,2,7,8,1,3,show_block , clear_block , move_block};
程序還有許多的優(yōu)化方法,讀者可以自行發(fā)揮,修改以上源代碼。下面給讀者一個(gè)思考的空間,我們已經(jīng)學(xué)習(xí)過(guò)VT控制碼了,你能否改變方塊的顏色呢?還有,如果每次都像現(xiàn)在的一樣多定義一個(gè)結(jié)構(gòu)體,然后在主循環(huán)中調(diào)用,程序?qū)?huì)越來(lái)越臃腫,能否設(shè)計(jì)新的程序架構(gòu)解決這個(gè)問(wèn)題呢?
本程序還有一個(gè)Window版本,讀者可以自行掃碼獲取。
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!