乐趣区

关于java:边打游戏边学编程是一种怎么样的体验

前言

hello,大家好,我是 bigsai,好久不见,甚是惦记!

在日常生活中,很多人喜爱玩游戏,因为游戏中有着反抗博弈、管制的喜悦,用灵魂指法实现一波靓丽的操作。

但实际上,你的按键都是对应代码中一个个办法函数去执行操作,并且界面做到一个图形变动渲染让你感觉你管制的是这个图形界面。

尽管游戏的底层都是一行行代码堆砌的逻辑,然而咱们对其并没有半点趣味因为写代码的过程干燥无趣,齐全须要脑子去形象出一个页面、执行逻辑,出错的时候有很简略的找了半天…… 输入、debug 各种形式去找问题。

对于咱们这种懒人来说,想要锤炼本人编程能力、算法真的是进入一种畏难的有限死循环,心愿要么简略点、要么乏味点,写的货色最好也能像有些开发那样看得见,摸得着,学习别那么难。

这不,明天就发现了一个非常适合初、中级学者锤炼本人编程的网站:codingame一个边玩游戏边学编程的网站

网站主页为:https://www.codingame.com/start

网站介绍

咱们在学习技术、学习算法的时候,都喜爱看一些图将形象内容具体化,甚至是如果有一些动图如果可能模仿一下程序执行逻辑之类的那就更受欢迎了,然而往往这类内容波及到的底层十分多,并且优质的内容十分稠密,但我明天举荐的这个网站真的是挺让人惊喜的,网站进入的第一感觉就是:卧槽,这是小霸王嘛? 啥玩意啊。

一些小游戏动画切换背景,看着 codingame 这个 url 你丝毫不会想到这个网站跟编程有啥任何关系,只会想到:

  • 这到底是个啥?
  • 谷歌翻译一下看看……

注册个账号登录之后能力显示更多的内容,认真看下背景右侧还是有一些代码的,还是有一些十分神秘的感觉。

登录之后,左上角的 practice 能够进行一些练习,页面会有各种难度的游戏问题,这些问题都有一个小的游戏背景、规定、考察点期待你去实现,比方 easy 难度的大部分都是字符串、哈希、循环管制这类问题,而 mid 难度的考察点更宽泛比方很多二分查找、bfs、图论等等,如果英文不好能够借助翻译中英比照着看(狗头🐶举手),对于 hard 难度的有趣味能够自行挑战。

对于这外面的问题,有的是文本模式的,然而更多的是小游戏形式有动画更加直观。

还有一个十分重要的是,它反对多种编程语言,不论你是那种支流语言的爱好者,都能够畅想边玩游戏边学编程的高兴。

easy 初体验:ASCII 的艺术

这里和大家一起体验一下 easy 题怎么玩,我首先点进去的是一个叫 ASCII Art 的题.

地址为:https://www.codingame.com/ide…

刚进来就是一种彩色科技感十足,读完题可能有些小伙伴很懵逼,这是啥玩意,这个程序又跟咱们平时见得有点不一样,不须要像力扣那样实现整个办法,也不是和 acm 那种提交整个可执行代码提交,这个程序它会当时申明好一些内容你只须要在它提醒的中央写对应逻辑的代码就能够了,并且所有的后果要打印进去。

然而仔细的小伙伴会发现这个其实就是和咱们日常的刷题很像很像,不就换个样子嘛,没啥不一样的。

而这题的题意也很简略,我 口述一下(可能不规范):

给机场你常常看到这个牛批的显示屏:(图片)

你有没有问过本人,在一个好的旧终端上怎么显示这个数字?(我怎么会难为我本人呢),咱们有:用 ASCII 艺术

ASCII 艺术容许您应用字符来示意。精确地说,在咱们的例子中,这些模式是词。例如,单词“MANHATTAN”能够在 ASCII 艺术中显示如下:

这个就有点似曾相识了,我也曾打印过大的 0 -9……

在看输入输出和其余要求

输出

第 1 行:宽度 L 以 ASCII 艺术示意的字母。所有字母的宽度雷同。

第 2 行:高度 H 以 ASCII 艺术示意的字母。所有字母的高度雷同。

第 3行:待输入的文本T,有 n 个 ASCII 字符组成。

前面几行:字符串 ABCDEFGHIJKLMNOPQRSTUVWXYZ? 以 ASCII 艺术字 (输入到屏幕后果) 示意。

输入

文本 T 在 ASCII 艺术中。
字符 a 到 z 在 ASCII 艺术中显示为大写的等效字符。
不在区间 [az] 或 [AZ] 中的字符将在 ASCII 艺术中显示为问号。

问题剖析:

这尽管是个简略的问题,然而怎么剖析呢?

对于给定的宽度 L,和高度 H,其实就是 限定了每个字符在控制台的大小,这个如何了解呢,举个例子你就能明确。对于 0 来说,不同宽高的 0 可能长得样子不一样滴:

