您的位置:首页 > 编程语言 > C语言/C++

c/c++ 2048 120行左右~

2015-10-02 22:23 393 查看
</pre><pre name="code" class="cpp">#include <iostream>
#include <ctime>
#include <cstdlib>
#include <cstring>
using namespace std;
/*代码重复性比较高,下面有修改后的代码。差不多100行。*/
int game2048[6][6];
bool move_(char a)
{
bool flag = false;
for(int m = 1;m <= 4;m++)
for(int n = 1;n <= 4;n++)
{
switch(a)
{
case 'w':
for(int i = n+1;i <= 4;i++)
{
if(game2048
[m] && game2048
[m] == game2048[i][m]) //w
{
game2048
[m] *= 2;
game2048[i][m] = 0;
flag = true;
break;
}
if(game2048[i][m] != 0) break;
}
break;
case 's':
for(int i = n+1;i <= 4;i++)
{
if(game2048[5-n][5-m] && game2048[5-n][5-m] == game2048[5-i][5-m]) //s
{
game2048[5-n][5-m] *= 2;
game2048[5-i][5-m] = 0;
flag = true;
break;
}
if(game2048[5-i][5-m] != 0) break;
}
break;
case 'a':
for(int i = n+1;i <= 4;i++)
{
if(game2048[m]
&& game2048[m]
== game2048[m][i]) //a
{
game2048[m]
*= 2;
game2048[m][i] = 0;
flag = true;
break;
}
if(game2048[m][i] != 0) break;
}
break;
case 'd':
for(int i = n+1;i <= 4;i++)
{
if(game2048[5-m][5-n] && game2048[5-m][5-n] == game2048[5-m][5-i]) //d
{
game2048[5-m][5-n] *= 2;
game2048[5-m][5-i] = 0;
flag = true;
break;
}
if(game2048[5-m][5-i] != 0) break;
}
break;
}
}
return flag;
}
bool plus_(char a)
{
bool flag = false;
for(int m = 1;m <= 4;m++)
for(int n = 1;n <= 4;n++)
{
switch(a)
{
case 'w':
if(game2048
[m] != 0) continue;  //w
for(int i = n+1;i <= 4;i++)
{
if(game2048[i][m] != 0)
{
game2048
[m] = game2048[i][m];
game2048[i][m] = 0;
flag = true;
break;
}
}
break;
case 's':
if(game2048[5-n][5-m] != 0) continue;  //s
for(int i = n+1;i <= 4;i++)
{
if(game2048[5-i][5-m] != 0)
{
game2048[5-n][5-m] = game2048[5-i][5-m];
game2048[5-i][5-m] = 0;
flag = true;
break;
}
}
break;
case 'a':
if(game2048[m]
!= 0) continue;  //a
for(int i = n+1;i <= 4;i++)
{
if(game2048[m][i] != 0)
{
game2048[m]
= game2048[m][i];
game2048[m][i] = 0;
flag = true;
break;
}
}
break;
case 'd':
if(game2048[5-m][5-n] != 0) continue;  //d
for(int i = n+1;i <= 4;i++)
{
if(game2048[5-m][5-i] != 0)
{
game2048[5-m][5-n] = game2048[5-m][5-i];
game2048[5-m][5-i] = 0;
flag = true;
break;
}
}
break;
}
}
return flag;
}
bool over()
{
for(int m = 1;m <= 4;m++)
for(int n = 1;n <= 4;n++)
if(game2048
[m] == 0 || game2048
[m] == game2048[n+1][m] || game2048[m]
== game2048[m][n+1]) //w
return true;
return false;
}
void getblock()
{
int a,b;
srand(unsigned(time(0)));
while(1)
{
a = 1 + (int)4 * rand() / (RAND_MAX + 1);
b = 1 + (int)4 * rand() / (RAND_MAX + 1);
if(!game2048[a][b])
{
game2048[a][b] = 2;
break;
}
}

}
void view()
{
for(int m = 1;m <= 4;m++)
{
cout << endl;
for(int n = 1;n <= 4;n++)
cout << "  " << game2048[m]
<< "  ";
cout << endl;
}

}
void init()
{
memset(game2048, 0, sizeof(game2048));
getblock();
view();
}
int main()
{
char key;
init();
while(cin >> key)
{
bool flag = false;
flag = move_(key);
if(plus_(key) || flag)
getblock();
view();
if(!over())
{
cout << "Lost" << endl;
init();
}
}
return 0;
}
/*这个是修改后的代码,代码差不多少了100行左右,代码重复部分减少了,代码少但是可读性可能变差了,abcd也挤在一行写了,,需要改进下码农的习惯*/
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <cstring>
using namespace std;

