功能尚为完善。。。
本推箱子有三个关卡,可直接按F1、F2、F3切换或在游戏设置里选关,代码通俗易懂,且尚存不少bug,精力有限,暂不更新。

// ConsoleApplication2.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include<iostream>
#include<windows.h>
#define KEY_DOWN(vk_code) GetAsyncKeyState(vk_code) & 0x8000 ? 1 : 0    //获取按键信息
using namespace std;void Map();
void PlayerMove();
void Menu();
void BoxMove();//extern int Array[15][20];
//定义菜单状况
int nMenuState = 1;
//定义选关设置
int nSetState = 1;
//定义关卡状态
int PassState = 1;
//定义选关情况
bool bslect = false;int Array1[15][20] = {{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};
int Array2[15][20] = {{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },{ 1,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1 },{ 1,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};
int Array3[15][20] = {{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1 },{ 1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,1 },{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};
int Array[15][20] = {};struct Player {int P_row;int P_col;int P_rowBk;int P_colBk;Player() {P_row = 0;P_col = 0;P_rowBk = 0;P_colBk = 0;}Player(int x = 10, int y = 10) {P_row = x;P_col = y;P_rowBk = x;P_colBk = y;}void BackUp() {P_rowBk = P_row;P_colBk = P_col;}void restore() {P_row = P_rowBk;P_col = P_colBk;}
};
//Player splayer(1, 1); //初始化玩家坐标
Player splayer = {1,1};struct Box {int box_x;int box_y;int box_xx;//用来备份坐标int box_yy;Box() {box_x = 0;box_y = 0;box_xx = 0;box_yy = 0;}Box(int x = 10, int y = 10) {box_x = x;box_y = y;box_xx = box_x;box_yy = box_y;}void BackUp() {box_xx = box_x;box_yy = box_y;}void restore() {box_x = box_xx;box_y = box_yy;}
};
//第一关箱子坐标初始化
Box sbox[3] = {{ 5,5 },{ 6,6 },{ 7,7 }
};//坑结构体
struct Destinate {int Des_x;int Des_y;Destinate(int a, int b) {Des_x = a;Des_y = b;}
};
Destinate sdestinate[3] = {{ 8,8 },{ 9,9 },{ 10,10 }
};//选关设置
void SetChoise() {while (1) {system("cls");if (KEY_DOWN(VK_UP)) {//cout << "向上被按下" << endl;--nSetState;if (nSetState < 1) { nSetState = 3; }}if (KEY_DOWN(VK_DOWN)) {//cout << "向下被按下" << endl;++nSetState;if (nSetState > 3) { nSetState = 1; }}switch (nSetState) {case 1: cout << "********游戏选关设置********" << endl;cout << "    -> 1、关卡一" << endl;cout << "       2、关卡二" << endl;cout << "       3、关卡三" << endl;system("pause");break;case 2: cout << "********游戏选关设置********" << endl;cout << "       1、关卡一" << endl;cout << "    -> 2、关卡二" << endl;cout << "       3、关卡三" << endl;system("pause");break;case 3: cout << "********游戏选关设置********" << endl;cout << "       1、关卡一" << endl;cout << "       2、关卡二" << endl;cout << "    -> 3、关卡三" << endl;system("pause");break;}if (KEY_DOWN(VK_RETURN)) {if (1 == nSetState) {memcpy(Array, Array1, sizeof(Array));splayer.P_row = 1;splayer.P_col = 1;PassState = 1;for (int i = 0; i < 3; i++) {sbox[i].box_x = 5 + i;sbox[i].box_y = 5 + i;sdestinate[i].Des_x = 8 + i;sdestinate[i].Des_y = 8 + i;}}else if (2 == nSetState) {memcpy(Array, Array2, sizeof(Array));splayer.P_row = 1;splayer.P_col = 1;PassState = 2;for (int i = 0; i < 3; i++) {sbox[i].box_x = 5 + i;sbox[i].box_y = 5 + i;sdestinate[i].Des_x = 3 + i;sdestinate[i].Des_y = 3;}}else if (3 == nSetState) {memcpy(Array, Array3, sizeof(Array));splayer.P_row = 1;splayer.P_col = 1;PassState = 3;memcpy(Array, Array3, sizeof(Array));for (int i = 0; i < 3; i++) {sbox[i].box_x = 10;sbox[i].box_y = 7 + i;sdestinate[i].Des_x = 2 + i;sdestinate[i].Des_y = 2;}}bslect = true;break;}}
}
//判断玩家移动
void PlayerMove() {splayer.BackUp();if (KEY_DOWN(VK_UP)) {--splayer.P_row;}if (KEY_DOWN(VK_DOWN)) {++splayer.P_row;}if (KEY_DOWN(VK_LEFT)) {--splayer.P_col;}if (KEY_DOWN(VK_RIGHT)) {++splayer.P_col;}if (1 == Array[splayer.P_row][splayer.P_col]) {//判断玩家是否越墙splayer.restore();}
}
//判断箱子移动
void BoxMove() {for (int i = 0; i < 3; i++) {sbox[i].BackUp();}int skew_x = 0; //临时偏移量int skew_y = 0;for (int s = 0; s < 3; s++) {  //利用坐标偏移量求箱子新位置if (splayer.P_row == sbox[s].box_x && splayer.P_col == sbox[s].box_y) {skew_x = sbox[s].box_x - splayer.P_rowBk;skew_y = sbox[s].box_y - splayer.P_colBk;sbox[s].box_x = sbox[s].box_x + skew_x;sbox[s].box_y = sbox[s].box_y + skew_y;/*sbox[s].restore();*/}}for (int a = 0; a < 3; a++) {for (int b = 0; b < 3; b++) {if (a != b && (sbox[a].box_x == sbox[b].box_x && sbox[a].box_y == sbox[b].box_y)) {splayer.restore();sbox[a].restore();}}}for (int s = 0; s < 3; s++) {  //判断箱子是否越界if (1 == Array[sbox[s].box_x][sbox[s].box_y]) {splayer.restore();sbox[s].restore();}}
}//判断胜利
void JudgeWin() {int nCorrectNum = 0; //判断箱子推到正确位置的数量for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {if (sdestinate[i].Des_x == sbox[j].box_x && sdestinate[i].Des_y == sbox[j].box_y) {++nCorrectNum;break;}}if (3 <= nCorrectNum) {//system("cls");cout << "You Win!" << endl;++PassState;if (2 == PassState) {memcpy(Array, Array2, sizeof(Array));//更新玩家位置splayer.P_row = 1;splayer.P_col = 1;//更新箱子和坑状态for (int i = 0; i < 3; i++) {sbox[i].box_x = 5 + i;sbox[i].box_y = 5 + i;sdestinate[i].Des_x = 3 + i;sdestinate[i].Des_y = 3;}}if (3 == PassState) {splayer.P_row = 1;splayer.P_col = 1;memcpy(Array, Array3, sizeof(Array));for (int i = 0; i < 3; i++) {sbox[i].box_x = 10;sbox[i].box_y = 7 + i;sdestinate[i].Des_x = 2 + i;sdestinate[i].Des_y = 2;}}//system("pause");break;}/*system("pause");*/}}//打印游戏菜单
void Menu() {if (KEY_DOWN(VK_UP)) {//cout << "向上被按下" << endl;--nMenuState;if (nMenuState < 1) { nMenuState = 3; }}if (KEY_DOWN(VK_DOWN)) {//cout << "向下被按下" << endl;++nMenuState;if (nMenuState > 3) { nMenuState = 1; }}switch (nMenuState) {case 1: system("cls");cout << "********游戏界面菜单********" << endl;cout << "    -> 1、游戏开始" << endl;cout << "       2、游戏设置" << endl;cout << "       3、退出游戏" << endl << endl;cout << "  ->按小键盘↑↓←→移动<- " << endl;cout << "  ->按F1 F2 F3可切换关卡<- " << endl;system("pause");break;case 2: system("cls");cout << "********游戏界面菜单********" << endl;cout << "       1、游戏开始" << endl;cout << "    -> 2、游戏设置" << endl;cout << "       3、退出游戏" << endl << endl;cout << "  ->按小键盘↑↓←→移动<- " << endl;cout << "  ->按F1 F2 F3可切换关卡<- " << endl;system("pause");break;case 3: system("cls");cout << "********游戏界面菜单********" << endl;cout << "       1、游戏开始" << endl;cout << "       2、游戏设置" << endl;cout << "    -> 3、退出游戏" << endl << endl;cout << "  ->按小键盘↑↓←→移动<- " << endl;cout << "  ->按F1 F2 F3可切换关卡<- " << endl;system("pause");break;}
}void Map() {while (1) {system("cls");PlayerMove();BoxMove();JudgeWin();if (4 == PassState) {cout << "恭喜通关" << endl;PassState = 1;memcpy(Array, Array1, sizeof(Array));//更新玩家位置splayer.P_row = 1;splayer.P_col = 1;//更新箱子和坑状态for (int i = 0; i < 3; i++) {sbox[i].box_x = 5 + i;sbox[i].box_y = 5 + i;sdestinate[i].Des_x = 8 + i;sdestinate[i].Des_y = 8 + i;}system("pause");break;}if (KEY_DOWN(VK_F1)) {memcpy(Array, Array1, sizeof(Array));PassState = 1;//更新玩家位置splayer.P_row = 1;splayer.P_col = 1;//更新箱子和坑状态for (int i = 0; i < 3; i++) {sbox[i].box_x = 5 + i;sbox[i].box_y = 5 + i;}}if (KEY_DOWN(VK_F2)) {memcpy(Array, Array2, sizeof(Array));PassState = 2;//更新玩家位置splayer.P_row = 1;splayer.P_col = 1;//更新箱子和坑状态for (int i = 0; i < 3; i++) {sbox[i].box_x = 3 + i;sbox[i].box_y = 5;sdestinate[i].Des_x = 3 + i;sdestinate[i].Des_y = 3;}}if (KEY_DOWN(VK_F3)) {memcpy(Array, Array3, sizeof(Array));PassState = 3;//更新玩家位置splayer.P_row = 1;splayer.P_col = 1;//更新箱子和坑状态for (int i = 0; i < 3; i++) {sbox[i].box_x = 10;sbox[i].box_y = 7 + i;sdestinate[i].Des_x = 2 + i;sdestinate[i].Des_y = 2;}}//打印地图for (int i = 0; i < 15; i++) {for (int j = 0; j < 20; j++) {bool bDrawBox = false;  //判断箱子for (int m = 0; m < 3; m++) {if (i == sbox[m].box_x && j == sbox[m].box_y) {bDrawBox = true;break;}}bool bDrawDes = false;  //判断坑for (int m = 0; m < 3; m++) {if (i == sdestinate[m].Des_x && j == sdestinate[m].Des_y) {bDrawDes = true;break;}}if (1 == Array[i][j]) {cout << "■";}else if (i == splayer.P_row && j == splayer.P_col) {cout << "♀";}else if (true == bDrawBox) {  //将true放在前面,不然出现全是箱子都不知道怎么错的……cout << "箱";}else if (true == bDrawDes) {cout << "坑";}else {cout << "  ";}}cout << endl;}system("pause");}
}int _tmain(int argc, _TCHAR* argv[])
{memcpy(Array, Array1, sizeof(Array));while (1) {//if (KEY_DOWN(VK_RETURN)){ // if (1 == nMenuState) {//      Map();//    }// else if (2 == nMenuState) {//     SetChoise();//  /*  cout << "wwww";//       system("pause");*///  }// else if (3 == nMenuState)//       return 0;//}if (3 == nMenuState && KEY_DOWN(VK_RETURN)) {  //可以return 0;}else if (2 == nMenuState && KEY_DOWN(VK_RETURN)) {SetChoise();if (bslect) {Map();}}else if (1 == nMenuState && KEY_DOWN(VK_RETURN)) {Map();}//if (KEY_DOWN(VK_RETURN) && 3 == nMenuState) {  //KEY_DOWN(VK_RETURN)不能进行与或运算  ??// return 0;//}//else if (KEY_DOWN(VK_RETURN) && 1 == nMenuState) {//    Map();//}else {Menu();}}//Map();system("pause");return 0;
}

代码效果:


C++推箱子小游戏(源码)相关推荐

  1. HTML5推箱子小游戏 源码 共100关哦!

    推箱子 源码链接地址:https://github.com/shunyue1320/sokoban.git 推箱子小游戏展示效果图: 源码链接地址:https://github.com/shunyue ...

  2. 推箱子matlab源代码,C++实现推箱子小游戏源码

    本文实例为大家分享了C++实现推箱子小游戏的具体代码,供大家参考,具体内容如下 功能尚为完善. // ConsoleApplication2.cpp : 定义控制台应用程序的入口点. // #incl ...

  3. 基于Android的推箱子小游戏 源码

    完整工程已打包放在我的资源文件中  https://download.csdn.net/download/huangshuai147/11151692 package com.example.push ...

  4. 推箱子经典游戏源码 附成品 易语言源码

    介绍: 儿时大家应该都有玩过这个游戏吧? 刚兴趣的可以学习下 网盘下载地址: http://kekewangLuo.net/5BZQNDP9yWH 图片:

  5. 手把手教你使用Python实现推箱子小游戏(附完整源码)

    文章目录 项目介绍 项目规则 项目接口文档 项目实现过程 前置方法编写 move核心方法编写 项目收尾 项目完善 项目整体源码 项目缺陷分析 项目收获与反思 项目介绍 我们这个项目是一个基于Pytho ...

  6. [原创]jQuery推箱子小游戏(100关且可扩展可选关),休闲,对战,娱乐,小游戏,下载即用,兼容iPad移动端,代码注释全(附源码)

    Sokoban 介绍 [原创]jQuery推箱子小游戏(100关且可扩展可选关),休闲,对战,娱乐,小游戏,下载即用,兼容iPad移动端,代码注释全(附源码) 游戏说明 经典的推箱子是一个来自日本的古 ...

  7. [源码和文档分享]基于Java Swing JFream 组件的趣味推箱子小游戏

    一 需求分析 设计一个经典的推箱子小游戏,在窗体里有墙,箱子,胜利的标志,和工人,用户可以通过键盘上的"上"."下"."左"."右 ...

  8. c++ 小游戏_C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目

    C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...

  9. 【Java】推箱子小游戏(带背景音乐)完整代码

    Java实现推箱子小游戏 一.整体框架 二.游戏效果图 三.推箱子四大类 1. GameFrame类 2. Map类 3. MapFactory类 4. Sound类 四.游戏分析 1.游戏操作 2. ...

  10. Python【小游戏合集】之自己做一个简单又好玩的推箱子小游戏

    导语:哈喽铁汁们~今日游戏之旅开始! 想领取完整源码跟python学习资料可私信我或点击这行字体 这期就是带大家使用当前主流且易用的Python语言做一个简单的推箱子小游戏 现在小编的快乐源泉就是玩自 ...

最新文章

  1. Matlab视频流处理:读取,播放,保存
  2. mysql中char与varchar的区别分析(补充一句,int和integer没区别)
  3. 在注意力中重新思考Softmax:分解非线性,这个线性transformer变体实现多项SOTA
  4. Lifting Transformer: 基于跨步卷积Transformer的高效三维人体姿态估计
  5. 机器学习和深度学习视频资料精选(附学习资料)
  6. oracle ddl会被什么阻塞,MySQL Online DDL与DML并发阻塞关系总结
  7. 混沌系统 matlab仿真分析
  8. Hibernate性能提升
  9. tolowercase_Java String toLowerCase()方法与示例
  10. 在python中要表示一个空的代码块可以使用空语句什么_Python条件判断语句if
  11. 中国移动咪咕公司:打造五新体验 做5G时代内容的聚合者与生产者
  12. 用计算机制作动画,如何使用制作工具制作一个简单的Flash动画-电脑自学网
  13. win 10安装MySQL
  14. 程序员如何从0到1搭建自己的技术博客
  15. Vs 2008 sp1更新后出现的问题!
  16. CSS外链怎么写,css外链式基本写法是什么
  17. php mysql begin_PHP mysqli_begin_transaction() 函数用法及示例
  18. 通过TABULATE过程制作汇总报表
  19. SEO小白利用老域名将2个百度指数1000+的词快速上排名的案例
  20. 【CityHunter】通过Unity3D来制作游戏中AR部分的内容

热门文章

  1. 如何从外网SSH访问家中的树莓派?
  2. 抱薪者说 | 在Conflux玩夺宝游戏是怎样的一种体验?
  3. Linux下 Xpad不能移动拖动 解决办法
  4. 设置允许从网络访问计算机的用户账户(加入guest组),网络共享
  5. RNA-seq:转录组数据分析处理(上)
  6. 如何查看Win11的CUDA版本
  7. 30. 串联所有单词的子串
  8. Revit二开--批量修改视图范围(revit宏)
  9. 计算机软考难吗?如何通过?
  10. 学习记录:计算机网络基础知识总结