Apr 30, 2016 - Bartle Taxonomy

Who are you Richard?

Richard Bartle is a British writer, professor and well known game researcher (his publications to be found here, his favorite meal and crispy details here). He is among the firsts to really theorise Gamification and the litterature on the subject now talks about his work as “Bartle’s Taxonomy”.

He studied the now ancestors of multiplayers online games (called MUD at the time which standed for Multi User Dungeon) and believed users could be divided into 4 kind of players: Killers / Achievers / Socializers / Explorers.

Bartle's Taxonomy Graph

But who cares about MUD anymore?” Well, you would be surprised but it’s not our subject. The fact is that those 4 kinds of players can be found in most of the games you play.

Why do we play games?

If you think of it, it’s obvious that people don’t play games for the same reason. You probably heard of Maslow’s hierarchy of needs, the 4 kinds of players also have basic needs that can be similar. We could for example state that they all want to have fun and that they need to spend some time playing the game or that they all need to understand the rules of the game. But it’s also obvious that they have specifics needs regarding their Type.

As academic definitions of each kind of player has been done many times before (on top of the original definition from Richard himself) we thought it funnier to give you examples for each type.


Killer

Have you ever played Monopoly with that friend of yours that want to crush you? He wants to buy everything and is really more than aggressive when negotiation time comes. He tries to make you trade your best cards showing no flexibility. He is more than happy when you are struggling with you mortgage and in the end he will explode with joy when you’ll give up after only 30 minutes playing => you know a Killer!

Achiever:

The easiest example to show what drives an achiever is the famous Candy Crush game. Maybe you played the game before and you even got trapped playing 10 times the same level. But it’s nothing compared to your achiever friend that spent days and nights and maybe even money trying to beat the game. He doesn’t especially want to be the best and the first in the leaderboard (remember your killer friend) but he loves the challenge to face more and more difficult levels => you know an achiever!

Socializer:

Unless you have lived in a cave the past decade, you’ve read, seen or even played Second Life. It is the most representative of a game for socializer you can imagine. Maybe you know someone that has tried SL and told you that he loved it because he met lots of different people coming from all over the world, made new friends and even start a virtual relationship => you know a socializer!

The previous example is almost too obvious as SL is mainly based on socialization but a socializer can also be interested in the latest trendy game. He will try to become an influencer as it will allow him to share his knowledge and to show his progress on the social networks being able to build a community. Mastering Farmville would fulfil the socializer’s needs.

Explorers:

Although the strength of Grand Theft Auto is to address the 4 kind of players, we will use it to demonstrate how it is the perfect example for explorers. If you ever played that computer game you know that there is no bounds to the map, you can go around with no restriction, driving in all the areas of the city. When you were trying to complete the missions your friend was just going everywhere he could, trying to find an hidden place an easteregg or even better an unknown bug. He would spend hours discovering all the parts of the map doing nothing but being focused on not missing a piece => you know an explorer!


Those examples show you that it’s easy to identify the 4 different types of players but of course it doesn’t have to be black or white. You can be 80% Killer and 20% achievers or even feel like an explorer one day and a socializer the day after depending on your state of mind but you will have to fulfill your needs. The strength of a game is thus to address the more types it can and that’s what we are trying to do with Place2Be as we provide solutions for Killers, Achievers and Socializers.

To conclude, we said before Bartle’s Taxonomy is the premise of the study of player’s type and it has been of course completed by several other studies. We agree that it needs to be push forward but we also believe that this “basic” theory is still accurate, easy to understand and can be apply to many games.

If you want to go further :

Apr 25, 2016 - PMU Challenge: Proposed approach in answer to the challenge

Express the proposed approach and the solutions envisaged in answer to the challenge

We define a list of actions and triggers that a spectator will have to perform in order to collect:

  • Points
  • Badges
  • Status
  • Ownership
  • Virtual gifts
  • Free bets

The sport attendee would have to scan QR codes placed in the sport arena in order to :

  • Attest his presence => to improve his status
  • To complete specific challenges => to collect defined badges

We could imagine a game that will make the player become the owner of the field or of a specific horse.

We could make people compete in teams : Fan of horse #1 vs fan of horse #2 / how? => What was the team that was in the sport arena at a specific date when the two horses were in competition (The members of each teams would have to scan the QR code to show they were registerd for the challenge).

We could also make people realize they are competiting against other people when they bet virtually or for real money to allow them to compare with other player (with the same status of course in order to be compared to fellow players).

Feb 2, 2016 - Minimal steps to scan QR Codes from an Android App

Minimal steps to scan QR Codes from an Android App

Introduction

This tutorial will describe the steps needed to add the Zxing library to scan QR codes from within a “Hello World” app. It assumes you have the following already installed/configured:

For the sake of simplicity, we will assume the app is named Place2BeDemo but this name will obvisouly vary in your case.

This tutorial is freely inspired from the one of Android Cookbook and based on the result of the getting started tutorial from Android Studio Documentation.

Step 1: Clean activity_ and content_ XML files

