2048小游戏c++实现
来源:互联网 发布:耽美网络剧100部百度云 编辑:程序博客网 时间:2024/04/28 02:40
用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(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;}
实现出来的效果是这样子的…
0 0
- C语言实现小游戏2048
- 用C实现2048小游戏
- 2048小游戏c语言实现
- C语言实现2048小游戏
- C语言实现的2048小游戏
- c语言实现打字小游戏
- C语言实现小游戏---三子棋
- C语言实现小游戏--扫雷
- C语言2048小游戏
- C语言实现N阶的2048小游戏
- java小游戏2048实现
- QT实现2048小游戏
- 2048小游戏c++实现
- LabVIEW实现2048小游戏
- pygame实现2048小游戏
- js实现2048小游戏
- Python实现小游戏--2048
- java实现2048小游戏
- Div高度的百分比问题
- Java NIO系列教程(九) ServerSocketChannel
- GSM之短信读取格式
- OD调试程序常用断点大全
- 创建git仓库和初始化仓库
- 2048小游戏c++实现
- C++学习:任意合法状态下汉诺塔的移动
- [Cocos2d-x][消除游戏实战][1][了解游戏]
- 解密SVM系列(五):matlab下libsvm的简单使用
- 学习Hadoop的前奏——初识zookeeper
- 最短路 Floyd算法
- POJ3667--Hotel(区间合并)
- 【ZOJ3640】
- 发帖水王问题-一组数中某个数超过一半或者几个数超过x+1分之一