前言

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/puzzle/ascii-art

刚进来就是一种黑色科技感十足,读完题可能有些小伙伴很懵逼,这是啥玩意,这个程序又跟我们平常见得有点不一样,不需要像力扣那样完成整个方法,也不是和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/puzzle/shadows-of-the-knight-episode-1

这个题具体要求大家可以自行到上面看看,但是大概的意思就是:

告诉你你在的区域长宽告诉你你的初始点

你的目标是最终走到某个终点,不告诉你具体坐标,只告诉你目标点在你当前点的方位(有八个方向)。你需要在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 欢迎关注

coding game, 边打游戏边学编程,是一种怎么样的体验?的更多相关文章

  1. 在 2016 年学 JavaScript 是一种什么样的体验?

    转 译者:方应杭 嘿,我最近接到一个 Web 项目,不过老实说,我这两年没怎么接触 Web 编程,听说 Web 技术已经发生了一些变化.听说你是这里对新技术最了解的 Web 开发工程师? 准确地说,我 ...

  2. 在 2016 年学 JavaScript 是一种什么样的体验?(React从入门到放弃)

    jquery 年代 vs 前端模块化 http://blog.csdn.net/offbye/article/details/52793921 ++ 嘿,我最近接到一个 Web 项目,不过老实说,我这 ...

  3. 学 Android 是一种什么样的体验?

    转眼间 2016 年的电量已不足 20%,不禁感慨 How Time Flies!不知不觉 Android 移动开发已经走过了八年的光阴,在这八年的时间中,Android 开发从最初的简单调用系统 A ...

  4. 我教女朋友学编程html系列(7)—Html无序列表、自定义列表、有序列表及常用例子

    昨天写的那篇文章<我教女朋友学编程Html系列(6)—Html常用表单控件>,基本上有1000人左右看了,那边文章是我站在前人的肩膀上修改来的,添加了截图和说明,合并了例子,使之更容易被初 ...

  5. 如何学好游戏3D引擎编程

    注:本文是网上看到的一篇文章,感觉写的很好,因此收藏了下来 <如何学好游戏3D引擎编程>此篇文章献给那些为了游戏编程不怕困难的热血青年,它的神秘要我永远不间断的去挑战自我,超越自我,这样才 ...

  6. 《陪孩子像搭积木一样学编程》,一起来玩Scratch(1)使用Scratch编程的基本流程

    编程是一件很有趣的事情.初次接触编程,你可能不知所措,别担心,这并不复杂.首先,为了让读者对编程有大概的了解,可以把编写Scratch程序的过程分成7个步骤(如图1.8).注意,这是理想状态.在实际的 ...

  7. Java匹马行天下之学编程的起点——编程常识知多少

    学编程的起点——编程常识知多少 前言: 刚去大学那会,我就知道我被录取的学院是软件学院,还知道一点就是软件学院主要是学电脑的,但具体要学什么其实一无所知.待的时间久了,慢慢的,像“编程”.“软件”.“ ...

  8. Java匹马行天下之学编程的起点——高级语言大锅烩

    学编程的起点——高级语言大锅烩 前言: 学知识前总想说点鸡汤,想喝的朋友就看看,不想喝的就直接看干货吧,就当鸡汤是给我自己喝的. 前段时间在网上看了一句话感觉挺触动我的,我做个分享: 如果你觉得你的祖 ...

  9. 教孩子学编程 Python

    教孩子学编程   Python 目录 第1 章 Python 基础:认识环境 111 认识Python 312 用Python 编写程序 513 运行Python 程序 514 本章小结 615 编程 ...

随机推荐

  1. iGuard6.0 — 各适其用的网站防护体系

    ​随着互联网新技术的涌现,网站的架构技术和涉及的资源也日益多样且复杂化.这对网站各类资源的防护工作也提出了更高的挑战和更细粒度的需求. 我们经常碰到的用户真实需求包括: 我的 CMS 制作系统,会不会 ...

  2. 鸿蒙内核源码分析(进程镜像篇)|ELF是如何被加载运行的? | 百篇博客分析OpenHarmony源码 | v56.01

    百篇博客系列篇.本篇为: v56.xx 鸿蒙内核源码分析(进程映像篇) | ELF是如何被加载运行的? | 51.c.h.o 加载运行相关篇为: v51.xx 鸿蒙内核源码分析(ELF格式篇) | 应 ...

  3. P2012-拯救世界2【EGF】

    正题 题目链接:https://www.luogu.com.cn/problem/P2012 题目大意 \(12\)种东西排列成长度为\(n\)的序列,要求前四种出现奇数次,后四种出现偶数次,求方案. ...

  4. 前端快闪四: 拦截axios请求和响应

    马甲哥继续在同程艺龙写一点大前端: 今天我们来了解一下 如何拦截axios请求/响应? axios是一个基于 promise 的网络请求库,可以用于浏览器和 node.js, promise 类似于C ...

  5. 《python编程:从入门到实践》课后习题及答案

    转载: <Python编程:从入门到实践>课后习题及答案-码农之家 (xz577.com) <Python编程:从入门到实践>课后习题及答案 - 信德维拉 - 博客园 (cnb ...

  6. 理解ASP.NET Core - 路由(Routing)

    注:本文隶属于<理解ASP.NET Core>系列文章,请查看置顶博客或点击此处查看全文目录 Routing Routing(路由):更准确的应该叫做Endpoint Routing,负责 ...

  7. UltraSoft Scrum Meeting 博客汇总

    一.Alpha阶段 UltraSoft - Alpha - Scrum Meeting 1 UltraSoft - Alpha - Scrum Meeting 2 UltraSoft - Alpha ...

  8. 常用JAVA API :HashSet 和 TreeSet

    set容器的特点是不包含重复元素,也就是说自动去重. HashSet HashSet基于哈希表实现,无序. add(E e)//如果容器中不包含此元素,则添加. clear()//清空 contain ...

  9. MyBatis源码分析(五):MyBatis Cache分析

    一.Mybatis缓存介绍 在Mybatis中,它提供了一级缓存和二级缓存,默认的情况下只开启一级缓存,所以默认情况下是开启了缓存的,除非明确指定不开缓存功能.使用缓存的目的就是把数据保存在内存中,是 ...

  10. Python中根据时间自动创建文件夹

    导语 ​ 电脑桌面文件太多查找起来比较花费时间,并且凌乱的电脑桌面也会影响工作心情,于是利用python根据时间自动建立当日文件夹,这样就可以把桌面上文件按时间进行存放. 代码实现 # _*_codi ...