C語言實現(xiàn)2048游戲(ege圖形庫版)
更新時間:2018年12月21日 16:16:53 作者:什么都只會一點點
這篇文章主要為大家詳細介紹了C語言實現(xiàn)2048游戲,ege圖形庫版,具有一定的參考價值,感興趣的小伙伴們可以參考一下
這幾天看到我們班上一個大神寫了一個2048出來,我自己也想嘗試一下,經(jīng)過幾天自己嘗試努力下,自己終于寫出來了?,F(xiàn)在和大家分享一下,也希望能得到大神的指點。
實現(xiàn)的效果如圖

先來講一下我的思路吧
1.首先肯定是要一個4X4的二維數(shù)組來存放數(shù)字存放0、2、4……
2.游戲開始與過程中需要隨機出現(xiàn)2或者4,所以需要調用time.h這個庫
3.游戲開始時,假如當獲取字符為‘w'則先用循環(huán)判定這個數(shù)字的下方有無和它相等的數(shù)字。如無則跳過,如有相加。然后在判定是否可以向上移動
下面是我的代碼
(我本來是還要寫一個撤回的函數(shù) 可惜寫出來卻不能運行。求大神指教)
#include<stdio.h>
//#include<conio.h>
#include<graphics.h>
#include<Windows.h>
#include<time.h>
int _back[4][4] = {};
void draw();//繪圖
void play();
void init();//初始化數(shù)字
void _up();//向上移動
void _down();//向下移動
void _left();//像左移動
void _right();//向右移動
void add_number();//增加一個數(shù)字
int a[4][4] = { 0 };
int emtpy;
//空格的數(shù)量
void draw()
{
int i, j;
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
{
_back[i][j] = a[i][j];
PIMAGE img;
img = newimage();
switch (a[i][j])
{
case 0:
{
getimage(img, "2048\\0.png");
putimage(j * 180, i * 180, img);
break;
}
case 2:
{
getimage(img, "2048\\2.png");
putimage(j * 180, i * 180, img);
break;
}
case 4:
{
getimage(img, "2048\\4.png");
putimage(j * 180, i * 180, img);
break;
}
case 8:
{
getimage(img, "2048\\8.png");
putimage(j * 180, i * 180, img);
break;
}
case 16:
{
getimage(img, "2048\\16.png");
putimage(j * 180, i * 180, img);
break;
}
case 32:
{
getimage(img, "2048\\32.png");
putimage(j * 180, i * 180, img);
break;
}
case 64:
{
getimage(img, "2048\\64.png");
putimage(j * 180, i * 180, img);
break;
}
case 128:
{
getimage(img, "2048\\128.png");
putimage(j * 180, i * 180, img);
break;
}
case 256:
{
getimage(img, "2048\\256.png");
putimage(j * 180, i * 180, img);
break;
}
case 512:
{
getimage(img, "2048\\512.png");
putimage(j * 180, i * 180, img);
break;
}
case 1024:
{
getimage(img, "2048\\1024.png");
putimage(j * 180, i * 180, img);
break;
}
case 2048:
{
getimage(img, "2048\\2048.png");
putimage(j * 180, i * 180, img);
break;
}
}
}
}
}
void init()
{
int x, y;
srand(time(0));
x = rand() % 4;
y = rand() % 4;
a[x][y] = 2;
emtpy = 15;
}
void _up()
{
int x, y, i;
for (y = 0; y < 4; ++y) { // 從上向下合并相同的方塊
for (x = 0; x < 4; ++x) {
if (a[x][y] == 0)
;
else {
for (i = x + 1; i < 4; ++i) {
if (a[i][y] == 0)
;
else if (a[x][y] == a[i][y]) {
a[x][y] += a[i][y];
a[i][y] = 0;
++emtpy;
x = i;
break;
}
else {
break;
}
}
}
}
}
for (y = 0; y < 4; ++y) // 向上移動箱子
for (x = 0; x < 4; ++x)
{
if (a[x][y] == 0)
;
else {
for (i = x; (i > 0) && (a[i - 1][y] == 0); --i) {
a[i - 1][y] = a[i][y];
a[i][y] = 0;
}
}
}
}
void _down() {
int x, y, i;
for (y = 0; y < 4; ++y) // 向下合并相同的方格
for (x = 3; x >= 0; --x) {
if (a[x][y] == 0)
;
else {
for (i = x - 1; i >= 0; --i) {
if (a[i][y] == 0)
;
else if (a[x][y] == a[i][y]) {
a[x][y] += a[i][y];
a[i][y] = 0;
++emtpy;
x = i;
break;
}
else
break;
}
}
}
for (y = 0; y < 4; ++y) // 向下移動方格
for (x = 3; x >= 0; --x) {
if (a[x][y] == 0)
;
else {
for (i = x; (i < 3) && (a[i + 1][y] == 0); ++i) {
a[i + 1][y] = a[i][y];
a[i][y] = 0;
}
}
}
}
void _left()
{
int x, y, i;
for (x = 0; x < 4; ++x) // 向左合并相同的方格
for (y = 0; y < 4; ++y) {
if (a[x][y] == 0)
;
else {
for (i = y + 1; i < 4; ++i) {
if (a[x][i] == 0)
;
else if (a[x][y] == a[x][i]) {
a[x][y] += a[x][i];
a[x][i] = 0;
emtpy++;
y = i;
break;
}
else
break;
}
}
}
for (x = 0; x < 4; ++x) // 向左移動方格
for (y = 0; y < 4; ++y) {
if (a[x][y] == 0)
;
else {
for (i = y; (i > 0) && (a[x][i - 1] == 0); --i) {
a[x][i - 1] = a[x][i];
a[x][i] = 0;
}
}
}
}
void _right() {
int x, y, i;
for (x = 0; x < 4; ++x) // 向右合并相同的方格
for (y = 3; y >= 0; --y) {
if (a[x][y] == 0)
;
else {
for (i = y - 1; i >= 0; --i) {
if (a[x][i] == 0)
;
else if (a[x][y] == a[x][i]) {
a[x][y] += a[x][i];
a[x][i] = 0;
++emtpy;
y = i;
break;
}
else
break;
}
}
}
for (x = 0; x < 4; ++x) // 向右移動方格
for (y = 3; y >= 0; --y) {
if (a[x][y] == 0)
;
else {
for (i = y; (i < 3) && (a[x][i + 1] == 0); ++i) {
a[x][i + 1] = a[x][i];
a[x][i] = 0;
}
}
}
}
void add_number()
{
srand(time(0));
if (emtpy > 0)
{
int x, y, temp;
do
{
x = rand() % 4;
y = rand() % 4;
} while (a[x][y] != 0);
temp = rand();
int i = temp % 2;
if (i == 1)
{
a[x][y] = 2;
emtpy--;
}
else
{
a[x][y] = 4;
emtpy--;
}
}
}
void play()
{
char c = getch();
switch (c)
{
case 'w':
case'W':
{
_up();
add_number();
draw();
break;
}
case 's':
case'S':
{
_down();
add_number();
draw();
break;
}
case 'a':
case'A':
{
_left();
add_number();
draw();
break;
}case 'd':
case'D':
{
_right();
add_number();
draw();
break;
}
case 'q':
case 'Q':
{
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
a[i][j] = _back[i][j];
draw();
}
}
}
}
}
int main()
{
init();
int i, j;
initgraph(724, 724);//初始化
PIMAGE img;
img = newimage();
getimage(img, "2048/背景.jpg");
putimage(0, 0, img);
draw();
for (; is_run(); delay_fps(30))
{
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
_back[i][j] = a[i][j];
}
}
play();
}
}
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

