前言

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. mybatis多条件多值批量更新

    mysql并没有提供直接的方法来实现批量更新,但是可以用点小技巧来实现. 这里使用了case when 这个小技巧来实现批量更新. 举个例子: UPDATE 表名 SET    display_ord ...

  2. Selenium+Tesseract-OCR智能识别验证码爬取网页数据

    1.项目需求描述 通过订单号获取某系统内订单的详细数据,不需要账号密码的登录验证,但有图片验证码的动态识别,将获取到的数据存到数据库. 2.整体思路 1.通过Selenium技术,无窗口模式打开浏览器 ...

  3. POJ3734-Blocks【EGF】

    正题 题目链接:http://poj.org/problem?id=3734 题目大意 用思种颜色给\(n\)个格子染色,要求前两种颜色出现偶数次,求方案. \(1\leq T\leq 100,1\l ...

  4. Redis之品鉴之旅(五)

    Redis事务 原子性:就是最小的单位 一致性:好多命令,要么全部执行成功,要么全部执行失败 隔离性:一个会话和另一个会话之间是互相隔离的 持久性:执行了就执行了,数据保存在硬盘上 典型例子:银行转账 ...

  5. 简易集成websocket技术实现消息推送

    Websocket 简介 首先介绍下WebSocket,它是一种网络通信技术,该技术最大的特点就是,服务器端可以主动往客户端发送消息:当然,客户端也可以主动往服务器发送消息,实现两端的消息通信,属于网 ...

  6. Dapr + .NET Core实战(十二)服务调用之GRPC

    什么是GRPC gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架. gRPC 的主要优点是: 高性能轻量级 RPC 框架. 协定优先 API 开发,默认使用协议缓冲区,允许与语言无关的 ...

  7. Editing Tools(编辑工具)

    编辑工具 # Process: 修剪线 arcpy.TrimLine_edit("", "", "DELETE_SHORT") # Proc ...

  8. 时序数据库InfluxDB的基本语法

    一 了解InfluxDB的必要性 时序数据库主要存放的数据 Time series data is a series of data points each associated with a spe ...

  9. 【分享】 一款自用的Anki卡片模板:黄子涵单词卡片 v1

    [分享] 一款自用的Anki卡片模板:黄子涵单词卡片 v1 说明 第一代的功能 主要有两部分组成:英文和含义,目前主要是为自己记忆Web前端一些常用的单词而服务 有美美哒背景图,本来想修改为随机背景图 ...

  10. c语言中for循环 和嵌套for循环

    for循环:for( ; ; )里面是bai3个语句,两个分号.第一个语句是开始前执行,第二个语句是判断真假,如果真,就执行后面(大括号内)的代码.第三个语句是每次执行完毕后执行的东西,通常第三个语句 ...