1 问题描述
连连看是一个经典的游戏,本课题要求实现一个文本界面的连连看游戏。
2 基本要求
要能提供以下几个基本功能:
(1)定义一个矩阵,随机产生字符布置地图,例如下面这个4x4 的地图。
1 2 3 4
B C H C 1
C F B E 2
A E D F 3
C H A D 4
(2)游戏者通过坐标(1,2)、(3,4)判定第一行第二列的字符与第三行第四列的字符是相同的),判定争取则相应位置的字符消失,如判断错误给出相应的错误提示,允许重新判定。
(3)如果找不出配对的字符,提供restart 模式,给现存的地图重新排序。
(4)定义成绩排行榜,记录前五名的用户名及时间。
(5)提供菜单功能,定义不同等级的连连看地图供选择。
(6)设定有时间限定的游戏模式和无时间限定的游戏模式。
(7) 成绩排行榜以文件形式保存。
3 选做内容
使用MFC 等开发工具,实现彩色或图形操作界面。
4 其他要求
(1)变量、函数命名符合规范。
(2)注释详细:每个变量都要求有注释说明用途;函数有注释说明功能,对参数、返回值也要以注释的形式说明用途;关键的语句段要求有注释解释。
(3)程序的层次清晰,可读性强。
5 开发环境
可以选择TC2.0、TC3.0、VC++6.0等。
MFC就先算了,我想先把黑屏程序学会了。。
谢谢!
#include<stdio.h>
#include<graphics.h>
#define FPS 100
#define WIN_SIZE 640
#define MAP_SIZE 10//一行多少图片
#define IMG_SIZE //图片宽度
#define MAX_PICTURE_NUM 42//图片数量
#define WIN__SIZE MAP_SIZE*IMG_SIZE+2*IMG_SIZE
IMAGE img_total[2];//初始化数据
IMAGE img_picture[MAX_PICTURE_NUM 42] [2];
int map[MAP_SIZE + 2][MAP_SIZE + 2];//前后有边界+2
MOUSEMSG msg;
POINT begin = { -1,-1 }, end = { -1,-1 };//现代你记得坐标,后点击的坐标
enum STATE//表示点击的状态,第一次&第二次
{
m_begin,
m_end,
};
int flag = m_begin;
void GameInit()
{
srand(GetTickCount());
loadimage(&img_total[0], "/res/animal.bmp");
loadimage(&img_total[1], "/res/bk.jpg",WIN_SIZE,WIN_SIZE);
SetWorkingImage(&img_total[0]);//长图切片,保存数组;
for(int i=0;i<MAX_PICTURE_NUM;i++)//二维数组双重循环
{
for (int k = 0; k < 2; k++)
{
getimage(&img_picture[i][k], k*IMG_SIZE, i*IMG_SIZE, IMG_SIZE, IMG_SIZE);
}
}
SetWorkingImage();
int temp = 1, _count = 1;//_count记录已经初始化的个数
//每张图片10个
for (int i = 0; i < MAP_SIZE; i++)//去头去尾,消除边界
{
for (int k = 1; k <= MAP_SIZE; k++)
{
map[i][k] = temp;
if (_count % 10 == 0)
{
temp++;
}
_count++;
}
}
//打乱数组
for (int i = 1; i < MAP_SIZE; i++)
{
for (int k = 1; k <= MAP_SIZE; k++)
{
//也可以用i,k去与别的交换
int x = rand() % 10 + 1;
int y = rand() % 10 + 1;
int x1 = rand() % 10 + 1;
int y1 = rand() % 10 + 1;
int _swap = map[x][y];
map[x][y] = map[x1][y1];
map[x1][y1] = _swap;
}
}
}
void GameDraw()
{
cleardevice();//背景图
putimage(0, 0, &img_total[1]);//绘制动物图片
for(int i = 1; i <= MAP_SIZE, i++)
{
for (int k = 1; k <= MAP_SIZE; k++)
{
if (map[i][k] > 0)
{
putimage(k*IMG_SIZE, i*IMG_SIZE, &img_picture[i][k][1],SRCAND);
putimage(k*IMG_SIZE, i*IMG_SIZE, &img_picture[i][k][0],SRCPAINT);
}
}
}
}
//游戏控制,鼠标点击获得数组下标
void GameControl()
{
if (MouseHit())
{
msg = GetMouseMsg();
if (msg.uMsg == WM_LBUTTONDOWN && flag==m_begin)
{
begin.y=msg.x/IMG_SIZE;
begin.x = msg.y; /IMG_SIZE;
flag = m_end;
}
else if (msg.uMsg == WM_LBUTTONDOWN && flag == m_end)
{
end.y = msg.x / IMG_SIZE;
end.x = msg.y; / IMG_SIZE;
flag = m_begin;
}
printf("begin:(%d,%d)end:(%d,%d)\n", begin.x, begin.y, end.x, end.y);
}
}
//判断某一点是否有障碍
static int isBlockeed(int x,int y)
{
return map[x][y];
}
//同一水平是否能够消除
int horizon(POINT begin,POINT end)
{
//首先判断是否点击的同一个
if (begin.x == end.x&&begin.y == end.y)
{
return 0;
}
//是否在同一水平方向
if (begin.x!=end.x)
{
return 0;
}
//判断两者之间是否有障碍
int tx = min(begin.y, end.y);
int maxx = max(begin.y, end.y);
for (int i = minx + 1; i < maxx; i++)
{
if (isBlockeed( begin.y,i))
{
return 0;
}
}
return 1;
}
//垂直方向消除
woid vertical()
{
}
//一个拐点
void turn_once()
{
}
//两个拐点
void turn_two()
{
}
voidprintf()
{
for (int i = 0; i < MAP_SIZE + 2; i++)
{
for (int k = 0; k < MAP_SIZE + 2; k++)
{
printf("%d", map[i][k]);
}
printf("\n");
}
}
int mian()
{
initgraph(WIN_SIZE, WIN_SIZE,SHOWCONSOLE);
printf("WELCOME");
GameInit();
//BeginBatchDraw();//开启双缓冲绘图
while (true)
{
GameDraw();
FlushBatchDraw();
GameControl();
if (horizon(begin,end) == 1&&map[begin.x][begin.y]==map[end.x][end.y])
{
map[begin.x][begin.y] = 0;
map[end.x][end.y] = 0;
}
printf("%d", horizon(begin, end));
}
return 0;
}
支持下,待高手,当年的皮毛已经忘光了
算了,太华精力了。这一般没人感兴趣的
大神好闲啊!还是多搜索下吧
做作业的话直接去淘宝找人做吧
你是找人给你写代码啊?这些出来得一天吧~没人会给你写的~百度看看有没有人家写好的~
建议直接去csdn下载频道那里去搜索一下,真的在这里没有人会帮你写完整代码的,而且又是免费的。