本篇文章分享看题目就知道是写给初学者的,学的比较好的小伙伴也可以将自动算法等一些知识给加进去,希望对大家有帮助!

好了,当我们所有的准备工作做好之后,我们就可以来编写我们的C语言连连看游戏了!

其实这个游戏设计起来真的是很简单的一种,本例用到的知识点主要有:数组,结构体,分支结构,图形库函数。

游戏效果展示

 

连连看游戏的效果图大致就是这样(之所以没用本例的,是因为没用图形开发还是有点不好看,嘿嘿~)

编写准备:编译软件(VS2013),连连看图片素材,easyX图形库插件,有需要可以关注笔者微信公众号:C语言编程学习基地,领取相关图片素材可以回复关键字【连连看】即可。

那么接下来就给大家展示我们本期的连连看游戏C语言代码,自己写之前,请一定要获取到相关的必备资料哦!不然你就无法根据代码示例写出来了!

源代码示例

/*
课程内容:练练看,很简单
开发环境:vs2013+easyx图形库
知识点:
数组,结构体,分支结构,图形库函数
*/
#include<stdio.h>
#include<graphics.h>
#define IMG_SIZE 39 //隔一个动物图片的宽度
#define MAX_ANIMAL_NUM 42 //总共的动物数量
#define MAP_SIZE 10 //每行动物的数量
#define WIN_SIZE (MAP_SIZE*IMG_SIZE+2*IMG_SIZE) //定义变量 int a;
IMAGE img_total[];
IMAGE img_animal[MAX_ANIMAL_NUM][];
//地图
int map[MAP_SIZE+][MAP_SIZE+];
//存储两次点击的数组的下标
POINT begin = { -, - }, end = { -, - };
enum STATE
{
BEGIN,
END,
};
int flag = BEGIN;
//游戏初始化
void GameInit()
{
//创建一个图形窗口,贴图片
initgraph(WIN_SIZE, WIN_SIZE,SHOWCONSOLE);
//设置随机数种子
srand(GetTickCount());
//加载图片,如果现实没有重载的函数,就是字符集的问题
loadimage(&img_total[], "./res/animal.bmp");
loadimage(&img_total[], "./res/bk.jpg", WIN_SIZE, WIN_SIZE);
//把整个图片进行分割,保存到新的数组
SetWorkingImage(&img_total[]);
for (int i = ; i < MAX_ANIMAL_NUM; i++)
{
for (int k = ; k < ; k++)
{
getimage(&img_animal[i][k], k*IMG_SIZE, i*IMG_SIZE, IMG_SIZE, IMG_SIZE);
}
}
SetWorkingImage();
//11111 222 3333
//每张图片来10张
int temp = ,_count=;
for (int i = ; i <= MAP_SIZE; i++)
{
for (int k = ; k <= MAP_SIZE; k++)
{
map[i][k] = temp;
if (_count % == )
{
temp++;
}
_count++; }
}
//打乱图片,实际上就是打乱数组数据
for (int i = ; i <= MAP_SIZE; i++)
{
for (int k = ; k <= MAP_SIZE; k++)
{
int temp=map[i][k];
int row = rand() % + ;
int col = rand() % + ;
map[i][k] = map[row][col];
map[row][col] = temp;
}
}
}
//游戏的绘制
void GameDraw()
{
putimage(, , &img_total[]);
for (int i = ; i <= MAP_SIZE; i++)
{
for (int k = ; k <= MAP_SIZE; k++)
{
if (map[i][k]>)
{
//用透明贴图,使图片背景透明
putimage(k*IMG_SIZE, i*IMG_SIZE, &img_animal[map[i][k]][],SRCAND);
putimage(k*IMG_SIZE, i*IMG_SIZE, &img_animal[map[i][k]][],SRCPAINT);
}
}
} }
//鼠标控制消除,获取鼠标消息
void GameMouse()
{
//检测是否有鼠标操作
if (MouseHit())
{
MOUSEMSG msg = GetMouseMsg();
if (msg.uMsg == WM_LBUTTONDOWN )
{
if (flag==BEGIN)
{
begin.x = msg.y / IMG_SIZE;
begin.y = msg.x / IMG_SIZE;
flag = END;
}
else if (flag == END)
{
end.x = msg.y / IMG_SIZE;
end.y = msg.x / IMG_SIZE;
flag = BEGIN;
}
printf("begin(%d,%d),end(%d,%d)\n", begin.x, begin.y, end.x, end.y);
}
}
}
void show()
{
for (int i = ; i <= MAP_SIZE+; i++)
{
for (int k = ; k <= MAP_SIZE+; k++)
{
printf("%2d ",map[i][k]); }
printf("\n");
} }
//判断某一点是否有图片,没有为0
int isBlocked(int x,int y)
{
return map[x][y];
}
//水平方向是否能够消除
bool horizon(POINT begin, POINT end)
{
//不能点击同一个
if (begin.x == end.x &&begin.y == end.y)
{
return false;
}
//检测是否在同一水平方向
if (begin.x != end.x)
{
return false;
}
//求出大小
int m_min = min(begin.y, end.y);
int m_max = max(begin.y, end.y);
for (int i = m_min + ; i < m_max; i++)
{
if (isBlocked(begin.x, i))
{
return false;
}
}
return true;
}
//垂直方向是否能够消除
bool vertical(POINT begin, POINT end)
{
//不能点击同一个
if (begin.x == end.x &&begin.y == end.y)
{
return false;
}
//检测是否在同一垂直方向
if (begin.y != end.y)
{
return false;
}
//求出大小
int m_min = min(begin.x, end.x);
int m_max = max(begin.x, end.x);
for (int i = m_min + ; i < m_max; i++)
{
if (isBlocked(i,begin.y))
{
return false;
}
}
return true;
}
//一个拐点
bool turn_ocne(POINT begin, POINT end)
{
//不能点击同一个
if (begin.x == end.x &&begin.y == end.y)
{
return false;
}
//保存两个拐点信息
POINT temp1 = { begin.x, end.y }, temp2 = { end.x, begin.y };
if (!isBlocked(begin.x, end.y))
{
if (horizon(begin, temp1) && vertical(end, temp1))
{
return true;
} }
if (!isBlocked(end.x, begin.y))
{
if (horizon(end, temp2) && vertical(temp2, begin))
{
return true;
} }
return false;
}
int main()
{
GameInit();
show();
BeginBatchDraw();
while ()
{
GameDraw();
FlushBatchDraw();
GameMouse();
//消除操作,消除就是让数组的值等于0
if (map[begin.x][begin.y] == map[end.x][end.y])
{
if (horizon(begin, end))
{
map[begin.x][begin.y] = ;
map[end.x][end.y] = ;
}
else if (vertical(begin, end))
{
map[begin.x][begin.y] = ;
map[end.x][end.y] = ;
}
else if (turn_ocne(begin, end))
{
map[begin.x][begin.y] = ;
map[end.x][end.y] = ;
} }
}
return ;
}

