2048小游戏c++实现
2015-08-17 22:32
549 查看
用c++实现了一下2048小游戏,没有界面,用控制台显示。
实现出来的效果是这样子的…
#include <stdlib.h> #include <time.h> #include <string.h> #include <stdio.h> class Game2048 { public: Game2048(int _max_score = 2048): max_score(_max_score) { N = 4; memset((void*)(matrix[0]), 0, sizeof(matrix)); } ~Game2048() {} void LeftOperator(); void RightOperator(); void UpOperator(); void DownOperator(); void PrintMatrix(int); void AddRand(); int Check(); private: int max_score; int N; int matrix[4][4]; int arr[4]; void Move(); void Merge(); void MoveAndMerge(); }; void Game2048::Move() { int pos0; for(pos0 = 0; pos0 < N; ++pos0) { if(!arr[pos0]) break; } for(int i = pos0 + 1; i < N; ++i) { if(arr[i]) arr[pos0++] = arr[i]; } while(pos0 < N) { arr[pos0++] = 0; } } void Game2048::Merge() { int pos; for(pos = 0; pos < N && !arr[pos]; ++pos) {} for(int i = pos + 1; i < N; ++i) { if(arr[i]) { if(arr[i] == arr[pos]) { arr[pos] <<= 1; arr[i] = 0; } else { pos = i; } } } } void Game2048::MoveAndMerge() { for(int i = 0; i < 3; ++i) Merge(); Move(); #ifdef DEBUG for(int i = 0; i < N; ++i) printf("%-6d", arr[i]); #endif } void Game2048::LeftOperator() { for(int ver = 0; ver < N; ++ver) { memcpy((void*)arr, (void*)matrix[ver], sizeof(arr)); MoveAndMerge(); memcpy((void*)matrix[ver], (void*)arr, sizeof(arr)); } } void Game2048::RightOperator() { for(int ver = 0; ver != N; ++ver) { for(int hor = 0; hor < N; ++hor) arr[hor] = matrix[ver][N-1-hor]; MoveAndMerge(); for(int hor = 0; hor < N; ++hor) matrix[ver][hor] = arr[N-1-hor]; } } void Game2048::UpOperator() { for(int hor = 0; hor < N; ++hor) { for(int i = 0; i < N; ++i) arr[i] = matrix[i][hor]; MoveAndMerge(); for(int i = 0; i < N; ++i) matrix[i][hor] = arr[i]; } } void Game2048::DownOperator() { for(int hor = 0; hor < N; ++hor) { for(int i = 0; i < N; ++i) arr[i] = matrix[N-1-i][hor]; MoveAndMerge(); for(int i = 0; i < N; ++i) matrix[i][hor] = arr[N-1-i]; } } void Game2048::AddRand() { int num = 2; srand(unsigned(time(NULL))); if((rand() % 4) == 3) num = 4; int zero = 0; for(int i = 0; i < N; ++i) { for(int j = 0; j < N; ++j) { if(!matrix[i][j]) zero++; } } int pos = rand() % zero + 1; int count = 0; for(int i = 0; i < N; ++i) { for(int j = 0; j < N; ++j) { if(!matrix[i][j]) { count++; if(count == pos) { matrix[i][j] = num; break; } } } } } void Game2048::PrintMatrix(int step) { printf("\nstep: %d\n", step); printf("---------------------------\n"); for(int i = 0; i < N; ++i) { printf("| "); for(int j = 0; j < N; ++j) { if(matrix[i][j]) printf("%-6d", matrix[i][j]); else printf(" "); } printf("|\n"); } printf("---------------------------\n"); } int Game2048::Check() { int count = 0; for(int i = 0; i < N; ++i) { for(int j = 0; j < N; ++j) { if(matrix[i][j] == max_score) return 1; if(matrix[i][j]) count++; } } if(N * N == count) return -1; return 0; } int main() { while( a8ea 1) { Game2048 game(2048); game.AddRand(); game.AddRand(); printf("输入方向, w代表上, s代表下, a代表左, d代表右, 然后按回车键\n"); int step = 0; game.PrintMatrix(step++); while(1) { printf("输入方向: "); char temp, c = 'e'; while( (temp = getchar()) != 10) { if(('e' == c) && ('w' == temp || 'a' == temp || 's' == temp || 'd' == temp) ) { c = temp; } } switch (c) { case 'a': game.LeftOperator(); break; case 'd': game.RightOperator(); break; case 'w': game.UpOperator(); break; case 's': game.DownOperator(); break; default: break; } if('e' == c) { printf("\n输入错误!\n"); continue; } game.AddRand(); game.PrintMatrix(step++); int res = game.Check(); if(1 == res) { printf("\nWin!\n\n\n"); break; } if(-1 == res) { printf("\n失败!\n\n\n"); break; } } } return 0; }
实现出来的效果是这样子的…
相关文章推荐
- Android Native 绘图方法
- C#中struct和class的区别详解
- VBS ArrayList Class vbs中的数组类
- 大家看了就明白了css样式中类class与标识id选择符的区别小结
- 深入了解PHP类Class的概念
- setAttribute 与 class冲突解决
- JavaScript中的类(Class)详细介绍
- javascript面向对象包装类Class封装类库剖析
- jQuery使用hide方法隐藏指定元素class样式用法实例
- jQuery给多个不同元素添加class样式的方法
- JavaScript更改class和id的方法
- 一篇入门的php Class 文章
- 深入C++中struct与class的区别分析
- js中设置元素class的三种方法小结
- c++中typename和class的区别介绍
- php class类的用法详细总结
- Windows平台的 PHP 报错 Fatal error: Class COM not found in 的解决方法
- JavaScript跨浏览器获取页面中相同class节点的方法
- js实现class样式的修改、添加及删除的方法
- Javascript定义类(class)的三种方法详解