C/C++項(xiàng)目源碼——2048小游戲
這是小編自己做的一個2048的小游戲琳猫,然后圖片素材需要大家自己找尋凫海,也可以在下方評論處評論找我要素材
```cpp
/************************************************
* stdio.h 標(biāo)準(zhǔn)C語言庫?
* #include 包含庫
*
************************************************/
#define _CRT_SECURE_NO_WARNINGS //去掉編譯器內(nèi)擴(kuò)增問題
#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>? //報錯--->baby 圖形庫插件安裝就可以了
#include <conio.h>
#include <time.h>
/************************************************
* 數(shù)據(jù)成員
* 變量的聲明
************************************************/
IMAGE img[12]; //存儲12張照片
//圖片的的名字的序號
//imgIndex[x].bmp;
int imgIndex[12] = { 0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048 };
int i, j; //循環(huán)變量的遍歷
int? map[4][4] = { 0 };
/************************************************
* 子函數(shù)
* 加載資源
************************************************/
void loadResource()
{
for (i = 0; i < 12; i++)
{
//批量加載
char fileName[20] = "";
sprintf(fileName, "%d.bmp", imgIndex[i]);
loadimage(img + i, fileName);
//0 1 2
}
}
/************************************************
* 畫地圖
* 根據(jù)二維數(shù)組中的值去畫地圖
************************************************/
void drawMap()
{
setbkcolor(RGB(244, 215, 215));
cleardevice();
settextcolor(WHITE); //設(shè)置文字顏色
settextstyle(35, 0, "楷體"); //設(shè)置文字格式
outtextxy(50, 10, "2048游戲");
//根據(jù)二維數(shù)組中值去畫圖
int x, y, k;
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
{
x = 60 * j;
y = 60 * i + 50;
for (k = 0; k < 12; k++)
{
//求出當(dāng)前元素對應(yīng)的圖片序號
//賦值語句不要寫成等于號
if (imgIndex[k]== map[i][j])
break;
}
//貼相應(yīng)序號的圖片
putimage(x, y, img + k);
}
}
}
/************************************************
* 隨機(jī)產(chǎn)生2或者4 或者0
* 隨機(jī)函數(shù)
************************************************/
int? randIntNum()
{
srand((unsigned int)time(NULL)); //隨機(jī)函數(shù)種子
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
{
if (map[i][j] == 0)
{
//0,2,4
//(0,1,2)*2
map[i][j] = (rand() % 3) * 2;
//產(chǎn)生0的話狭握,該次產(chǎn)生的值不算
if (map[i][j] == 0)
continue;
return 0;
}
}
}
return 0;
}
//做移動,一定要想清楚什么時候能動
/************************************************
* 根據(jù):上,下,左欢搜,右 鍵做不同合并
* 以右鍵為例:
* [2 2 4 4]--->[0 4 0 8]
* [0 2 0 8]--->[0 0 2 8]
************************************************/
int moveRight()
{
int flag = 0; //游戲結(jié)束標(biāo)記
for (i = 0; i < 4; i++)
{
for (j = 4 - 1; j >= 0; j--)
{
int curKey = map[i][j]; //當(dāng)前元素的值
if (curKey != 0)
{
int curKey = map[i][j]; //當(dāng)前元素的值
int k = j + 1;
while (k >= 0)
{
//當(dāng)前元素的下一個
int curKeyNext = map[i][k];
if (curKeyNext != 0)
{
//如果相鄰的是相同,那么我們就合并
if (curKey == curKeyNext)
{
//[2 2 4 4]--->[0 4 0 8]
flag = 1;
map[i][j] += map[i][k];
map[i][k] = 0;
}
k = 4; //退出循環(huán)
break;
}
k++; //判斷其他的位置
}
}
}
}
//[0 2 0 8]--->[0 0 2 8]
for (i = 0; i < 4; i++)
{
for (j = 4 - 1; j >= 0; j--)
{
int curKey = map[i][j];
if (curKey == 0)
{
int k = j - 1;
while (k >= 0)
{
int curKeyNext = map[i][k];
if (curKeyNext != 0)
{
flag = 1;
map[i][j] = curKeyNext; //把非0元素移到0的位置
map[i][k] = 0; //移動后變?yōu)?
k = -1;
}
k--; //其他位置也需要判斷
}
}
}
}
if (flag)
return 0;
else
return 4;
}
//往左走
int moveLeft()
{
int flag = 0; //游戲結(jié)束標(biāo)記
for (i = 0; i < 4; i++)
{
for (j =0; j<4; j++)
{
int curKey = map[i][j]; //當(dāng)前元素的值
if (curKey != 0)
{
int k = j + 1;
while (k < 4)
{
//當(dāng)前元素的下一個
int curKeyNext = map[i][k];
if (curKeyNext != 0)
{
//如果相鄰的是相同谴轮,那么我們就合并
if (curKey == curKeyNext)
{
//[2 2 4 4]--->[0 4 0 8]
flag = 1;
map[i][j] += map[i][k];
map[i][k] = 0;
}
k = 4; //退出循環(huán)
break;
}
k++; //判斷其他的位置
}
}
}
}
//[0 2 0 8]--->[0 0 2 8]
for (i = 0; i < 4; i++)
{
for (j =0; j <4; j++)
{
int curKey = map[i][j];
if (curKey == 0)
{
int k = j + 1;
while (k < 4)
{
int curKeyNext = map[i][k];
if (curKeyNext != 0)
{
flag = 1;
map[i][j] = curKeyNext; //把非0元素移到0的位置
map[i][k] = 0; //移動后變?yōu)?
k = 4;
}
k++; //其他位置也需要判斷
}
}
}
}
if (flag)
return 0;
else
return 4;
}
//往上走
int? moveUp()
{
int flag = 0;
for (i = 0; i <4; i++)
{
for (j = 0; j < 4; j++)
{
int curKey = map[i][j];
if (curKey != 0)
{
int k = i + 1;
while (k <4)
{
int curKeyNext = map[k][j];
if (curKeyNext != 0)
{
if (curKey== curKeyNext)
{
flag = 1;
map[i][j] += map[k][j];
map[k][j] = 0;
}
k = 4;
break;
}
k++;
}
}
}
}
for (i = 0; i <4-1; i++)
{
for (j = 0; j < 4; j++)
{
int curKey = map[i][j];
if (curKey == 0)
{
int k = i + 1;
while (k <4)
{
int curKeyNext = map[k][j];
if (curKeyNext != 0)
{
flag = 1;
map[i][j] = curKeyNext;
map[k][j] = 0;
k = 4;
}
k++;
}
}
}
}
if (flag)
return 0;
else
return 4;
}
//往下走
int? moveDown()
{
int flag = 0;
for (i = 4 - 1; i >= 0; i--)
{
for (j = 0; j < 4; j++)
{
int curKey = map[i][j];
if (curKey != 0)
{
int k = i - 1;
while (k >= 0)
{
int curKeyNext = map[k][j];
if (curKeyNext != 0)
{
if (map[i][j] == map[k][j])
{
flag = 1;
map[i][j] += map[k][j];
map[k][j] = 0;
}
k = 0;
break;
}
k--;
}
}
}
}
for (i = 4 - 1; i > 0; i--)
{
for (j = 0; j < 4; j++)
{
int curKey = map[i][j];
if (curKey == 0)
{
int k = i - 1;
while (k >= 0)
{
int curKeyNext = map[k][j];
if (curKeyNext != 0)
{
flag = 1;
map[i][j] = curKeyNext;
map[k][j] = 0;
k = 0;
}
k--;
}
}
}
}
if (flag)
return 0;
else
return 4;
}
/************************************************
* 按鍵響應(yīng)
* 上炒瘟,下,左第步,右
************************************************/
void keyDown()
{
char key=_getch(); //用來接收用戶按鍵
switch (key)
{
case 'w':
case 'W':
case 72: //小鍵盤
randIntNum();
moveUp();
break;
case 'S':
case 's':
case 80:
randIntNum();
moveDown();
break;
case 'a':
case 'A':
case 75:
randIntNum();
moveLeft();
break;
case 'd':
case 'D':
case 77:
randIntNum();
//drawMap();
moveRight();
break;
}
}
/************************************************
* 主函數(shù)
* 唯一的一個入口函數(shù)
************************************************/
int main()
{
//程序如何顯示圖片
loadResource();
initgraph(60 * 4, 60 * 4 + 60);
drawMap();
while (1)
{
keyDown();
drawMap();
}
////1.聲明圖片變量
//IMAGE background;
////2.加載資源到變量 loadimage加載
//loadimage(&background, "class.jpg", 800, 400);
//3.顯示圖片 putimage顯示圖片
//putimage(0, 0, img+1);
getchar(); //防止閃屏
closegraph();
system("pause");
return 0;
}
```
這個小游戲希望對大家有幫助疮装,自己在家沒事的時候也可以寫出來玩一下,