# # #   # # #   # # # #
#   #   #   #   #     #
# # #   #   #   #     #
        #   #   #     #
        # # #   # # # #

3*3     3*5      4*5
圆润型   瘦长型    标准型

其实也就是限定宽高每个字符你能够迅速锁定它的地位,存储方面不必多想必定是个二维的存储(多个一维或者二维)。

在输入的时候,依据字符计算 对应的地位,对应输入就能够了,思考到一些小白玩家还是可能不太明确,我贴上本人的🌶🐔代码,仅供参考:

import java.util.*;
import java.io.*;
import java.math.*;

/**
 * Auto-generated code below aims at helping you parse
 * the standard input according to the problem statement.
 **/
class Solution {public static void main(String args[]) {Scanner in = new Scanner(System.in);
        int L = in.nextInt();// 宽
        int H = in.nextInt();// 高
        char ch[][]=new char[H][L];
        if (in.hasNextLine()) {in.nextLine();
        }
        String T = in.nextLine().toUpperCase();
        for (int i = 0; i < H; i++) {String ROW = in.nextLine();// 输出每一行
            ch[i]=ROW.toCharArray();// 赋值给对应行}
        char value[][]=new char[H][T.length()*L];
        for(int i=0;i<T.length();i++){char temp=T.charAt(i);
            int index=temp-'A';
            if(index<0||index>26)
                index=26;// 不是字母通通问号???for(int j=0;j<H;j++){for(int q=0;q<L;q++)
                {value[j][q+i*L]=ch[j][q+L*index];// 赋值给待输入后果
                }
            }
        }
        for(char tem[]:value){for(char temp:tem){System.out.print(temp);
            }
            System.out.println();}

        // Write an answer using System.out.println()
        // To debug: System.err.println("Debug messages...");

        //System.out.println("answer");
    }
}

测试完提交即可。

mid 初体验二分

看完一个 easy 题,你可能感觉如同也没啥哈,那行,咱们一起看个经典的 mid 题:

链接为:https://www.codingame.com/ide…

这个题具体要求大家能够自行到下面看看,然而大略的意思就是:

通知你你 在的区域长宽 通知你你的初始点

你的指标是最终走到某个起点,不通知你具体坐标,只通知你指标点在你以后点的方位(有八个方向)。你须要在 N 步之内走到指标节点地位上,每走一轮你都要输入你以后点的地位。

看到这个问题还没读太懂的时候,下来就写了个每次只走一步的代码,后果遇到一个十分长的地图构造那就 GG 了。

起初想了一下,通知方位咱们能够每次进行二分查找,并且压缩所在区域的地位啊,也就是

遇到所有 U 方位的:阐明地图 最底部 在这个点之上

遇到所有 D 方位的:阐明地图 最顶部 在这个点之下

遇到所有 L 方位的:阐明地图 最右侧 在这个点右面

遇到所有 R 方位的:阐明地图 最左部 在这个点有点

通过应用二分,将以前的 O(n)工夫复杂度降到 O(logn)级别,基本上能够找到所有点了。

集体的代码能够给大家伙一个小参考:

import java.util.*;
import java.io.*;
import java.math.*;

/**
 * Auto-generated code below aims at helping you parse
 * the standard input according to the problem statement.
 **/
class Player {public static void main(String args[]) {Scanner in = new Scanner(System.in);
        int W = in.nextInt(); // width of the building.
        int H = in.nextInt(); // height of the building.
        int N = in.nextInt(); // maximum number of turns before game over.
        int X0 = in.nextInt();
        int Y0 = in.nextInt();
        int u=0,d=H,l=0,r=W;

        // game loop
        while (true) {String bombDir = in.next(); // the direction of the bombs from batman's current location (U, UR, R, DR, D, DL, L or UL)

            // Write an action using System.out.println()
            // To debug: System.err.println("Debug messages...");
           if(bombDir.contains("U")){
                d=Y0;
                Y0=((u+Y0)/2);
            }
            if(bombDir.contains("D")){
                u=Y0+1;
                Y0=((d+Y0)/2);
            }
            if(bombDir.contains("L")){
                r=X0;
                X0=((l+X0)/2);
            }

            if(bombDir.contains("R")){
                l=X0;
                X0=((r+X0)/2);
            }

            // the location of the next window Batman should jump to.
            System.out.println(X0+" "+Y0);
        }
    }
}

查看测试案例后果为:

当然,对于每一个测试案例,你能够滚动滑看其中的测试两头每一轮对应的动画,还是相当 nice 的。

这样本人写的代码可能可视化的看到每一步骤运行在图像上的后果,就像打怪降级一样,有点意思。

总结

对于这么一个网站,对初学者编程趣味的激发还是挺敌对的,举荐三两队友一起打怪降级,也可舍友互相比拼,把这个题丢到寝室群里让大伙一块看看,看谁先做对。

不过任何一个工具都要挑着选着用,能够找一些有挑战但本人能够承受的问题去尝试。玩玩体验一下还是挺乏味的!

集体公众号:bigsai 欢送关注

退出移动版