我的编程空间,编程开发者的网络收藏夹
学习永远不晚

利用C语言实现经典游戏斗兽棋

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

利用C语言实现经典游戏斗兽棋

效果图

核心代码

#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

利用C语言实现经典游戏斗兽棋

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C语言实现经典小游戏井字棋的示例代码

这个三子棋游戏是在学习C语言的过程中自己编写的一个小游戏,现在将自己的思路(主要以流程图形式和代码中的注释表达)和具体代码以及运行结果分享出来以供大家学习参考,希望对大家有所帮助
2022-11-13

怎么用C语言实现扫雷经典游戏

本篇内容介绍了“怎么用C语言实现扫雷经典游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C语言实现扫雷游戏,供大家参考,具体内容如下实现扫
2023-06-20

怎么利用C语言实现井字棋小游戏

本篇内容主要讲解“怎么利用C语言实现井字棋小游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么利用C语言实现井字棋小游戏”吧!推荐阅读顺序(不建议跳过)先看实现之后的界面 —— 然后看分析程
2023-06-20

怎么利用C语言实现AI五子棋游戏

本篇内容介绍了“怎么利用C语言实现AI五子棋游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录一.如何实现二.实现代码及分析(1)菜单的
2023-06-20

使用C语言实现五子棋游戏

这篇文章主要为大家详细介绍了使用C语言实现五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
2022-11-13

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录