2048游戏,

先建立一个游戏类,.h文件
#pragma once
#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_NONSTDC_NO_DEPRECATE
#include <conio.h>
#include
#include
#include
#include
#include
using namespace std;
class game
{
int m_N;
public:
game(const int n=2):m_N(n){
//cout << “边长确定” << endl;
}
//之后可以尝试将容器包含在类里面;
int getwid() const {return m_N;}//在函数名括号外面应加上const,只有这样才能和后面的const定义的函数相匹配。
friend void screen(game const& a, vector& b);
};

void screen(game const& a,vector &b);
void reput(game const& a, vector & map);
void command(vector&a, game const& b); //对容器内的数据进行玩家对应操作的函数。
bool jieshu (vectorconst &a,game const&b);//结束判断函数,这里好像不能够用bool
bool compare(vectorconst& a, vectorconst& b);
int scores(vectorconst& a);

对应的.cpp文件为:
#include “game.h”
#include
#include
#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_NONSTDC_NO_DEPRECATE
#include <conio.h>
#include<stdlib.h>
//首先需要将游戏的界面显示出来,并利用数组或容器存储数据;
void screen(game const& a,vector &b) {
//vector data;
//for (int i = 0; i < a.m_N * a.m_N; i++) {
// data.push_back(0);
//}

for (int i = 0; i < a.getwid()* a.getwid(); i++) {
	cout <<  b[i]<<"	" ;//输出问题可以用for循环暂时不知道怎么用setw,最后再考虑。
	if ((i + 1) % a.getwid() == 0) {
		cout << endl;
	}
}
cout << "你的得分是:" << scores(b) << endl;

}
void reput(game const& a, vector & map) {
srand((unsigned int)time(NULL));//在键盘上的随机的位置上生成2或4;
int num = rand() % (a.getwid() * a.getwid());
while (map[num] != 0) {//选择棋盘上为0的位置进行初始化。如果不为0,就重新寻找0处。
num = rand() % (a.getwid() * a.getwid());//如果前面的定义没有const这里会报错。
//暂且不考虑当所有位置都被填满时的操作,可以在主函数中通过先检测位置来达到停止游戏的目的。
}
int pos = rand() % 100;
if (pos >= 50) {
map[num] = 2;
}
else {
map[num] = 4;
}
}
//核心代码为每次操作后的运算对应到容器内的数据改变。

void command(vector& a,game const &b) {
char co = getch();
vector pep;
if (co == 97) {//向左划;用wasd代表上下左右。
vector beifen(a);
for (int i = 0; i < b.getwid(); i++) {
for (int j = 0; j < b.getwid(); j++) {
if (a[j+i*b.getwid()] != 0) {
pep.push_back(a[j + i * b.getwid()]);
a[j + i * b.getwid()] = 0;//将处理棋盘的容器归零。并将数值转移至中间容器。
}
int k = 0;
if (j == b.getwid() - 1&&pep.size()>1) {
for (int q = 1; q < pep.size(); ) {
if (pep[q] == pep[q - 1]) {
a[k + i * b.getwid()] = 2 * pep[q-1];//注意原容器的下标的改变,这里为了避免pep的下标越界,所以使q=1,
q += 2;
k++;
if (q == pep.size()) {
a[k + i * b.getwid()] = pep[q - 1];
break;
}
if (q > pep.size())
break;
}
else {//前两个不相等,则后者与后面的对比;
a[k + i * b.getwid() ] = pep[q - 1];
q++;
k++;
if (q == pep.size()) {//不相等的数的最后一个不要漏下,少了此判断会少数字。
a[k + i * b.getwid()] = pep[q - 1];
}
}
}
}
if (j == b.getwid() - 1 && pep.size() == 1) {
a[k+i * b.getwid()] = pep[0];
}
//这一行或列为0时不做处理。仍为0.
}
pep.clear();//移除临时容器的所有元素;
}
if (compare(beifen, a)) {
system(“CLS”);
reput(b, a);
screen(b, a);
}
}
if (co == 100) {//向右划;
vector beifen(a);
for (int i = 0; i < b.getwid(); i++) {
for (int j = 0; j < b.getwid(); j++) {
if (a[j + i * b.getwid()] != 0) {
pep.push_back(a[j + i * b.getwid()]);
a[j + i * b.getwid()] = 0;//将处理棋盘的容器归零。并将数值转移至中间容器。
}
int k = b.getwid()-1;
if (j == b.getwid() - 1 && pep.size() > 1) {//这一行非零数大于2时:
for (int q = pep.size()-1; q >0; ) {//与向左的区别在于求和和对比的顺序不同。
if (pep[q] == pep[q - 1]) {
a[k + i * b.getwid()] = 2 * pep[q - 1];
q -= 2;
k–;
if (q == 0) {
a[k + i * b.getwid()] = pep[q];
break;
}
if (q <0)
break;
}
else {
a[k + i * b.getwid()] = pep[q];
k–;
q–;
if (q == 0) {//不相等的数的最后一个不要漏下,少了此判断会少数字。
a[k + i * b.getwid()] = pep[q];
}
}
}
}
if (j == b.getwid() - 1 && pep.size() == 1) {
a[k + i * b.getwid()] = pep[0];
}
//这一行或列为0时不做处理。仍为0.
}
pep.clear();//移除临时容器的所有元素;
}
if (compare(beifen, a)) {
system(“CLS”);
reput(b, a);
screen(b, a);
}
}
if (co == 119) {//向上滑;
vector beifen(a);
for (int i = 0; i < b.getwid(); i++) {
for (int j = 0; j < b.getwid(); j++) {
if (a[i + j * b.getwid()] != 0) {
pep.push_back(a[i + j * b.getwid()]);
a[i + j * b.getwid()] = 0;
}
int k = 0;
if (j == b.getwid() - 1 && pep.size() > 1) {
for (int q = 1; q < pep.size(); ) {
if (pep[q] == pep[q - 1]) {
a[i + k * b.getwid()] = 2 * pep[q - 1];//注意原容器的下标的改变,这里为了避免pep的下标越界,所以使q=1,
q += 2;
k++;
if (q == pep.size()) {
a[i + k * b.getwid()] = pep[q - 1];
break;
}
if (q > pep.size())
break;
}
else {
a[i + k * b.getwid()] = pep[q - 1];
q++;
k++;
if (q == pep.size()) {//不相等的数的最后一个不要漏下,少了此判断会少数字。
a[i + k * b.getwid()] = pep[q - 1];
}
}
}
}
if (j == b.getwid() - 1 && pep.size() == 1) {
a[i + k * b.getwid()] = pep[0];
}
}
pep.clear();//移除临时容器的所有元素;
}
if (compare(beifen, a)) {
system(“CLS”);
reput(b, a);
screen(b, a);
}
}
if (co == 115) {//向下滑;
vector beifen(a);
for (int i = 0; i < b.getwid(); i++) {
for (int j = 0; j < b.getwid(); j++) {
if (a[i + j * b.getwid()] != 0) {
pep.push_back(a[i + j * b.getwid()]);
a[i + j * b.getwid()] = 0;
}
int k = b.getwid()-1;
if (j == b.getwid() - 1 && pep.size() > 1) {
for (int q =( pep.size() - 1); q > 0; ) {
if (pep[q] == pep[q - 1]) {
a[i + k * b.getwid()] = 2 * pep[q - 1];//注意原容器的下标的改变,这里为了避免pep的下标越界,所以使q=1,
q -= 2;
k–;
if (q == 0) {
a[i + k * b.getwid()] = pep[0];
break;
}
if (q < 0)
break;
}
else {
a[i + k * b.getwid()] = pep[q];
q–;
k–;
if (q == 0) {//不相等的数的最后一个不要漏下,少了此判断会少数字。
a[i + k * b.getwid()] = pep[q];
}
}
}
}
if (j == b.getwid() - 1 && pep.size() == 1) {
a[i + k * b.getwid()] = pep[0];
}
}
pep.clear();//移除临时容器的所有元素;
}
if (compare(beifen, a)) {
system(“CLS”);
reput(b, a);
screen(b, a);
}
}
}
bool jieshu (vectorconst &a, game const& b) {
for (int i = 0; i < a.size(); i++) {
if (a[i] == 0) {
return 1;
}
if (i == a.size() - 1) {
for (int j = 0; j < b.getwid(); j++) {
for (int k = 0; k < b.getwid()-1; k++) {
if (a[j * b.getwid() + k] == a[j * b.getwid() + k + 1]|| a[k * b.getwid() + j] == a[(k + 1) * b.getwid() + j])
return 1;
//if (a[k * b.getwid() + j] == a[(k+1) * b.getwid() + j ])
}
}
cout << “gameover!” << endl;
return 0;
}
}
}
bool compare(vectorconst& a, vectorconst& b) {
for (int i = 0; i < a.size(); i++) {
if (a[i] != b[i]) {
return 1;//即可更新重新添加随机数;
}
if (i == a.size()-1) {
return 0;//即无效操作不能更新随机数;
}
}
}
int scores(vectorconst& a) {//计算总成绩的函数
int sum = 0;
for (int i = 0; i < a.size(); i++) {
sum += a[i];
}
return sum;
}

main函数为:
#include"game.h"
#include
using namespace std;
int main() {
int m;
cout << “请输入游戏边长,大于0且小于10” << endl;
cin >> m;
vector data;
for (int i = 0; i < m*m; i++) {
data.push_back(0);
}
game newgame(m);
reput(m,data);
while (jieshu(data,m)) {
//screen(newgame, data);
command(data, newgame);
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值