C++ 2048简化版

相关源码:

My2048.h

 1 //设计思想,针对每一次的操作用队列进行模拟;如果是向左的话,针对行,对每一行的每一个列元素,如果是非0的话就进队列;全部进队列后,判断如果头两个元素相等的话,就把两者的和放进num[][]中,如果不等就把本身放进去;
 2
 3 #ifndef MATRIX_H
 4 #define MATRIX_H
 5 #include<iostream>
 6 #include<time.h>
 7 #include<stdlib.h>
 8
 9 #define rows 4
10 #define cols 4
11 #define L 6
12
13 using std::ostream;
14
15 class Matrix{
16     friend ostream& operator<<(ostream& out, Matrix& matrix);
17     //here is an output example
18     // -----------------------------
19     // |    16|     8|     4|     2|
20     // |     8|     8|     4|     2|
21     // |      |     4|     8|     2|
22     // |      |      |     2|     2|
23     // -----------------------------
24     public:
25         Matrix(int p1, int p2);
26         bool moveLeft(); //return true if the matrix change
27         bool moveRight();
28         bool moveUp();
29         bool moveDown();
30         bool add(int p);
31         void update1(); //add a 2 to the possible lowest position
32         void update2(); //add a 2 to a random position
33     private:
34         int num[rows][cols];
35 };
36 #endif