int game2048[6][6];
bool move_(char r)//w a s d
{
bool flag = false;
int a[25],b[25],c[25],d[25];
r -= 97;
for(int num = 0;num < 2;num++)
for(int m = 1;m <= 4;m++)
for(int n = 1;n <= 4;n++)
{
a[22] = n;a[18] = 5 - n;a[0] = m;a[3] = 5 - m;
b[22] = m;b[18] = 5 - m;b[0] = n;b[3] = 5 - n;
if(num && game2048[a[r]][b[r]] != 0) continue;  //w
for(int i = n+1;i <= 4;i++)
{
c[22] = i;c[18] = 5 - i;c[0] = m;c[3] = 5 - m;
d[22] = m;d[18] = 5 - m;d[0] = i;d[3] = 5 - i;
if(!num && game2048[a[r]][b[r]] && game2048[a[r]][b[r]] == game2048[c[r]][d[r]]) //w
{
game2048[a[r]][b[r]] *= 2;
game2048[c[r]][d[r]] = 0;
flag = true;//这里添加计分
break;
}
if(!num && game2048[c[r]][d[r]] != 0) break;
if(num && game2048[c[r]][d[r]] != 0)
{
game2048[a[r]][b[r]] = game2048[c[r]][d[r]] ;
game2048[c[r]][d[r]] = 0;
flag = true;
break;
}
}
}
return flag;
}
bool over()
{
for(int m = 1;m <= 4;m++)
for(int n = 1;n <= 4;n++)
if(game2048
[m] == 0 || game2048
[m] == game2048[n+1][m] || game2048[m]
== game2048[m][n+1]) //w
return true;
return false;
}
void getblock()
{
int a,b;
srand(unsigned(time(0)));
while(1)
{
a = 1 + (int)4 * rand() / (RAND_MAX + 1);
b = 1 + (int)4 * rand() / (RAND_MAX + 1);
if(!game2048[a][b])
{
game2048[a][b] = 2;
break;
}
}
}
void view()
{
for(int m = 1;m <= 4;m++)
{
cout << endl;
for(int n = 1;n <= 4;n++)
{
int num = 5;
cout << game2048[m]
;
for(int i = game2048[m]
/10;i > 0;i /= 10)
num--;
while(num--)
cout << ' ';
}
cout << endl;
}
}
voi
4000
d init()
{
memset(game2048, 0, sizeof(game2048));
getblock();
view();
}
int main()
{
char key;
init();
while(cin >> key)
{
if(move_(key))
getblock();
view();
if(!over())
{
cout << "Lost" << endl;
init();
}
}
return 0;
}

最后一个版本啦,增加了计分和控制台的清屏,无需回车就能控制方块的运动。

被人吐槽说论UI的重要性。。。

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <cstring>
#include <conio.h>
#include<windows.h>
using namespace std;

int game2048[6][6];
int score = 0;
bool move_(char r)//w a s d
{
bool flag = false;
int a[25],b[25],c[25],d[25];
r -= 97;
if(r != 22 && r != 18 && r != 0 && r != 3)
return false;
for(int num = 0;num < 2;num++)
for(int m = 1;m <= 4;m++)
for(int n = 1;n <= 4;n++)
{
a[22] = n;a[18] = 5 - n;a[0] = m;a[3] = 5 - m;
b[22] = m;b[18] = 5 - m;b[0] = n;b[3] = 5 - n;
if(num && game2048[a[r]][b[r]] != 0) continue;  //w
for(int i = n+1;i <= 4;i++)
{
c[22] = i;c[18] = 5 - i;c[0] = m;c[3] = 5 - m;
d[22] = m;d[18] = 5 - m;d[0] = i;d[3] = 5 - i;
if(!num && game2048[a[r]][b[r]] && game2048[a[r]][b[r]] == game2048[c[r]][d[r]]) //w
{
game2048[a[r]][b[r]] *= 2;
game2048[c[r]][d[r]] = 0;
flag = true;//这里添加计分
score += game2048[a[r]][b[r]];
break;
}
if(!num && game2048[c[r]][d[r]] != 0) break;
if(num && game2048[c[r]][d[r]] != 0)
{
game2048[a[r]][b[r]] = game2048[c[r]][d[r]] ;
game2048[c[r]][d[r]] = 0;
flag = true;
break;
}
}
}
return flag;
}
bool over()
{
for(int m = 1;m <= 4;m++)
for(int n = 1;n <= 4;n++)
if(game2048
[m] == 0 || game2048
[m] == game2048[n+1][m] || game2048[m]
== game2048[m][n+1]) //w
return true;
return false;
}
void getblock()
{
int a,b;
srand(unsigned(time(0)));
while(1)
{
a = 1 + (int)4 * rand() / (RAND_MAX + 1);
b = 1 + (int)4 * rand() / (RAND_MAX + 1);
if(!game2048[a][b])
{
game2048[a][b] = 2;
break;
}
}
}
void view()
{
system("cls");
cout << "Yours score: " << score << endl;
for(int m = 1;m <= 4;m++)
{
cout << endl;
for(int n = 1;n <= 4;n++)
{
int num = 5;
cout << game2048[m]
;
for(int i = game2048[m]
/10;i > 0;i /= 10)
num--;
while(num--)
cout << ' ';
}
cout << endl;
}
}
void init()
{
score = 0;
memset(game2048, 0, sizeof(game2048));
getblock();
view();
}
int main()
{
char key;
init();
while(1)
{
key = _getch();
if(move_(key))
getblock();
view();
if(!over())
{
cout << "You final score is : " << score << endl << endl;
cout << "Press 2 to restare......" << endl;
while(cin >> key)
if(key == '2')
init();
}
}
return 0;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: