首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >互动灯关游戏

互动灯关游戏
EN

Code Golf用户
提问于 2014-02-04 09:43:52
回答 3查看 490关注 0票数 6

Intro

我想大多数人对熄灯游戏都很熟悉,但如果有人不熟悉的话,这里有一个简短的描述:

从NxN网格开始,网格中的每个单元格都是光。对于这个例子,N=5。游戏有两种方式可以开始:要么所有的灯都开着,要么一些灯关了。目标是关掉所有的灯。如果你切换一个灯,灯左,右,上面和下面,它将与它切换。

上的全灯

代码语言:javascript
复制
O O O O O  
O O O O O  
O O O O O  
O O O O O  
O O O O O

切换细胞

代码语言:javascript
复制
Toggled(0,0) | Toggled(1,2)| Toggled(2,4)
X X O O O    |  O O X O O  |  O O O O O
X O O O O    |  O X X X O  |  O O O O X
O O O O O    |  O O X O O  |  O O O X X
O O O O O    |  O O O O O  |  O O O O X
O O O O O    |  O O O O O  |  O O O O O

任务

用尽可能少的代码制作一个互动的灯光游戏。

Requirements

有一个设置阶段和一个播放阶段。

安装阶段需要用户输入来确定网格大小(最小大小为5),以及网格是否从所有灯启动。如果网格不应该启动所有的灯,灯必须随机选择开始:至少1,最多20%的灯。

在播放阶段,网格显示给用户,并以移动作为输入。该应用程序可以使用有窗口的GUI,通过单击来切换灯光,或者使用文本UI来切换单元格坐标的输入。

当用户到达一个已解决的状态(所有灯都熄灭)时,应用程序必须通知他们他们已经解决了谜题,并显示了它的移动次数。

不允许使用外部资源。

如果有什么不清楚或遗漏的地方,请告诉我:)

相关问题

EN

回答 3

Code Golf用户

回答已采纳

发布于 2014-02-04 15:52:10

APL (101)

代码语言:javascript
复制
00{⎕←'XO'[1+⍵]⋄1∨.=,⍵:(⍺+1)∇⍵≠(⍳⍴⍵)∊⎕∘+¨Z,⌽¨Z←0∘.,¯1 0 1⋄'SOLVED',⍺}⎕{⍺:⍵ ⍵⍴1⋄~(⍵ ⍵⍴⍳V)∊V?⍨⌊.2×V←⍵*2}⎕

第一个输入是大小,第二个输入是开始值(0=some off,1=on)。坐标是基于1的。

代码语言:javascript
复制
      0{⎕←'XO'[1+⍵]⋄1∨.=,⍵:(⍺+1)∇⍵≠(⍳⍴⍵)∊⎕∘+¨Z,⌽¨Z←0∘.,¯1 0 1⋄'SOLVED',⍺}⎕{⍺:⍵ ⍵⍴1⋄~(⍵ ⍵⍴⍳V)∊V?⍨⌊.2×V←⍵*2}⎕
⎕:
      5
⎕:
      1
OOOOO
OOOOO
OOOOO
OOOOO
OOOOO
⎕:
      2 2
OXOOO
XXXOO
OXOOO
OOOOO
OOOOO
⎕:
票数 3
EN

Code Golf用户

发布于 2014-02-04 13:42:45

C++,564字节

代码语言:javascript
复制
#include <iostream>
#include <algorithm>
#include <ctime>
#include <cstdlib>
#include <vector>
using namespace std;int main(){int n,p,s=0,y,i=0,b;cin>>n>>b;if(n<5)n=5;vector<int>m(n*n,1);srand(time(0));if(b)for(int&c:m)c=rand()<RAND_MAX/6;for(;i<n*n;i++)cout<<m[i]<<(-~i%n?"":"\n");while(find(m.begin(),m.end(),1)!=m.end()){cin>>p>>y;p+=y*n;if(p<0||p>=n*n)continue;m[p]=!m[p];if(p%n)m[p-1]=!m[p-1];if(p%n+1<n)m[p+1]=!m[p+1];if(p>=n)m[p-n]=!m[p-n];if(p+n<n*n)m[p+n]=!m[p+n];for(i=0;i<n*n;i++)cout<<m[i]<<(-~i%n?"":"\n");s++;}cout<<"Solved in "<<s<<" steps."<<endl;}

在安装阶段,用户应该首先输入网格大小。然后,如果网格启动时所有灯都亮着,用户应该输入0,否则输入1

在游戏阶段,用户应该输入单元格的基于0的坐标来切换,直到所有的灯都熄灭为止。

原始代码:

代码语言:javascript
复制
#include <iostream>
#include <algorithm>
#include <ctime>
#include <cstdlib>
#include <vector>
using namespace std;
int main() {
    int n, p, s = 0, y, i = 0, b;
    cin >> n >> b;
    if(n < 5) n = 5;
    vector<int> m(n * n, 1);
    srand(time(0));
    if (b) for (int& c : m) c = rand() < RAND_MAX / 6;
    for (; i < n * n; i++) cout << m[i] << (-~i % n ? "" : "\n");
    while (find(m.begin(), m.end(), 1) != m.end()) {
        cin >> p >> y;
        p += y * n;
        if (p < 0 || p >= n * n) continue;
        m[p] = !m[p];
        if (p % n) m[p - 1] = !m[p - 1];
        if (p % n + 1 < n) m[p + 1] = !m[p + 1];
        if (p >= n) m[p - n] = !m[p - n];
        if (p + n < n * n) m[p + n] = !m[p + n];
        for (i = 0; i < n * n; i++) cout << m[i] << (-~i % n ? "" : "\n");
        s++;
    }
    cout << "Solved in " << s << " steps." << endl;
}
票数 3
EN

Code Golf用户

发布于 2014-02-04 19:07:22

C -365个字符

代码语言:javascript
复制
#define a for(y=0;y<w*w;y++)
*k,i,w,x,y,c=0;main(){scanf("%i %i",&w,&i);k=malloc(4*w*w+8*w)+4*w;i&=1;srand(k);a k[y]=i||ra
nd()<6553;i^=1;for(;;){x=0;a{putchar(k[y]?79:88);x|=k[y]!=i;!((y+1)%w)&&putchar(10);}if(!x&&c
)return printf("won in %i",c);putchar(62);scanf("%i %i",&x,&y);k[x*w-w+y]^=x>0;k[x*w+y-1]^=y>
0;k[x*w+w+y]^=x<w-1;k[x*w+y+1]^=y<w-1;k[x*w+y]^=1;c++;}}

在安装阶段,它向用户请求两个整数:表大小和启动状态(0表示off,1表示on)。

在此之后,每次移动之前,它都会打印网格,然后提示(>)用户获取基于0的xy坐标的点。

票数 3
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/19982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档