以上就是分享给大家的全部的C语言代码,希望能够对大家有帮助~

自学C/C++编程难度很大,不妨和一些志同道合的小伙伴一起学习成长!

C语言C++编程学习交流圈子,【点击进入】微信公众号:C语言编程学习基地

有一些源码和资料分享,欢迎转行也学习编程的伙伴,和大家一起交流成长会比自己琢磨更快哦!

C/C++编程笔记:C语言实现连连看游戏,小白练手项目(源码分享)的更多相关文章

  1. C/C++编程笔记:C语言开发球球大作战(源码分享),你想试试吗?

    游戏背景 <球球大作战>是Superpop一款自主研du发的免费手机网络游戏. 以玩家间的实时互动PK产生游戏乐趣为设计宗旨,通过简单的规则将玩家操作直接转化为游戏策略,体验智谋碰撞的战斗 ...

  2. C/C++编程笔记:流行的数字游戏【2048】,C语言400行源代码分享

    游戏介绍 你玩过2048吗?2048是一款流行于各大网页和手机的数字游戏,手机安卓版推出的是<挑战2048>,之后的版本中还加入了双人对战的游戏模式,更加受到玩家的热捧. 2048的游戏规 ...

  3. 编译哈工大语言技术平台云LTP(C++)源码及LTP4J(Java)源码

    转自:编译哈工大语言技术平台云LTP(C++)源码及LTP4J(Java)源码 JDK:java version “1.8.0_31”Java(TM) SE Runtime Environment ( ...

  4. python编程从入门到实践 alien invasion 项目源码

    现在上传一个 python编程从入门到实践 alien invasion 项目源码 以供大家学习参考 跟官方版本可能不太一样,因为是自己写的 也算是给新手一个参考 我用的环境是pycharm 可能需要 ...

  5. C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目

    C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...

  6. C/C++编程笔记:C语言成绩管理系统!链式结构的管理系统源码分享

    最近很多同学因为学校的要求,需要完成自己的那个C语言课程设计,于是就有很多人私信或者加我私聊我,问的最多的还是<学生成绩管理系统>,其实当你项目写多了你就会发现:其实各类的管理系统都离不开 ...

  7. 基于python语言的tensorflow的‘端到端’的字符型验证码识别源码整理(github源码分享)

    基于python语言的tensorflow的‘端到端’的字符型验证码识别 1   Abstract 验证码(CAPTCHA)的诞生本身是为了自动区分 自然人 和 机器人 的一套公开方法, 但是近几年的 ...

  8. 并发编程(十二)—— Java 线程池 实现原理与源码深度解析 之 submit 方法 (二)

    在上一篇<并发编程(十一)—— Java 线程池 实现原理与源码深度解析(一)>中提到了线程池ThreadPoolExecutor的原理以及它的execute方法.这篇文章是接着上一篇文章 ...

  9. 并发编程(七)——AbstractQueuedSynchronizer 之 CountDownLatch、CyclicBarrier、Semaphore 源码分析

    这篇,我们的关注点是 AQS 最后的部分,共享模式的使用.本文先用 CountDownLatch 将共享模式说清楚,然后顺着把其他 AQS 相关的类 CyclicBarrier.Semaphore 的 ...

随机推荐

  1. 每日一题 - 剑指 Offer 38. 字符串的排列

    题目信息 时间: 2019-06-29 题目链接:Leetcode tag:深度优先搜索 回溯法 难易程度:中等 题目描述: 输入一个字符串,打印出该字符串中字符的所有排列. 你可以以任意顺序返回这个 ...

  2. 特殊方格棋盘【状压DP】

    特殊方格棋盘[状压DP] 讲真状压DP这个东西只不过是有那么亿丢丢考验心态罢了(确信) 先从板子题说起,另加一些基础知识 题目描述 在的方格棋盘上放置n 个车,某些格子不能放,求使它们不能互相攻击的方 ...

  3. Win10+YOLOv3完整安装过程(亲测可运行)

    最近了解并尝试在Win10安装YOLOv3,参考了十几篇文章,发现每个人都有自己的安装方式,最初尝试用cmake编译,虽然安装完成,但无法使用GPU,坑非常多,经2天努力终于安装成功,分享并记录自己的 ...

  4. 帝国の狂欢(种树)(可撤销DP)

    题目描述 马上就要开学了!!! 为了给回家的童鞋们接风洗尘,HZOI帝国的老大决定举办一场狂欢舞会. 然而HZOI帝国头顶上的HZ大帝国十分小气,并不愿意给同学们腾出太多的地方.所以留给同学们开par ...

  5. salesman,动态规划带一点点贪心。

    题目直接链接 分析一下: 这题题意还是比较明白的(少见的一道中文题),他的意思就是:有这么一个无向图:保证联通且点与点直接有唯一的简单路径(说白了就是棵树,根节点是1),每个节点有一个权值(有正有负) ...

  6. Django---进阶7

    目录 图书管理的图书增删改查 choices参数(数据库字段设计常见) MTV与MVC模型 多对多三种创建方式 Ajax 小例子 作业 图书管理的图书增删改查 from django.shortcut ...

  7. 十年老苹果(A1286)强升Catalina及Win10踩坑记

    前言 手头有一台十年老苹果,MacBook Pro,A1286,连视网膜屏都没有,电池也早就衰减以后直接拆掉了(减重). 早些年用得还挺多,后来家里也弄了台式,用得逐渐少了,再后来时不时Windows ...

  8. day77 作业

    目录 一.完成todolist案例 二.商品页面 一.完成todolist案例 <!DOCTYPE html> <html lang="en"> <h ...

  9. 题解:2018级算法第一次上机 C1-pair

    题目描述 北航2018级软件学院算法分析与设计第一次上机第三题 样例 实现解释 题目类型: 这类题目其实就是典型的递归分析语句形式的问题,也是编译原理课程中语法分析的重要方法之一. 解决方案: 为了解 ...

  10. python 并发专题(五):离散事件仿真(事件循环生成器)

    出租车队运营仿真 创建几辆出租车,每辆车会拉几个乘客,然后回家.出租车首先驶离车库,四处徘徊,寻找乘客:拉到乘客后,行程开始:乘客下车后,继续四处徘徊. 程序解释 程序的输出示例: 创建 3 辆出租车 ...