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; }
相关文章推荐
- c++ primer 练习5.17
- effective c++ 条款2 尽量以const enum inline代替#define
- 金融系统中PBOC/EMV的TLV的算法实现(含C++/C#)
- c++ primer 练习5.14
- c++抽象工厂模式
- 浅析C/C++中的switch/case陷阱
- effective c++ 以对象管理资源
- C++迭代器 iterator
- 项目26.2分段函数求值(switch语句)
- C++等级考试选择篇(二)
- 关于StdAfx.h和StdAfx.cpp
- 将链串s中的所有子串"abc"删除
- c prime plus第十四章练习题
- 什么是c++中的多态
- C语言的动态数组函数的sizeof、malloc和free
- hduacm 5480 Conturbatio前缀和
- 程序设计基石与实践之C语言指针和数组基础
- C++静态库与动态库
- Google C++ Style Guide的哲学
- Google C++ Style Guide的哲学