My2048.cpp

  1 #include<iostream>
  2 #include<queue>
  3 #include"My2048.h"
  4
  5 using std::queue;
  6
  7 Matrix::Matrix(int p1, int p2) {
  8     int i, j;
  9     for(i = 0; i < rows; ++i)
 10         for(j = 0; j < cols; ++j)
 11             num[i][j] = 0;
 12
 13     num[p1/cols][p1%cols] = 2;
 14     num[p2/cols][p2%cols] = 2;
 15 }
 16
 17 bool Matrix::moveLeft() {
 18     int tmp[rows][cols], i, j, k, pos;
 19     queue<int> q;
 20
 21     for(i = 0; i < rows; ++i)
 22         for(j = 0; j < cols; ++j)
 23             tmp[i][j] = num[i][j];
 24
 25     for(i = 0; i < rows; ++i) {
 26         for(j = 0; j < cols; ++j) { //delete the 0
 27             if(num[i][j])
 28                 q.push(num[i][j]);
 29             num[i][j] = 0;
 30         }
 31         pos = 0;
 32         while(!q.empty()) {
 33             k = q.front();
 34             q.pop();
 35             if(q.empty() || k != q.front()) {
 36                 num[i][pos++] = k;
 37             } else {
 38                 num[i][pos++] = 2*k;
 39                 q.pop();
 40             }
 41         }
 42     }
 43     for(i = 0; i < rows; ++i){
 44         for(j = 0; j < cols; ++j) {
 45             if(num[i][j] != tmp[i][j])
 46                 return true;
 47         }
 48     }
 49     return false;
 50 }
 51
 52 bool Matrix::moveRight() {
 53     int i, j, pos, tmp[rows][cols], k;
 54     queue<int> q;
 55     for(i = 0; i < rows; ++i)
 56         for(j = 0; j < cols; ++j)
 57             tmp[i][j] = num[i][j];
 58
 59     for(i = 0; i < rows;++i) {
 60         for(j = cols - 1; j >= 0; --j) {
 61             if(num[i][j])
 62                 q.push(num[i][j]);
 63             num[i][j] = 0;
 64         }
 65         pos = cols - 1;
 66         while(!q.empty()) {
 67             k = q.front();
 68             q.pop();
 69             if(q.empty() || k != q.front()) {
 70                 num[i][pos--] = k;
 71             } else {
 72                 num[i][pos--] = 2 * k;
 73                 q.pop();
 74             }
 75         }
 76     }
 77
 78     for(i = 0; i < rows; ++i) {
 79         for(j = 0; j < cols; ++j) {
 80             if(num[i][j] != tmp[i][j])
 81                 return true;
 82         }
 83     }
 84     return false;
 85 }
 86
 87 bool Matrix::moveUp() {
 88     int i, j, pos, tmp[rows][cols], k;
 89     queue<int> q;
 90     for(i = 0; i < rows; ++i)
 91         for(j = 0; j < cols; ++j)
 92             tmp[i][j] = num[i][j];
 93
 94     for(i = 0; i < cols;++i) {
 95         for(j = 0; j < rows; ++j) {
 96             if(num[j][i])
 97                 q.push(num[j][i]);
 98             num[j][i] = 0;
 99         }
100         pos = 0;
101         while(!q.empty()) {
102             k = q.front();
103             q.pop();
104             if(q.empty() || k != q.front()) {
105                 num[pos++][i] = k;
106             } else {
107                 num[pos++][i] = 2 * k;
108                 q.pop();
109             }
110         }
111     }
112
113     for(i = 0; i < rows; ++i) {
114         for(j = 0; j < cols; ++j) {
115             if(num[i][j] != tmp[i][j])
116                 return true;
117         }
118     }
119     return false;
120 }
121
122 bool Matrix::moveDown() {
123     int i, j, pos, tmp[rows][cols], k;
124     queue<int> q;
125     for(i = 0; i < rows; ++i)
126         for(j = 0; j < cols; ++j)
127             tmp[i][j] = num[i][j];
128
129     for(i = 0; i < cols;++i) {
130         for(j = rows - 1; j >= 0; --j) {
131             if(num[j][i])
132                 q.push(num[j][i]);
133             num[j][i] = 0;
134         }
135         pos = rows - 1;
136         while(!q.empty()) {
137             k = q.front();
138             q.pop();
139             if(q.empty() || k != q.front()) {
140                 num[pos--][i] = k;
141             } else {
142                 num[pos--][i] = 2 * k;
143                 q.pop();
144             }
145         }
146     }
147
148     for(i = 0; i < rows; ++i) {
149         for(j = 0; j < cols; ++j) {
150             if(num[i][j] != tmp[i][j])
151                 return true;
152         }
153     }
154     return false;
155 }
156
157 bool Matrix::add(int p) {
158     if(num[p/cols][p%cols] != 0)
159         return false;
160     else {
161         num[p/cols][p%cols] = 2;
162     }
163 }
164
165
166 void Matrix::update1() {
167     int i;
168     for(i = 0; i < rows * cols; ++i) {
169         if(add(i))
170             return;
171     }
172 }
173
174 void Matrix::update2() {
175     srand((unsigned)time(NULL));
176     while(true) {
177         int n = rand() % (rows*cols);
178         if(add(n))
179             return;
180     }
181 }
182
183 ostream& operator<<(ostream& out, Matrix& matrix) {
184     int i, k, j;
185     for(i = 0; i < (L + 1) * cols; ++i)
186         out << "-";
187     out << std::endl;
188
189     for(i = 0; i < rows; ++i) {
190         out << "|";
191         for(j = 0; j < cols; ++j) {
192             k = matrix.num[i][j];
193             out.width(L);
194             if(k)
195                 out << k;
196             else
197                 out << "";
198             out << "|";
199         }
200         out << std::endl;
201     }
202     for(i = 0; i <= (L+1) * cols; ++i)
203         out << "-";
204     out << std::endl;
205
206     return out;
207 }

Main.cpp

 1 #include<iostream>
 2 #include<time.h>
 3 #include<stdlib.h>
 4 #include "My2048.h"
 5
 6 using std::cout;
 7 using std::cin;
 8 int main() {
 9     Matrix m(0, 13);
10     cout << m;
11
12     char c;
13     while(cin >> c) {
14         bool flag = false;
15         if(c == ‘q‘)
16             break;
17         switch (c) {
18             case ‘a‘ :
19                 flag = m.moveLeft();
20                 break;
21             case ‘d‘:
22                 flag = m.moveRight();
23                 break;
24             case ‘w‘:
25                 flag = m.moveUp();
26                 break;
27             case ‘s‘:
28                 flag = m.moveDown();
29                 break;
30             default:
31                 break;
32         }
33         //system("cls");
34         if(flag)
35             m.update1();
36         cout << m;
37     }
38 }

makefile

Task:main.o My2048.o
    g++ -g main.o My2048.o -o Task
main.o:main.cpp
    g++ -g -c main.cpp
