利用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/*, EW_SHOWCONSOLE*/);
	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语言斗兽棋的资料请关注我们其它相关文章!

(0)

相关推荐

  • 一盘王者的时间用C语言实现三子棋

    目录 1.先进行环境的配置 2.各种功能实现的逻辑关系 2.1实现游戏的开始退出流程 2.2 创建一个名为board的二维数组,并进行初始化 2.3 棋盘的搭建 2.4 玩家下棋,并打印新的棋盘 2.5 电脑下棋,并打印新的棋盘 2.6.判断结果 3.程序实现的代码 3.1 text.c 3.2 game.h 3.3 game.c 1.先进行环境的配置 一共会用到三个文件,分别是两个源文件test.c game.c ,还有一个头文件game.h 他们的关系分别是: test.c是主体,是游戏的测

  • 利用C语言实现五子棋游戏

    本文实例为大家分享了C语言实现五子棋游戏的具体代码,供大家参考,具体内容如下 一.前言 本文将先介绍五子棋运行所需要的函数,最后串联成完整代码. 我们需要实现的功能有:1.菜单menu函数 2.初始化棋盘Initboard函数 3.显示棋盘Displayboard函数 4.实现人机.人人模式的选择 5.落子函数 playermove  computermove 6.判断输赢ifwin函数 先来看看运行效果吧! 二.头文件 #define _CRT_SECURE_NO_WARNINGS #incl

  • C语言实现井字棋游戏(人机对弈)

    井字棋游戏:即三子棋,英文名叫Tic-Tac-Tic,是一种在3*3格子上进行的连珠游戏,和五子棋比较类似,由于棋盘一般不画边线框,格线排成井字故得名. 题目分析 : 要完成该游戏的编写,我们需要先分析出完成整个游戏过程都需要干什么? 1.首先,需要定义出一个3*3的棋盘,根据相关知识,我们可以以二维数组的方式将棋盘表示出来: 2.棋盘定义出来后,需要将棋盘初始化,将3*3二维数组的每一个位置初始化为‘ ’(空格): 3.有了棋盘,我们就可以开始进行下棋了,首先要确定是玩家先下还是电脑先下.在这

  • C语言实现简单五子棋游戏

    在生活中五子棋是一个十分普遍的一款游戏,今天让我们一起来实现这款游戏. 1.初始化棋盘 char ret; //数据存储在一个二维数组中,玩家下去*,电脑下去#. char board[row][col] = { 0 };//最开始为全是空格 InitBoard(board,row,col);//初始化棋盘 我们利用InitBoard函数来初始化棋盘,用 * 来表示玩家下棋,用 # 来表示电脑下棋. 代码如图: void InitBoard(char board[row][col], int R

  • c语言实现简易版三子棋(附完整代码)

    目录 一.菜单栏 二.初始化棋盘 三.打印棋盘 四.玩家下棋 五.电脑下棋 六.判断输赢 七.调用玩家.电脑下棋函数和判断输赢函数 八.全部代码 总结 一.菜单栏 1.制作一个简易版的菜单,并附上选项提示 2.因为该程序想至少运行一次,所有选择用do while循环,而选择玩与不玩游戏时,则采用switch case语句比较合适,然后调用相应的函数即可 二.初始化棋盘 1.先创建一个棋盘 为了便于更改棋盘大小,所有采用宏定义的方式来定义其行与列 2.对棋盘进行初始化 起初未下棋时,棋盘应该是空白

  • C语言实现三子棋游戏(棋盘可变)

    本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下 思路: main函数结构部署 game函数功能的实现 ①创建存储空间 ②初始化存储空间为空格 ③打印棋盘 ④实现玩家下棋 ⑤实现电脑下棋 ⑥实现玩家和电脑下棋后的输赢判断 所使用的文件: test.c-----用于测试游戏 game.c----用于实现游戏中的一些函数 game.h-----头文件 test.c #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #

  • 利用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, /

  • 利用C语言实现经典多级时间轮定时器

    目录 1. 序言 2. 多级时间轮实现框架 2.1 多级时间轮对象 2.2 时间轮对象 2.3 定时任务对象 2.4 双向链表 2.5 联结方式 3. 多级时间轮C语言实现 3.1 双向链表头文件: list.h 3.2 调试信息头文件: log.h 3.3 时间轮代码: timewheel.c 3.4 编译运行 总结 1. 序言 最近一直在找时间轮的C语言实现代码,发现很多都是Java或者c++实现的.而我对其他语言不熟悉,看不太懂.关于C实现的,让我如沐春风的实现没找到,github上也只找

  • 利用C语言实现扫雷游戏

    通过一段时间的C语言学习,想必小伙伴们也想跃跃欲试的编写一些小程序,这个扫雷简易游戏,非常适合C语言初学者去实践. 实现扫雷,首先要有两个棋盘,一个棋盘放置着雷的信息,另个用于展示到屏幕上:然后就是玩家输入坐标排雷,如果输入的坐标有雷,就游戏结束,要是没有雷就在展示棋盘对应的位置,显示出周边雷的个数:最后排查完所有坐标并且不被雷炸死,就是胜利. 以上是扫雷的基本逻辑,现在开始,一步一步的实现. 1.初始化棋盘 void InitBoard(char board[ROWS][COLS], int

  • 利用C语言编写“剪刀石头布”小游戏

    前言 大家好~ 我是一名C语言初学者,学了C语言基础后,我制作了一个小游戏:剪刀石头布. 希望大家能对我的思路和代码提出小Tips(eg.更简便的方法与程序) 我也会虚心接受大家的建议~ 一.游戏原理 "剪刀石头布"这个游戏,想必大家都很熟悉了. 两个人在玩游戏时,事先都不知道对方将要出什么,这中间存在着一种随机性. 而这种随机性相当于C语言里stdlib.h库中rand()函数,rand()函数用来产生随机数,因为rand是根据提供给srand()的种子值返回一个随机数,所以要使每次

  • C语言实现经典扫雷游戏流程

    目录 扫雷小游戏简介 一.分析与实现 1.设计棋盘 2.放置雷以及排雷 二.扫雷小游戏演示 三.源码 总结 扫雷小游戏简介 想必很多人小时候电脑没网的时候都玩儿过这个经典的小游戏,也都被它折磨过.其实这个游戏很简单,通过点击相应位置显示的数字来确定周围雷的数量,在避免踩到雷的同时找出所有的雷就能获得胜利. 这次我们用C语言来实现一个简单的扫雷小游戏. 一.分析与实现 1.设计棋盘 要玩儿扫雷游戏,我们首先应该有一个棋盘.这个棋盘中的雷应该是在开始玩儿游戏的时候就已经布置好了,不能随意变化.但是呢

  • 利用C语言实现n字棋游戏

    目录 前言 思路 效果图 开始的界面 棋盘的样子 随机打的坐标 获得胜利 结束程序 代码 test.c game.c game.h 前言 这里就简单发一个n字棋游戏,和井字棋一样,不过这个游戏你可以自定义棋盘的大小. 井字棋是3×3大小,满足三个平齐就获得胜利. 小奔写的这个游戏,你可以自定义为10×10大小,满足6个平齐就获得胜利,都是可以随便定义的. 如果感兴趣的话就可以来尝试一下,或许你可以找到一些bug (至于为什么说它是“人工智障”呢?因为它是随机下的,并不会去针对你,它很有自己的想法

  • 利用Jetpack Compose实现经典俄罗斯方块游戏

    目录 可组合函数 游戏机身 - TetrisBody 游戏按钮 - TetrisButton 游戏屏幕 - TetrisScreen 调度器 - TetrisViewModel 项目地址 你的童年是否有俄罗斯方块呢,本文就来介绍如何通过 Jetpack Compose 实现一个俄罗斯方块 ~~ 先看下效果图,功能还是挺完善的 就我自己的体验来说,使用 Compose 开发的应用我感受不到和 Android 原生开发之间有什么性能差异,但 Compose 在开发难度上会低很多 Google 官网上

  • 利用C语言实现一个最简单的飞机游戏

    目录 前言 一.利用scanf控制飞机移动 二.getch控制飞机移动 三.显示复杂的飞机图案 四.发射激光 五.打靶练习 前言 在前面弹跳小球的基础上实现一个简单的飞机游戏,主要包括飞机的显示.控制移动.显示复杂图案.发射激光.打靶练习等功能. 目前的飞机还很简单,大家不要着急,一步一步来,在后面会实现更复杂的飞机游戏效果.比如 如何让靶子移动起来? 如何统计和显示击中得分? 如何实现子弹散弹效果? 一.利用scanf控制飞机移动 第一步利用scanf输入不同的字符,按a.s.d.w键后改变坐

  • C语言实现经典扫雷小游戏的示例代码

    目录 一.游戏简介 二.游戏实现 1.初始化棋盘 2.打印棋盘 3.布置雷 4.排查雷 三.源文件 1.game.h 2.game.c 3.Test.c 一.游戏简介 游戏初始界面有两个选择,选项“1”为开始游戏,选项“0”为退出游戏:选择开始游戏之后将会打印出9*9的棋盘,此时系统已经为游戏设置了10个雷,输入坐标之后将会打印出此坐标周围八个位置有几个雷,如果踩到了雷,那么游戏结束,打印出所有雷的位置. 二.游戏实现 1.初始化棋盘 void InitBoard(char board[ROWS

随机推荐