Easyx-----c++复刻新斗兽棋
原游戏链接:新斗兽棋_新斗兽棋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++复刻新斗兽棋相关推荐
- Easyx-----c语言实现斗兽棋
原游戏链接:新斗兽棋_新斗兽棋html5游戏_4399h5游戏-h.4399.com #include<stdio.h> #include<easyx.h> #include& ...
- 【Unity连载】斗兽棋—棋类游戏开发演示(1)
序言 "黄梅时节家家雨,青草池塘处处蛙.有约不来过夜半,闲敲棋子落灯花." "象棋终日乐悠悠,苦被严亲一旦丢.兵卒坠河皆不救,将军溺水一齐休.马行千里随波去,象入三川逐浪 ...
- 小游戏之斗兽棋(uniapp)
前言 最近学习数据结构与算法,但是平常自己要么刷题,要么看书,很是无聊.就想着游戏中一般都会运用大量的算法,所以就开始写游戏来锻炼自己算法这方面的小能力.后面还会持续做其他小游戏,并发布说说自己做的过 ...
- 【Unity连载】斗兽棋-棋类游戏开发演示(2)
第四章 游戏操作与指令 如同养育一个婴儿,父母总会一步步引领孩子成长,从蹒跚学步到来去如风:我们对游戏功能的开发,也无疑应当从走出第一步棋开始.现在,我们已经构建出了棋盘.棋子等基本的游戏逻辑对象:那 ...
- 用java编写斗兽棋2之规则与走法
今天我们来写斗兽棋的规则和走法 首先介绍一下斗兽棋的一些规则: 动物的实力按照鼠.猫.狗.狼.豹.虎.狮.象从小到大排列,实力大的动物可以吃掉实力比自己小的以及和自己实力相当的动物.老鼠虽小,却能反杀 ...
- vue3 斗兽棋游戏
近来掘金举办前端比赛,所以写了一个小游戏参加,而且熟悉一下vue3,写了一下游戏,思来想去就写了一个斗兽棋游戏. 欢迎去给我加油 点赞评论收藏 ,试玩地址 游戏地址 童年斗兽棋 - 码上 ...
- 斗兽棋测试计划说明书
测试计划 一.引言 1. 编写目的 本测试计划文档作为指导此测试项目循序渐进的基础,帮助我们安排合适的资源和进度,避免可能的风险.本文档有助于实现以下目标: 1) 确定现有项目的信息和应测 ...
- 玩吧斗兽棋的一些攻略 同级子谁胜负问题
抗疫期间喜欢上了玩吧的斗兽棋,一把游戏几分钟就能下完,不仅要有策略,更要有运气,运气不好,再好的局面都会被逆风翻盘. 其中有一种局面,就是双方各执同样级别的棋子时,到底谁会赢,尝试分析了一下 玩吧斗兽 ...
- 动物棋c语言程序,斗兽棋游戏手机版|斗兽棋游戏下载 v0.2C 安卓版_最火软件站...
斗兽棋android手机版,动物对战棋,回味童年的棋牌休闲游戏,登陆android手机,整个游戏画面是分为两块区域,中间有河流分割两块区域,有桥梁可以让彼此的动物过河,要取得胜利,必须占领那一边动物的 ...
最新文章
- nodejs没有net模块_Node.js实战16:用http模块创建web服务器
- 如何提高UI自动化测试的质量
- Switch入门第一讲
- oracle 逻辑回归,逻辑回归 (Logistic Regression):计算概率
- Keras【Deep Learning With Python】Save reload 保存提取模型
- 重磅!百度研究院发布2021年十大科技趋势预测
- web browser 发展史
- hadoop 概要
- mysql opendrowset,java,mysql、jdbc
- java zip 流压缩_关于zip:检测流是否用Java压缩的最佳方法
- 【游戏开发3D数学笔记】1.有话说在前面
- java毕业生设计web人力资源管理系统计算机源码+系统+mysql+调试部署+lw
- 群晖套件中心没有docker_群晖中通过docker安装huginn
- 使用markman助力移动应用开发
- 如何设计一个混沌工程实验?
- 【linux系统安装jdk11】
- 汉诺塔和小青蛙跳台阶问题
- 关于MATLAB对已有数据的频谱分析及关心频率的幅值计算
- 【渝粤题库】陕西师范大学200901外国教育史作业(高起本、专升本)
- 游戏1:HTML5制作网页游戏围住神经猫--createjs
热门文章
- 电容笔和Apple pencil的区别是什么?平价的电容笔推荐
- 小学美术计算机教案模板,【实用】小学美术教案模板五篇
- Cadence_焊盘Pad制作1_表贴焊盘制作
- 特斯拉(自动驾驶)如何做持续集成和持续交付
- iphone外屏碎了多少钱_苹果告诉你:不小心把 iPhone X 摔裂屏,要修多少钱?
- PHP输出星座,PHP获取生日对应星座的方法函数
- Genesys GIM部署
- 计算机科学加急审稿300元,计算机四区sci期刊加急发表sci正刊审稿20天录用
- U盘自己分成了好几个盘要怎么合并
- Ubuntu 20.04安装有道词典(成功版本)