|
5啊哈币
我接到一个编九宫格拼图游戏的任务,根据查找的相关资料,大致的算法已经准备好了,但是不知道怎么用鼠标进行输入,目前停留在用键盘移动拼图的阶段。希望有资深学者帮助我解决相关问题,也希望能对我的拼图做出一些改进。代码如下:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
int MenuReturn;
void RandMap(char map[][3]);//随机生成数
void Game(void);//游戏主循环
int Help(void);//游戏玩法介绍
int About(void);
int Menu(void);
void DealWithMenu(int MenuReturn);
void Show(char map[][3]);
int IsWin(char map[][3]);//判断是否达成胜利条件
int main(void)
{
system("color 1E");
while(1)
{
MenuReturn = Menu();
DealWithMenu(MenuReturn);
}
return 0;
}
int Menu(void)
{
int sel = 1;
int tem = 0;
char kb;
system("cls");
printf(" 数字拼图 \n");
printf("->开始游戏<-\n 玩法介绍 \n 关 于 \n 退出游戏 \n");
do
{
kb = getch();
switch(kb)
{
case 'w' : tem--;
sel += tem;
break;
case 's' : tem++;
sel += tem;
break;
default : NULL ;
break;
}
tem = 0;
if (sel == 0)
{
sel = 4;
}
if (sel == 5)
{
sel = 1;
}
system("cls");
printf(" 数字拼图\n\n\n");
switch (sel)
{
case 1 : printf("->开始游戏<-\n 玩法介绍 \n 关 于 \n 退出游戏 \n");
break;
case 2 : printf(" 开始游戏 \n->玩法介绍<-\n 关 于 \n 退出游戏 \n");
break;
case 3 : printf(" 开始游戏 \n 玩法介绍 \n->关 于<-\n 退出游戏 \n");
break;
case 4 : printf(" 开始游戏 \n 玩法介绍 \n 关 于 \n->退出游戏-<\n");
break;
default: return-1;
break;
}
}while(kb != '\r');
return sel;
}
void DealWithMenu(int MenuReturn)
{
int retu;
switch(MenuReturn)
{
case 1 : Game();
break;
case 2 : retu = Help();
break;
case 3 : retu = About();
break;
case 4 : exit(0);
break;
case -1: printf("发生未知错误!\n");
}
}
void Show(char map[][3])
{
int i,j;
system("cls");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("%2c",map[i][j]);
}
printf("\n");
}
return;
}
void MoveNumber(char map[][3],int *Crx,int *Cry)
{
enum {UP,DOWN ,LEFT ,RIGHT};
int kb;
int dx = 0,dy = 0;
switch(getch())
{
case 'w' :dy--;
kb = UP;
break;
case 's' :dy++;
kb = DOWN;
break;
case 'a' :dx--;
kb = LEFT;
break;
case 'd' :dx++;
kb = RIGHT;
break;
default :NULL;
break;
}
if(kb == UP&& *Cry+1<=2)
{
map[*Cry][*Crx] = map[*Cry+1][*Crx];
map[*Cry+=1][*Crx] = ' ';
}
if(kb == DOWN&&*Cry-1>=0)
{
map[*Cry][*Crx] = map[*Cry-1][*Crx];
map[*Cry-=1][*Crx] = ' ';
}
if(kb == LEFT&& *Crx+1<=2)
{
map[*Cry][*Crx] = map[*Cry][*Crx+1];
map[*Cry][*Crx+=1] = ' ';
}
if(kb ==RIGHT&& *Crx-1>=0)
{
map[*Cry][*Crx] = map[*Cry][*Crx-1];
map[*Cry][*Crx-=1] = ' ';
}
return;
}
void RandMap(char map[][3])
{
int i,j,k,n = 0;
srand((unsigned)time(NULL));
for(i = 0;i<8;i++)
{
map[0][i] = '1'+i;
}
while(n<99)//随机交换99次,这个算法不太好,容易出现死局
{
int tem;
j = rand()%8;
k = rand()%8;
if (k-j == 1||j-k == 1||k-j == 3||j-k == 3)
{
continue;//减小死局出现的概率,相邻位置的数字不能交换
}
tem = map[0][k];
map[0][k] = map[0][j];
map[0][j] = tem;
n++;
}//这个算法可以实现指定数组的乱序排列,但对本游戏不太合适,乱序不保证游戏有解
map[2][2] = ' ';
}
int Help(void)
{
int judje = 0;
system("cls");
printf("点击开始游戏,程序会随机生成一个数阵,例如\n" "314\n286\n75 \n点击wasd移动数字,直至\n123\n456\n78 \n则胜出\n");
printf("返回菜单吗?\t ===== y/n\n");
do
{
int ch = getchar();
if(ch == 'y')
{
return 1;
}
if(ch == 'n')
{
judje = 1;
}
}while(judje == 1);
}
int About(void)
{
int judje = 0;
system("cls");
printf("返回菜单吗?\t ====== y/n\n");
do
{
int ch = getchar();
if(ch == 'y')
{
return 1;
}
if(ch == 'n')
{
judje = 1;
}
}while(judje == 1);
}
int IsWin(char map[][3])
{
int i;
int j = 0;
for(i = 0;i<8;i++)
{
if (map[0][i] == '1'+i)
j++;
}
if (j == 8)
{
return 1;
}
else
{
return 0;
}
}
void Game(void)
{
char Map[3][3] = {0};
int Crx = 2;
int Cry = 2;
RandMap(Map);//先生成一个
Show(Map);
printf("任意键开始游戏!!\n");
getch();
unsigned int t1 = time(NULL);
while(1)
{
MoveNumber(Map,&Crx,&Cry);//用户操作
Show(Map);
unsigned int t2 = time(NULL);
if(IsWin(Map))
{
printf("胜利~!用时%dS",t2-t1);
return;
}
}
}
|
|