前言

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. 鸿蒙内核源码分析(自旋锁篇) | 当立贞节牌坊的好同志 | 百篇博客分析OpenHarmony源码 | v26.02

    百篇博客系列篇.本篇为: v26.xx 鸿蒙内核源码分析(自旋锁篇) | 当立贞节牌坊的好同志 | 51.c.h .o 进程通讯相关篇为: v26.xx 鸿蒙内核源码分析(自旋锁篇) | 当立贞节牌坊 ...

  2. farOs 介绍

    nGame nGame 一款文字游戏服务端框架;用于快速构建:自由探索.武侠.修真.模拟,回合制,剧本杀.动态语言小说.等服务器 如果你有期望实现的功能请加Q群 ngame计划 完善框架功能 farO ...

  3. 在 ASP.NET Core 中自动启用 CAP 事务

    本篇文章旨在描述如何在 ASP.NET Core项目中并以一种简便的方式启用CAP事务,因为在我们的示例中都是直接演示比较直观的方式,没有进行封装,有些初学者同学不太会,找到问我如何封装,本篇文章主要 ...

  4. C++中string和char字符串的异同与使用方法

    C++中string和char声明字符串的异同和使用 string类 必须在头文件中包含<string> 隐藏了字符串的数组性质,可以像处理普通变量那样处理字符串 string类位于名称空 ...

  5. VS2013编译报错——error LNK2001: 无法解析的外部符号 __imp_PathMatchSpecA E:\CaffeProgram\3train_mnist(p)\3train_mnist\gflags.lib(gflags.obj) 3train_mnist

    解决方案来自http://blog.csdn.net/yang6464158/article/details/41743641 感谢感谢~~

  6. 迁移appseting.json创建自定义配置中心

    创建一个自定义的配置中心,将框架中各类配置,迁移至数据库,支持切换数据库,热重载. 说在前面的话 自使用.net Core框架以来,配置大多存在json文件中: [框架默认加载配置]文件为appset ...

  7. 统计学习:线性支持向量机(SVM)

    学习策略 软间隔最大化 上一章我们所定义的"线性可分支持向量机"要求训练数据是线性可分的.然而在实际中,训练数据往往包括异常值(outlier),故而常是线性不可分的.这就要求我们 ...

  8. SpringPlugin-Core在业务中的应用

    前言 一直负责部门的订单模块,从php转到Java也是如此,换了一种语言来实现订单相关功能.那么Spring里有很多已经搭建好基础模块的设计模式来帮助我们解耦实际业务中的逻辑,用起来非常的方便!就比如 ...

  9. Python笔记_1语法总结

    前言导读 本章知识点是我在最初期听python视频教程的时候整理总结的笔记 对python语法的认识对以后代码的解读有着很大的帮助. 1 新建python命名规则 新建项目名 :数字编号 项目名称 新 ...

  10. Python常用加密解密算法

    MD5加密 简介 这是一种使用非常广泛的加密方式,不可逆的,常见16位和32位一般都是md5 实现 import hashlib data = '你好' print(hashlib.md5(data. ...