利用C语言实现经典游戏斗兽棋
短信预约 -IT技能 免费直播动态提醒
效果图
核心代码
#include<stdio.h>
#include<easyx.h>
#include<stdlib.h>
#include<time.h>
#define IMAGE_NUM_ANIMAL 8 //动物图片数量
enum AnimalType
{
AT_None, //没有
AT_Mouse, //老鼠
AT_Cat, //猫
AT_Dog, //狗
AT_Wolf, //狼
AT_Leopard, //豹子
AT_Tiger, //老虎
AT_Lion, //狮子
AT_Elephant, //大象
AT_Max
};
enum BothType
{
BT_Red,
BT_Blue
};
IMAGE img_animals[17];
IMAGE imgs[2]; //背景 前面间距28 水平间距42 上面间距65 垂直间距43
void loadResource()
{
loadimage(img_animals + 0, "./res/Road.png");
loadimage(img_animals + 1, "./res/BMouse.png");
loadimage(img_animals + 2, "./res/BCat.png");
loadimage(img_animals + 3, "./res/BDog.png");
loadimage(img_animals + 4, "./res/BWolf.png");
loadimage(img_animals + 5, "./res/BLeopard.png");
loadimage(img_animals + 6, "./res/BTiger.png");
loadimage(img_animals + 7, "./res/BLion.png");
loadimage(img_animals + 8, "./res/BElephant.png");
loadimage(img_animals + 9, "./res/RMouse.png");
loadimage(img_animals + 10, "./res/RCat.png");
loadimage(img_animals + 11, "./res/RDog.png");
loadimage(img_animals + 12, "./res/RWolf.png");
loadimage(img_animals + 13, "./res/RLeopard.png");
loadimage(img_animals + 14, "./res/RTiger.png");
loadimage(img_animals + 15, "./res/RLion.png");
loadimage(img_animals + 16, "./res/RElephant.png");
loadimage(imgs + 0, "./res/BackGround.png");
loadimage(imgs + 1, "./res/Card.png");
}
IMAGE* getAnimalImage(int type)
{
//如果格子已经加密了
if (type > 20)
{
return imgs + 1;
}
if (type >= 0 && type < AT_Max)
{
return img_animals + type;
}
else if (type > 8 && type < 2 * AT_Max - 1)
{
return img_animals + type;
}
return NULL;
}
struct Card
{
int row;
int col;
int animalType; //动物类型
//int bothType; //双方类型 红 蓝
};
#define CardW() img_animals[0].getwidth()
#define CardH() img_animals[0].getheight()
#define CardX(col) (28 + col * (CardW() + 42)) //28 左边的间隔 42 横向中间的间隔
#define CardY(row) (65 + row * (CardH() + 43)) //65 上边的间隔 43 横向中间的间隔
void card_init(Card* card, int row, int col, int aniType)
{
card->row = row;
card->col = col;
card->animalType = aniType;
}
void card_draw(Card* card)
{
putimage(CardX(card->col), CardY(card->row), getAnimalImage(card->animalType));
}
//获取
int card_type(Card* card)
{
if (card->animalType <= 8)
{
return BT_Blue;
}
else if (card->animalType > 8 && card->animalType < AT_Max * 2 - 1)
{
return BT_Red;
}
}
//两张牌类型是否相同
bool card_sameType(Card* card1, Card* card2)
{
return card_type(card1) == card_type(card2);
}
//消费者是否能吃食物
bool card_eat(Card* food, Card* consumer)
{
//先把大于8的,也转成小于八的,方便比较
int ftype = food->animalType;
int ctype = consumer->animalType;
ftype = ftype > 8 ? food->animalType - 8 : ftype;
ctype = ctype > 8 ? consumer->animalType - 8 : ctype;
if (!card_sameType(food, consumer) && //不是同一方
ftype <= ctype || (ftype == AT_Elephant && ctype == AT_Mouse)//老鼠吃大象
)
{
return true;
}
return false;
}
Card cards[4][4];
int curBothType = BT_Blue; //当前行棋方
enum State
{
Begin,
End
};
int press = Begin;//第一次点击还是第二次点击
struct Index
{
int row;
int col;
}beg = { -1,-1 }, end = { -1,-1 };
void init()
{
srand(time(NULL));
for (int i = 0; i < 4; i++)
{
for (int k = 0; k < 4; k++)
{
card_init(cards[i] + k, i, k, i * 4 + k + 1);
}
}
//打乱数组
for (int i = 0; i < 4; i++)
{
for (int k = 0; k < 4; k++)
{
int r = rand() % 4;
int c = rand() % 4;
Card t = cards[r][c];
cards[r][c] = cards[i][k];
cards[i][k] = t;
}
}
//加密数组
for (int i = 0; i < 4; i++)
{
for (int k = 0; k < 4; k++)
{
cards[i][k].animalType += 20;
printf("%d ", cards[i][k].animalType);
}
putchar('\n');
}
}
void draw()
{
//绘制背景
putimage(0, 0, imgs + 0);
for (int i = 0; i < 4; i++)
{
for (int k = 0; k < 4; k++)
{
IMAGE* t = getAnimalImage(cards[i][k].animalType);
putimage(CardX(k), CardY(i), t);
}
}
if (beg.row != -1)
{
setlinestyle(PS_SOLID, 3);
setlinecolor(RED);
int x = CardX(beg.col);
int y = CardY(beg.row);
int w = CardW();
int h = CardH();
rectangle(x, y, x + w, y + h);
}
}
//65 264 28 65 90 108
bool 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 onMouseLbuttonDown(ExMessage* msg)
{
for (int i = 0; i < 4; i++)
{
for (int k = 0; k < 4; k++)
{
//判断是否在卡牌上点击
if (isIn(msg->x, msg->y, CardX(k), CardY(i), CardW(), CardH()))
{
//如果没有翻开,则翻开
if (cards[i][k].animalType > 20)
{
cards[i][k].animalType -= 20;
}
//如果翻开了,可以移动或者吃
else
{
//如果点击的是同一方的牌,直接改变begin
//if (card_type(&cards[i][k]) == curBothType)
//{
// press = Begin;
//}
//点击不同的牌在move函数里进行判断
//移动或者吃,需要知道两次点击的牌
if (press == Begin)
{
beg = { i,k };
press = End;
printf("begin(%d %d) %d\n", i, k, curBothType);
}
else if (press == End)
{
end = { i ,k };
press = Begin;
printf("end(%d %d) %d\n", i, k, curBothType);
}
}
}
}
}
}
void move()
{
//beg end不为-1 并且不是同一个位置
if ((beg.row != -1 && end.row != -1) && !(beg.row == end.row && beg.col == end.col))
{
//在同一列或者同一行
if ((abs(beg.row - end.row) == 1 && beg.col == end.col) || (abs(beg.col - end.col) == 1 && beg.row == end.row))
{
//吃
bool ok = card_eat(&cards[end.row][end.col], &cards[beg.row][beg.col]);
//移动
if (ok || cards[end.row][end.col].animalType == AT_None)
{
cards[end.row][end.col] = cards[beg.row][beg.col];
cards[beg.row][beg.col].animalType = AT_None;
beg = end = { -1,-1 };
//切换棋手
curBothType = (curBothType + 1) % 2;
}
}
}
}
int main()
{
initgraph(540, 677);
loadResource();
init();
while (true)
{
BeginBatchDraw();
draw();
EndBatchDraw();
ExMessage msg;
while (peekmessage(&msg, EM_MOUSE))
{
if (msg.message == WM_LBUTTONDOWN)
{
onMouseLbuttonDown(&msg);
}
}
move();
}
getchar();
return 0;
}
以上就是利用C语言实现经典游戏斗兽棋的详细内容,更多关于C语言斗兽棋的资料请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341