這篇文章主要為大家詳細介紹了C語言實現——《2048項目》文中示例代碼介紹得非常詳細,具有一定的參考價值,感興趣的小夥伴們可以參考一下!
遊戲介紹:
《2048》一款益智小遊戲,遊戲的規則十分簡單,是一款簡單易上手的數字小遊戲。遊戲的規則很簡單,你需要控制所有方塊向同一個方向運動,兩個相同數字方塊撞在一起之後合并成為他們的和,每次操作之後會随機生成一個2或者4,最終得到一個“2048”的方塊就算勝利了!
玩法簡單,容易上手!所以這也成為了我們編程學習者C語言練習的一個非常好的小項目,如果你沒有玩過的話那麼可以先去玩一下的,會玩的話對于項目邏輯的理解也是非常有幫助的!接下來就讓我們一起來看看吧!
插件:圖形庫插件easyX,涉及圖片素材可以自行百度找也可以關注文末領取;
效果圖展示:
配套講解教程:2048遊戲教程——哔哩哔哩
源代碼示例:
#include<stdio.h>
#include<time.h>
#include<math.h>
#include<conio.h>
#include<graphics.h>//需要安裝之後,才有這個頭文件
#define MAX_GRID 4 //每行格子數
#define GRID_WIDTH 100 //格子寬度
#define INTERVAL 15 //間隔
#define WIN_SIZE (5*INTERVAL MAX_GRID*GRID_WIDTH)//窗口大小
enum Color //枚舉格子顔色
{
zero = RGB(205, 193, 180), //0的顔色
twoTo1 = RGB(238, 228, 218), //2的顔色
twoTo2 = RGB(237, 224, 200), //4的顔色
twoTo3 = RGB(242, 177, 121), //8的顔色
twoTo4 = RGB(245, 149, 99), //16的顔色
twoTo5 = RGB(246, 124, 95), //32的顔色
twoTo6 = RGB(246, 94, 59), //64的顔色
twoTo7 = RGB(242, 177, 121), //128的顔色
twoTo8 = RGB(237, 204, 97), //256的顔色
twoTo9 = RGB(255, 0, 128), //512的顔色
twoTo10 = RGB(145, 0, 72), //1024的顔色
twoTo11 = RGB(242, 17, 158), //2048的顔色
back = RGB(187, 173, 160), //背景顔色
};
Color arr[13] = { zero, twoTo1, twoTo2, twoTo3, twoTo4, twoTo5, twoTo6, twoTo7, twoTo8, twoTo9, twoTo10, twoTo11, back };
//數據 二維數組
int map[MAX_GRID][MAX_GRID];
int createNum()
{
int num = 0;
if (rand() % 10 == 0)
{
num = 4;
}
else
{
num = 2;
}
return num;
}
void gameInit()
{
srand((unsigned)time(NULL));
//随機在空白的位置産生兩個整數
for (int i = 0; i < 5; )
{
//随機數 rand() 随機獲得一個整數 0~上萬
int r = rand() % MAX_GRID; //0~3
int c = rand() % MAX_GRID; //0~3
if (map[r][c] == 0)
{
map[r][c] = createNum();
i ;
}
}
}
void gameDraw()
{
//繪制界面,設置背景顔色 187,173,160 三原色 set background color
setbkcolor(RGB(187, 173, 160));
//設置顔色之後需要,清屏(原本的顔色是黑色的,設置的顔色,被覆蓋了)
cleardevice();//清楚繪圖設備
for (int i = 0; i < MAX_GRID; i )//->y
{
for (int k = 0; k < MAX_GRID; k )//->x
{
//00 01 02 03
//10 11 12 13
//求出每一個格子的x,y
int x = k*GRID_WIDTH INTERVAL*(k 1);
int y = i*GRID_WIDTH INTERVAL*(i 1);
//4->2
//32->5
//2^n=map[i][k]; ->log2map[i][k]=n;
int index = (int)log2((float)map[i][k]);
setfillcolor(arr[index]);
//畫矩形:空心矩形,填充矩形,實心矩形,圓角矩形
//solidrectangle(x, y, x GRID_WIDTH, y GRID_WIDTH);
solidroundrect(x, y, x GRID_WIDTH, y GRID_WIDTH, 15, 15);
if (map[i][k] != 0)
{
//繪制數字
//printf("%d", map[i][k]);//輸出到控制台窗口
//設置文字大小
settextstyle(50, 0, "黑體");
settextcolor(RGB(163, 73, 164));
setbkmode(TRANSPARENT);//設置文字背景為透明
//把數字轉成字符串 格式化字符串
char str[10] = "";
sprintf(str, "%d", map[i][k]);
//為了文字居中在格子中間
int textx = textwidth(str) / 2;
int texty = textheight(str) / 2;
int win = GRID_WIDTH / 2; //格子寬度一半
outtextxy(x win - textx, y win - texty, str);
}
}
}
}
void moveup()
{
for (int i = 0; i < MAX_GRID; i )
{
int temp = 0;
for (int begin = 1; begin < MAX_GRID; begin )
{
if (map[begin][0] != 0)
{
if (map[temp][i] == 0)
{
map[temp][i] = map[begin][i];
map[begin][i] = 0;
}
else if (map[temp][i] == map[begin][i])
{
map[temp][i] = map[begin][i];
map[begin][i] = 0;
temp ;
}
else
{
map[temp 1][i] = map[begin][i];
if (temp 1 != begin)
{
map[begin][i] = 0;
}
temp ;
}
}
}
}
}
void moveDown()
{
for (int i = 0; i < MAX_GRID; i )
{
int temp = MAX_GRID-1;
for (int begin = MAX_GRID-2; begin >=0; begin--)
{
if (map[begin][0] != 0)
{
if (map[temp][i] == 0)
{
map[temp][i] = map[begin][i];
map[begin][i] = 0;
}
else if (map[temp][i] == map[begin][i])
{
map[temp][i] = map[begin][i];
map[begin][i] = 0;
temp--;
}
else
{
map[temp - 1][i] = map[begin][i];
if (temp - 1 != begin)
{
map[begin][i] = 0;
}
temp--;
}
}
}
}
}
//獲取鍵盤按鍵 _getch(),它不需要按回車确認輸入
void keyControl()
{
switch (_getch())
{
case 'w':
case 'W':
case 72:
moveup();
break;
case 's':
case 'S':
case 80:
moveDown();
break;
case 'a':
case 'A':
case 75:
break;
case 'd':
case 'D':
case 77:
break;
}
printf("key\n");
}
int main()
{
//不要控制台窗口,我要圖形窗口 easyx
initgraph(WIN_SIZE,WIN_SIZE,SHOWCONSOLE);//第一個參數是寬度,二個高度
gameInit();
while (1)
{
gameDraw();
keyControl();
}
return 0;
}
未完成的數字部分代碼,大家也可以自己先去想想試試,每一次的思考就是你進步的過程!
如果學習的過程中有什麼問題,以及本項目有什麼不懂的地方,都可以來找我交流,我來幫你!
那麼今天的分享就到這裡了,後續會更新更多精彩項目或者知識内容的,大家要好好學C語言C 喲~
寫在最後:對于準備學習C/C 編程的小夥伴,如果你想更好地提升你的編程核心能力(内功)不妨從現在開始!
編程學習書籍分享:
編程學習視頻分享:
整理分享(多年學習的源碼、項目實戰視頻、項目筆記,基礎入門教程)
歡迎轉行和學習編程的夥伴,利用更多的資料學習成長比自己琢磨更快哦!
對于C/C 感興趣可以關注小編在後台私信我:【編程交流】一起來學習哦!可以領取一些C/C 的項目學習視頻資料哦!已經設置好了關鍵詞自動回複,自動領取就好了!
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!