| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2519 人关注过本帖, 1 人收藏
标题:求大神十五字游戏代码拜托了
只看楼主 加入收藏
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:0 
回复 10楼 九转星河
我可没说做的出自动最小步数,而是指记录游戏者的游戏步数,没走冤枉路的话就是最少步数了。这个要做自动最少步数的ai我智商不够,做不了。
2017-06-03 19:20
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 11楼 xzlxzlxzl
原来是这样~不过还有一个问题~如果是随机生成获取最小步数是有随机性的吧~有可能两三步就可以还原哦~而且~还要先判断该棋盘到底是否能复原~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-06-03 19:23
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
以下是引用xzlxzlxzl在2017-6-3 19:00:49的发言:

百度“c如何获取方向键键值”就知道了,方向键等特殊键会getch到两个值,第一个值固定为-32,就是无符号数242,紧接得到的值就区分哪个键了,把这两个值当做一个int数的2后两个字节就得到四个方向键的键值了。

无意来灌水~突然发现小学数学竟然不过关256-32求解~不是我挑剔一下~而是看到这么明显特么按耐不住~~

其实之前我已经发现方向键有两个键值了~只是没啥多深入研究了~记得A码在70-80之间~那个也可以用~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-06-04 07:06
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:7 
回复 3楼 九转星河
按照您三楼的说法,为什么这种情况就一定无解?想不通。
2017-06-04 16:47
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 14楼 yangfrancis
因为如果空格通过移动并最终回到同一个位置~不计空格变动方块数目为奇数~而如果直接交换两个相邻的方块~则方块变动数目是偶数~这查过可以用逆序数来表达~如果总逆序数为奇数~则拼图无解~如果总逆序数为偶数则拼图有解~这个你有时间可以去验证一下~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-06-04 18:47
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:0 
碰巧生成两三步能走完的局面的可能性极小。
2017-06-04 19:16
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:0 
我设定的随机地图算法是空格随机往4个方向走128步,用该算法可确保能还原,同时足够的随机次数可确保地图复杂。
感觉就是随机摆放也能还原的。
代码已添加胜利判断和步数统计功能(我现在基本上可在40步内完成),接下来会完成自动走步功能。
程序代码:
#include "stdafx.h"                  //在vs、vc中可用,gcc编译器可注释掉
#include <stdio.h>        
#include <windows.h>      
#include <time.h>         
#include <conio.h>
//#pragma comment(lib, "user32.lib")   //为消息提示窗口加入user32库

void setLocate(int x,int y) 
{//设置字符显示位置
    HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
    COORD loc={x,y};
    SetConsoleCursorPosition(hOut,loc);
}
void drawframe()
{//画外框
    int i;
    printf("┌─┬─┬─┬─┐   空格键:产生随机地图   ESC键:退出   方向键:移动空格\n");
    for(i=0;i<3;i++)
    {
        printf("│  │  │  │  │\n");
        printf("├─┼─┼─┼─┤\n");
    }
    printf("│  │  │  │  │\n");
    printf("└─┴─┴─┴─┘\n");
}
int testmove(int a[][4],int flg)
{//测试移动是否合法,合法则交换数据
    int i,j,x,y,b[4][2]={-1,0,0,-1,0,1,1,0};
    for(i=0;i<4;i++)
    {
        for(j=0;j<4;j++)
        {
            if(!a[i][j])
            {
                x=i;
                y=j;
            }
        }
    }
    i=x+b[flg][0];
    j=y+b[flg][1];
    if(i<0||i>3||j<0||j>3)return 0;
    a[i][j]^=a[x][y];
    a[x][y]^=a[i][j];
    a[i][j]^=a[x][y];
    return 1;
}

int getkey()
{//获得键值
    unsigned char a;
    int n=0;
    if(!kbhit())return 0;
    a=getch();
    if(a>127)
    {
        n=a*256;
        a=getch();
    }
    n=n+a;
    return n;
}
void rndmap(int a[][4])
{//随机地图产生
    int i,j;
    srand(clock());
    for(i=0;i<4;i++)
        for(j=0;j<4;j++)
            a[i][j]=i*4+j+1;
    a[3][3]=0;
    for(i=0;i<128;i+=testmove(a,rand()%4));  //为减少代码,该语句有死循环的危险
    setLocate(2,10);
    printf("                                               ");

}
void listmap(int a[][4],int s)
{
    int i,j,x,y;
    for(i=0;i<4;i++)
    {
        for(j=0;j<4;j++)
        {
            setLocate(j*4+2,i*2+1);
            if(a[i][j])printf("%2d",a[i][j]);
            else
            {
                x=j*4+2;
                y=i*2+1;
                printf("  ");
            }
        }
    }
    setLocate(21,3);
    printf("步数:%d",s);
    setLocate(x,y);
}
int testwin(int a[][4])
{//检测是否胜利
    int i,*p;
    p=&a[0][0];
    for(i=0;i<15&&p[i]==i+1;i++);
    return i==15;
}
void main()
{
    int a[4][4],key,i,s=0;
    drawframe();
    rndmap(a);
    listmap(a,s);
    while((key=getkey())!=27)
    {
        if(key==32||(key>57415&&key<57425))
        {
            if(key==32)
            {
                rndmap(a);
                s=0;
            }
            if(!testwin(a)&&key>57415&&key<57425)
            {
                i=(key-57416)/3+(key>57419);
                s+=testmove(a,i);
                //if(testwin(a))MessageBox(NULL,"你胜利了,请按空格键继续!","提示",MB_OK);  //胜利消息提示,vs代码需要取消unicode字符集
                if(testwin(a))
                {//为增加代码通用性,还是使用传统提示输出,vs、vc的可用上行代码调用windows窗口消息做提示
                    setLocate(2,10);
                    printf("你胜利了,请按空格键继续!");
                }
            }
            listmap(a,s);
        }
    }
}
2017-06-04 20:01
快速回复:求大神十五字游戏代码拜托了
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024589 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved