• 原游戏链接:新斗兽棋_新斗兽棋html5游戏_4399h5游戏-h.4399.com

common.h

#pragma once
#include <graphics.h>
#include <iostream>
#include <string>
#include <map>
#include<array>
#include <list>
#include <thread>
#include <vector>
#include <ctime>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
using namespace std;

res.h

#pragma once
#include "common.h"
class Res
{
private:Res();
public:static int WIDTH(string name);static int HEIGHT(string name);static Res* GetInstance();static void Draw_IMG(int x, int y, string name);              //图片绘制static void DrawIMG(int x, int y, string name, int preIndex); ~Res();
public:static map<string, IMAGE*> img;        //图片static int ROW;                     //行|列static int COL;
};

res.cpp

#include "res.h"
map<string, IMAGE*> Res::img;     //图片
int Res::ROW = 4;                  //行|列
int Res::COL = 4;
/*———————————————————————————————————————————加载 和 初始化 图片相关内容图片分为蓝方和红方鼠:1 9猫:2 10狗:3 11狼:4 12豹:5 13虎:6 14狮:7 15象:8 16路面:0
————————————————————————————————————————————*/
Res::Res()
{//背景 蓝队 红队string BackGround = "./res/background.png";//卡片string Card = "./res/Card.png";//象string Elephant[2] = {"./res/BElephant.png","./res/RElephant.png"};//狮string Lion[2] = { "./res/BLion.png","./res/RLion.png" };//虎string Tiger[2] = { "./res/BTiger.png","./res/RTiger.png" };//豹string Leopard[2] = { "./res/BLeopard.png","./res/RLeopard.png" };//狼string Wolf[2] = { "./res/BWolf.png","./res/RWolf.png" };//狗string Dog[2] = { "./res/BDog.png","./res/RDog.png" };//猫string Cat[2] = { "./res/BCat.png","./res/RCat.png" };//鼠string Mouse[2] = { "./res/BMouse.png","./res/RMouse.png" };//岩浆string Fire = "./res/Fire.png";//路面string Road = "./res/Road.png";img["背景"] = new IMAGE;img["卡片"] = new IMAGE;img["岩浆"] = new IMAGE;img["路面"] = new IMAGE;img["象"] = new IMAGE[2];img["狮"] = new IMAGE[2];img["虎"] = new IMAGE[2];img["豹"] = new IMAGE[2];img["狼"] = new IMAGE[2];img["狗"] = new IMAGE[2];img["猫"] = new IMAGE[2];img["鼠"] = new IMAGE[2];loadimage(img["背景"], BackGround.c_str());loadimage(img["卡片"], Card.c_str());loadimage(img["岩浆"], Fire.c_str(),90,108);loadimage(img["路面"], Road.c_str(),90,108);for (int i = 0; i < 2; i++){loadimage(img["象"] + i, Elephant[i].data(), 90, 108);loadimage(img["狮"] + i, Lion[i].data(), 90, 108);loadimage(img["虎"] + i, Tiger[i].data(), 90, 108);loadimage(img["豹"] + i, Leopard[i].data(), 90, 108);loadimage(img["狼"] + i, Wolf[i].data(), 90, 108);loadimage(img["狗"] + i, Dog[i].data(), 90, 108);loadimage(img["猫"] + i, Cat[i].data(), 90, 108);loadimage(img["鼠"] + i, Mouse[i].data(), 90, 108);}
}
int Res::WIDTH(string name)
{return GetInstance()->img[name]->getwidth();
}int Res::HEIGHT(string name)
{return GetInstance()->img[name]->getheight();
}Res* Res::GetInstance()
{static Res* res = new Res;return res;
}void Res::Draw_IMG(int x, int y, string name)
{putimage(x, y, GetInstance()->img[name]);
}void Res::DrawIMG(int x, int y, string name, int preIndex)
{putimage(x, y, GetInstance()->img[name] + preIndex);
}
Res::~Res()
{delete img["背景"];delete img["卡片"];delete img["岩浆"];delete img["路面"];delete[]img["象"];delete[]img["狮"];delete[]img["虎"];delete[]img["豹"];delete[]img["狼"];delete[]img["狗"];delete[]img["猫"];delete[]img["鼠"];
}

data.h