My2048.o:My2048.h My2048.cpp
    g++ -g -c My2048.cpp -o My2048.o
时间: 2024-10-12 20:15:05

C++ 2048简化版的相关文章

简化版的Flappy Bird开发过程

目录 .1构造世界 .2在世界中添加元素 .3碰撞检测 .4添加动画特效 .5总结 .0 开始之前 之前曾经用Html5/JavaScript/CSS实现过2048,用Cocos2d-html5/Chipmunk写过一个Dumb Soccer的对战游戏,但没有使用过原生的Canvas写过任何东西,为了加深对Canvas的学习,就心血来潮花了将近一天的时间利用原生Canvas实现了一个简化版的flappy bird,下面就总结一下开发的过程. 在正式开前,对于没有使用本地服务器的开发者来说,建议下

cocos2d-x 3.2 之 2048 —— 第四篇 ★ 核心 ★

***************************************转载请注明出处:http://blog.csdn.net/lttree****************************************** 大家十一过得肿么样啊~ 我现在的情况就是--每逢佳节 胖三斤 啊 ,胖三斤..o(╯□╰)o.. 好了,继续做2048, 这是第四篇啦~ 这篇的内容就是对触摸的处理哟~ 就是,你上下左右滑动,相应移动~ 我们先在 游戏的宏定义类 中,建立一个枚举方向变量: Game

麦子学院ios笔记:Objective-C 实现2048算法类

今天麦子学院ios开发老师给大家介绍Objective-C 实现的IOS版小游戏2048算法类,十分的实用,有需要的小伙伴可以参考下. 参数model有一个二维数组data,及阶数matrix // .h文件 @classDataModel; @interfaceAlgorithm : NSObject @property(nonatomic,assign)intaddScore;// 加分 - (void)caculateTop:(DataModel *)model;// 上滑规则 - (vo

2048 C++实现

1 #include <iostream> 2 #include <windows.h> 3 #include <ctime> 4 using namespace std; 5 6 int const ROW = 4; 7 int const COL = 4; 8 int game[ROW][COL] = {0}; 9 10 //上下左右 11 int const UP = 1; 12 int const DOWN = 2; 13 int const LEFT = 3;

200行Python代码实现2048

200行Python代码实现2048 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌面上的程序: LX终端(LXTerminal): Linux命令行终端,打开后会进入Bash环境,可以使用Linux命令 GVim:非常好用的编辑器,最简单的用法可以参考课程Vim编辑器 3. 环境使用 使用GVim编辑器输入实验所需的代码及文件,使用LX终端(LXTerminal)运行所需命令进行操

自带CA ,sha256 哈希签名,2048 位加密 脚本,通用

直接上代码 mkdir ssl cd ssl mkdir demoCA cd demoCA mkdir newcerts mkdir private touch index.txt echo '01' > serial function rand(){ min=$1 max=$(($2-$min+1)) num=$(date +%s%N) echo $(($num%$max+$min)) } rnd=$(rand 10 50) echo $rnd touch /etc/pki/CA/index.

python写2048小游戏

#!/usr/bin/env python # coding=utf-8 #******************************************************** # > OS : Linux 3.2.0-60-generic #91-Ubuntu # > Author : yaolong # > Mail : [email protected] # > Time : 2014年06月01日 星期日 13:13:39 #******************

max number of threads [1024] for user [lish] likely too low, increase to at least [2048]

# cat /etc/security/limits.d/90-nproc.conf # Default limit for number of user's processes to prevent # accidental fork bombs. # See rhbz #432903 for reasoning. * soft nproc 2048 root soft nproc unlimited #在这里修改

终端游戏开发 : 开发2048...

2048这个游戏应该是没几个人不知道吧... 今天去实验楼学了一下这个游戏的终端版本, 大概讲一下我对这个游戏的开发思路的理解. 实现为了实现2048, 我们需要用到3个模块, 分别是curses(用于终端界面交互程序开发的库, 可以解决屏幕打印以及按键处理等方面的问题), random, 以及collections 中的 defaultdict. 第一个库比较复杂, 我之前也没接触过, 不过隐隐感觉是一个功能强大的库, 我之后会专门研究它的官方文档, 目前暂且放在一边, 所幸2048中对这个库