When starting a Blank Activity template, res/layout folder contains two files: activity_yourapp.xml which includes content_yourapp.xml. We’ll need to clean both to safely add widgets further linked to call to Zxing library. #### Cleaning activity_yourapp.xml Nothing much interesting here, everything except the include statement can be safely removed from the CoordinatorLayout markup. Your file should look like this:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="com.place2be.demo.place2bedemo.Place2BeActivity">

    <include layout="@layout/content_place2_be" />

</android.support.design.widget.CoordinatorLayout>

Cleaning content_yourapp.xml

The BlankActivity template chosen when creating the Hello World project includes the content_my.xml file with a RelativeLayout root view and a TextView child view.

  1. Delete the <TextView\> element.
  2. Change the <RelativeLayout\> element to <LinearLayout\>.
  3. Add the android:orientation attribute and set it to “horizontal”.
  4. Remove the android:padding attributes and the tools:context attribute.

You should now have an empty content.xml file, with no more widget included.

Step 2: Add Widgets

A button widget can now be added in content_yourapp.xml, that will be linked to a launcher of the Zxing library. Simply add:

<LinearLayout android:orientation="horizontal"
	android:layout_width="fill_parent"
	android:layout_height="wrap_content">
	<Button android:layout_width="fill_parent"
		android:layout_height="wrap_content"
		android:id="@+id/butQR"
		android:text="Scan a new QR Code"
		android:textSize="18sp"/>
</LinearLayout>

in the root LinearLayout markup.

In addition to the button widget, one can add two textview to be updated by the scan results (also in the LinearLayout markup):

<TextView android:layout_width="fill_parent"
	android:layout_height="wrap_content"
	android:id="@+id/tvStatus"
	android:text="Press the button to start a scan."
	android:textSize="18sp" />
<TextView android:layout_width="fill_parent"
	android:layout_height="fill_parent"
	android:id="@+id/tvResult"
	android:text="Status: Ready"
	android:textSize="18sp"
	android:background="@android:color/white"
	android:textColor="@android:color/black"/>
  • In yourappActivity.java file, import the necessary packages:
import android.view.View.OnClickListener;
import android.content.Intent;
import android.widget.TextView;
  • In the onCreate procedure, remove the ‘toolbar’ related lines as they have been cleaned from the xml views:
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_mymain);
-	Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
-	setSupportActionBar(toolbar);

-	FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
-	fab.setOnClickListener(new View.OnClickListener() {
-		@Override
-		public void onClick(View view) {
-		Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
-				.setAction("Action", null).show();
-		}
-	});
}

and replace them by a click handler, linked to the QR button created in step 2:

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_place2be);
+	HandleClick hc = new HandleClick();
+	findViewById(R.id.butQR).setOnClickListener(hc);
}
  • The private Click Handler class has to be defined below the onCreate method:
private class HandleClick implements OnClickListener{
	public void onClick(View arg0) {
		Intent intent = new Intent("com.google.zxing.client.android.SCAN");
		switch(arg0.getId()){
		case R.id.butQR:
			intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
			break;
		}
	startActivityForResult(intent, 0);	//Barcode Scanner to scan for us
	}
}

Notice the Intent line that assumes the zxing client is available and the startActivityForResult() call that launches it when the QR button is pressed. The result returned by the Zxing client has to be handled by a specific onActivityResult method (put below the private HandleClick class):

public void onActivityResult(int requestCode, int resultCode, Intent intent) {
	if (requestCode == 0) {
		TextView tvStatus=(TextView)findViewById(R.id.tvStatus);
		TextView tvResult=(TextView)findViewById(R.id.tvResult);
		if (resultCode == RESULT_OK) {
			tvStatus.setText(intent.getStringExtra("SCAN_RESULT_FORMAT"));
			tvResult.setText(intent.getStringExtra("SCAN_RESULT"));
		} else if (resultCode == RESULT_CANCELED) {
			tvStatus.setText("Press the button to start a scan.");
			tvResult.setText("Scan cancelled.");
		}
	}
}

which will set the scan result (and format) to the Textviews instanciated in Step 2.

  • Your file should eventually look like something similar to this:
public class Place2BeActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_place2be);
        HandleClick hc = new HandleClick();
        findViewById(R.id.butQR).setOnClickListener(hc);
    }
    private class HandleClick implements OnClickListener{
        public void onClick(View arg0) {
            Intent intent = new Intent("com.google.zxing.client.android.SCAN");
            switch(arg0.getId()){
                case R.id.butQR:
                    intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
                    break;
            }
            startActivityForResult(intent, 0);	//Barcode Scanner to scan for us
        }
    }
    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        if (requestCode == 0) {
            TextView tvStatus=(TextView)findViewById(R.id.tvStatus);
            TextView tvResult=(TextView)findViewById(R.id.tvResult);
            if (resultCode == RESULT_OK) {
                tvStatus.setText(intent.getStringExtra("SCAN_RESULT_FORMAT"));
                tvResult.setText(intent.getStringExtra("SCAN_RESULT"));
            } else if (resultCode == RESULT_CANCELED) {
                tvStatus.setText("Press the button to start a scan.");
                tvResult.setText("Scan cancelled.");
            }
        }
    }
}

Step 4: Final Result

  • A screen capture of the demo app result can downloaded here.