#pragma once
#include"common.h"
//根据鼠标消息,做数据的改变
class Data
{
public:void Set();                              void changeValue(int i, int j, int value);void constValue(int i, int j, int value);array<array<int, 4>, 4>& getMap();           //在外面画图要访问数据,提供外部访问接口 protected:array <array< int, 4 >, 4 > map = { 0 };};

data.cpp

#include "data.h"
#include "res.h"             //用到资源
#include"common.h"
void Data::Set()
{srand((unsigned)time(NULL));int i = 1;for (int a = 0; a < Res::ROW; a++){for (int b = 0; b < Res::COL; b++){map[a][b] = i;i++;}}for (int a = 0; a < Res::ROW; a++){for (int b = 0; b < Res::COL; b++){int i = rand() % 4;int j = rand() % 4;int t = map[i][j];map[i][j] = map[a][b];map[a][b] = t;}}
//加密格子 遍历每一个元素,对每一个元素加一个数处理,让它与原来不同,就不会输出原来对应的图片for (int j = 0; j < Res::ROW; j++){for (int k = 0; k < Res::COL; k++){//++map[r][c];changeValue(j, k, 20); //所有的都需要加密}}
}void Data::changeValue(int i, int j, int value)
{map[i][j] += value;
}void Data::constValue(int i, int j, int value)
{map[i][j] = value;
}array<array<int, 4>, 4>& Data::getMap()
{// TODO: 在此处插入 return 语句return map;
}

DrawImg.h

#pragma once
#include"common.h"
#include"data.h"
class Data;
class Draw
{
public:Draw();void Game_Draw();     //根据数据画图片|数据的处理封装在Game中Data* getData() { return pData; }void showData();
protected:Data* pData;          //游戏需要用到数据,包含数据的指针};

DrawImg.cpp

#include "DrawImg.h"
#include"res.h"
#include"data.h"
#include "button.h"
Draw::Draw():pData(new Data)
{pData->Set();initgraph(Res::WIDTH("背景"), Res::HEIGHT("背景"), EW_SHOWCONSOLE);Res::Draw_IMG(0, 0, "背景");}
void Draw::showData()
{for (int i = 0; i < Res::ROW; i++){for (int k = 0; k < Res::COL; k++){cout << pData->getMap()[i][k] << "\t";}cout << endl;}cout << endl;
}
void Draw::Game_Draw()
{for (int i = 0; i < Res::ROW; i++){for (int k = 0; k < Res::COL; k++){//前面间距28 水平间距42 上面间距65 垂直间距43if (pData->getMap()[i][k] >= 1 && pData->getMap()[i][k] <= 16)    //范围[1+20,16+20]{switch (pData->getMap()[i][k]){case 1:Res::DrawIMG(CardX(k), CardY(i), "鼠", 0);break;case 2:Res::DrawIMG(CardX(k), CardY(i), "猫", 0);break;            case 3:                 Res::DrawIMG(CardX(k), CardY(i), "狗", 0);break;            case 4:                 Res::DrawIMG(CardX(k), CardY(i), "狼", 0);break;          case 5:                 Res::DrawIMG(CardX(k), CardY(i), "豹", 0);break;            case 6:                 Res::DrawIMG(CardX(k), CardY(i), "虎", 0);break;           case 7:                 Res::DrawIMG(CardX(k), CardY(i), "狮", 0);break;           case 8:                 Res::DrawIMG(CardX(k), CardY(i), "象", 0);break;           case 9:                 Res::DrawIMG(CardX(k), CardY(i), "鼠", 1);break;                 case 10:                    Res::DrawIMG(CardX(k), CardY(i), "猫", 1);break;               case 11:                    Res::DrawIMG(CardX(k), CardY(i), "狗", 1);break;                   case 12:                Res::DrawIMG(CardX(k), CardY(i), "狼", 1);break;                   case 13:                    Res::DrawIMG(CardX(k), CardY(i), "豹", 1);break;               case 14:                        Res::DrawIMG(CardX(k), CardY(i), "虎", 1);break;                   case 15:                Res::DrawIMG(CardX(k), CardY(i), "狮", 1);break;                   case 16:                Res::DrawIMG(CardX(k), CardY(i), "象", 1);break;                   }}else if (pData->getMap()[i][k] == 0)   {Res::Draw_IMG(CardX(k), CardY(i), "路面");}}}
}

button.h

#pragma once
#include "common.h"
#include"DrawImg.h"
#include"res.h"
#include "data.h"
#define CardW() 90                              //图片宽
#define CardH() 108                             //图片高
#define CardX(col) (28 + col * (CardW() + 42))    //28 左边的间隔  42 横向中间的间隔
#define CardY(row) (65 + row * (CardH() + 43))  //65 上边的间隔  43 横向中间的间隔
#define AT_Max 9
enum BothType
{BT_Red,BT_Blue
};
class Data;
/*———————————————————————————————————————————鼠标按键控制:鼠标是地图变化的按键
————————————————————————————————————————————*/
class Button
{
public:     void ClickButton(ExMessage msg, Data* pData);               /*鼠标操作的事件响应: 鼠标点击...*/bool isIn(int x,int y,int left,int top,int w,int h);//鼠标控制下棋void luozi(Data* pData);//消费者是否能吃食物bool card_eat(Data* pData1, Data* pData2,int begRow, int begCol, int overRow, int overCol);//获取int card_type(Data* card,int i,int j){if (card->getMap()[i][j] <= 8){return BT_Blue;}else if (card->getMap()[i][j] && card->getMap()[i][j] < AT_Max * 2 - 1){return BT_Red;}}//两张牌类型是否相同bool card_sameType(Data* pData1, Data* pData2, int begRow, int begCol,int overRow,int overCol){return card_type(pData1, begRow,begCol) == card_type(pData2, overRow,overCol);}
protected:};

button.cpp

#include "button.h"int curBothType = BT_Blue; //当前行棋方
enum State
{Begin,End
};
int press = Begin;//第一次点击还是第二次点击struct Index
{int row;int col;
}beg = { -1,-1 }, over = { -1,-1 };//判断某个坐标是否在矩形中
bool Button::isIn(int x, int y, int left, int top, int w, int h)
{if (x > left && x < left + w && y > top && y < top + h){return true;}return false;
}
void Button::ClickButton(ExMessage msg, Data* pData)
{for (int i = 0; i < 4; i++){for (int k = 0; k < 4; k++){//判断是否点击当前下标的卡牌(i,k)if (isIn(msg.x, msg.y, CardX(k), CardY(i), CardW(), CardH())){//判断卡牌有没有被翻开,如果没有就翻开if (pData->getMap()[i][k] > 20){pData->changeValue(i, k, -20);}//如果翻开了判断能不能移动或者吃else{//不管是移动还是吃,都需要记录前后两次的位置//移动或者吃,需要知道两次点击的牌if (press == Begin){beg = { i,k };press = End;printf("begin(%d %d) %d\n", i, k, curBothType);}else if (press == End){over = { i ,k };press = Begin;printf("end(%d %d) %d\n", i, k, curBothType);}}}}}
}void Button::luozi(Data* pData)
{//beg end不为-1 并且不是同一个位置if ((beg.row != -1 && over.row != -1) && !(beg.row == over.row && beg.col == over.col)){//在同一列或者同一行if ((abs(beg.row - over.row) == 1 && beg.col == over.col) || (abs(beg.col - over.col) == 1 && beg.row == over.row)){//吃bool ok = card_eat(pData,pData,over.row,over.col,beg.row, beg.col);//移动if (ok || pData->getMap()[over.row][over.col] == 0){pData->getMap()[over.row][over.col] = pData->getMap()[beg.row][beg.col];pData->getMap()[beg.row][beg.col] = 0;beg = over = { -1,-1 };//切换棋手curBothType = (curBothType + 1) % 2;}}}
}bool Button::card_eat(Data* food, Data* consumer, int begRow, int begCol, int overRow, int overCol)
{//先把大于8的,也转成小于八的,方便比较int ftype = food->getMap()[begRow][begCol];int ctype = consumer->getMap()[overRow][overCol];ftype = ftype > 8 ? food->getMap()[begRow][begCol] - 8 : ftype;ctype = ctype > 8 ? consumer->getMap()[overRow][overCol] - 8 : ctype;if (!card_sameType(food, consumer, begRow, begCol, overRow,overCol) &&            //不是同一方ftype <= ctype ||    /*大吃小*/ (ftype == 8 && ctype == 1)   //老鼠吃大象){return true;}return false;
}

c++斗兽棋.cpp

#include"DrawImg.h"
#include"data.h"
#include"button.h"
#include"res.h"
int main()
{Draw draw;Button* pp = new Button();      //按钮ExMessage msg;                  //定义鼠标消息while (true){while (peekmessage(&msg, EM_MOUSE))  //获取鼠标消息{if (msg.message == WM_LBUTTONDOWN){pp->ClickButton(msg, draw.getData());}}draw.showData();                  //显示数据draw.Game_Draw();                 //绘制pp->luozi(draw.getData());}return 0;
}

Easyx-----c++复刻新斗兽棋相关推荐

  1. Easyx-----c语言实现斗兽棋

    原游戏链接:新斗兽棋_新斗兽棋html5游戏_4399h5游戏-h.4399.com #include<stdio.h> #include<easyx.h> #include& ...

  2. 【Unity连载】斗兽棋—棋类游戏开发演示(1)

    序言 "黄梅时节家家雨,青草池塘处处蛙.有约不来过夜半,闲敲棋子落灯花." "象棋终日乐悠悠,苦被严亲一旦丢.兵卒坠河皆不救,将军溺水一齐休.马行千里随波去,象入三川逐浪 ...

  3. 小游戏之斗兽棋(uniapp)

    前言 最近学习数据结构与算法,但是平常自己要么刷题,要么看书,很是无聊.就想着游戏中一般都会运用大量的算法,所以就开始写游戏来锻炼自己算法这方面的小能力.后面还会持续做其他小游戏,并发布说说自己做的过 ...

  4. 【Unity连载】斗兽棋-棋类游戏开发演示(2)

    第四章 游戏操作与指令 如同养育一个婴儿,父母总会一步步引领孩子成长,从蹒跚学步到来去如风:我们对游戏功能的开发,也无疑应当从走出第一步棋开始.现在,我们已经构建出了棋盘.棋子等基本的游戏逻辑对象:那 ...

  5. 用java编写斗兽棋2之规则与走法

    今天我们来写斗兽棋的规则和走法 首先介绍一下斗兽棋的一些规则: 动物的实力按照鼠.猫.狗.狼.豹.虎.狮.象从小到大排列,实力大的动物可以吃掉实力比自己小的以及和自己实力相当的动物.老鼠虽小,却能反杀 ...

  6. vue3 斗兽棋游戏

    近来掘金举办前端比赛,所以写了一个小游戏参加,而且熟悉一下vue3,写了一下游戏,思来想去就写了一个斗兽棋游戏. 欢迎去给我加油      点赞评论收藏  ,试玩地址  游戏地址 童年斗兽棋 - 码上 ...

  7. 斗兽棋测试计划说明书

    测试计划 一.引言       1. 编写目的 本测试计划文档作为指导此测试项目循序渐进的基础,帮助我们安排合适的资源和进度,避免可能的风险.本文档有助于实现以下目标: 1) 确定现有项目的信息和应测 ...

  8. 玩吧斗兽棋的一些攻略 同级子谁胜负问题

    抗疫期间喜欢上了玩吧的斗兽棋,一把游戏几分钟就能下完,不仅要有策略,更要有运气,运气不好,再好的局面都会被逆风翻盘. 其中有一种局面,就是双方各执同样级别的棋子时,到底谁会赢,尝试分析了一下 玩吧斗兽 ...

  9. 动物棋c语言程序,斗兽棋游戏手机版|斗兽棋游戏下载 v0.2C 安卓版_最火软件站...

    斗兽棋android手机版,动物对战棋,回味童年的棋牌休闲游戏,登陆android手机,整个游戏画面是分为两块区域,中间有河流分割两块区域,有桥梁可以让彼此的动物过河,要取得胜利,必须占领那一边动物的 ...

最新文章

  1. nodejs没有net模块_Node.js实战16:用http模块创建web服务器
  2. 如何提高UI自动化测试的质量
  3. Switch入门第一讲
  4. oracle 逻辑回归,逻辑回归 (Logistic Regression):计算概率
  5. Keras【Deep Learning With Python】Save reload 保存提取模型
  6. 重磅!百度研究院发布2021年十大科技趋势预测
  7. web browser 发展史
  8. hadoop 概要
  9. mysql opendrowset,java,mysql、jdbc
  10. java zip 流压缩_关于zip:检测流是否用Java压缩的最佳方法
  11. 【游戏开发3D数学笔记】1.有话说在前面
  12. java毕业生设计web人力资源管理系统计算机源码+系统+mysql+调试部署+lw
  13. 群晖套件中心没有docker_群晖中通过docker安装huginn
  14. 使用markman助力移动应用开发
  15. 如何设计一个混沌工程实验?
  16. 【linux系统安装jdk11】
  17. 汉诺塔和小青蛙跳台阶问题
  18. 关于MATLAB对已有数据的频谱分析及关心频率的幅值计算
  19. 【渝粤题库】陕西师范大学200901外国教育史作业(高起本、专升本)
  20. 游戏1:HTML5制作网页游戏围住神经猫--createjs

热门文章

  1. 电容笔和Apple pencil的区别是什么?平价的电容笔推荐
  2. 小学美术计算机教案模板,【实用】小学美术教案模板五篇
  3. Cadence_焊盘Pad制作1_表贴焊盘制作
  4. 特斯拉(自动驾驶)如何做持续集成和持续交付
  5. iphone外屏碎了多少钱_苹果告诉你:不小心把 iPhone X 摔裂屏,要修多少钱?
  6. PHP输出星座,PHP获取生日对应星座的方法函数
  7. Genesys GIM部署
  8. 计算机科学加急审稿300元,计算机四区sci期刊加急发表sci正刊审稿20天录用
  9. U盘自己分成了好几个盘要怎么合并
  10. Ubuntu 20.04安装有道词典(成功版本)