Jump to content
  • Advertisement
Sign in to follow this  
  • entries
  • comment
  • views

#5 - Testing the attributes



Since my last update, i have implemented most of the attributes in Cycling - The board game.

Quick recap: the game is about getting to the finish line first. Each turn, each player rolls a dice (D6) and moves the amount of squares. The odds of the dice are rigged based on the player's strength (higher strength = better odds). Next to the dice roll the player can gain bonuses to move additional squares. These bonuses are based on their attributes (which can range from 1 - 20).

Now that i have implemented them, i have to check if they add fun to the game. Fun is of course hard to measure, but what i am aiming for mostly is balance between the different elements. For example, if one attribute is much more important than others, the others are irrelevant.

To test them, i left my computer running for a night and simulate over 600 different races with different AI players (with every time different attributes and strength). I now had a lot of data points to analyse with.

I decided to use a multiple regression analysis, where i analysed the impact of the strength and all the different attributes on the outcome of the race. This led to the following results:




Coefficient of different attributes















Starting Position









  • This stuff really makes me feel like a nerd, which is nice 😉
  • The R squared means that more than half of the results are not explained by this model
  • The fact that all attributes are negative is correct (the higher the attribute, the lower your total final time)
  • The attribute luck has a different sign, which basically means that a lower attribute is better (although the coefficient is very small, so technically it means that it is not relevant)
  • Strength is more important than all the different attributes
  • Climbing, solo riding and group technique are most important
  • Composure and determination hardly matter at all
I am somewhat happy with these outcomes, but find it difficult to determine my final goal here. I think it is not a good idea to have all attributes at (roughly) the same value, since then it won't matter which one you improve at all. 
On the other hand, an extremely large difference between attributes, means that your strategy should be to simply focus on the best attributes, which is also technically not really fun.
For now, my next move will be to make the lowest three attributes somewhat more influential so that they matter more. When that is done, i am just going to continue playtesting manually and get a feeling for how the game is running. At that point i will also upload a new version, so i can (hopefully) get some feedback on the game itself. 
In the meantime, please feel free to try out the game yourself (link) or even better, let me know what your ideas would be to further balance the game.
Thank you once again for reading!


Recommended Comments

There are no comments to display.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Advertisement
  • Advertisement
  • Blog Entries

  • Similar Content

    • By gomidas
      Hello, I made a directional light with diffuse. Now If I rotate my camera I see changes. Some parts naturally becomes darker. I did not pass parameters from variables I directly put them to see if that works. My problem, if I rotate or move cam I see changes but if I rotate or move mesh I cant see changes. What should I add to see the differences when mesh rotated ?
      Texture2D ShaderTexture : register(t0); Texture2D ShaderTextureNormal : register(t1); SamplerState Sampler : register(s0); cbuffer CBufferPerFrame{ float4 AmbientColor = float4(1.0f,1.0f,1.0f,0.0f); float4 LightColor = float4(1.0f,1.0f,1.0f,1.0f); float3 lightDirection = float3(0.0f,0.0f,-1.0f); } cbuffer CBufferPerObject{ float4x4 worldViewProj; float4x4 world; } struct VS_IN { float4 pos : POSITION; float3 normal : NORMAL; // Normal - for lighting float4 col : COLOR; float2 TextureUV: TEXCOORD0; // Texture UV coordinate }; struct PS_IN { float4 pos : SV_POSITION; float4 col : COLOR; float2 TextureUV: TEXCOORD; float3 normal : NORMAL; float3 tangent : TANGENT; float3 binormal : BINORMAL; float3 lightDirection:LIGHT; float3 WorldPos:POSITION1; }; float3 CalculateTangent(float3 normal){ float3 tangent; float3 c1 = cross(normal, float3 (0.0, 0.0, 1.0)); float3 c2 = cross(normal, float3 (0.0, 1.0, 0.0)); return tangent; } PS_IN VS( VS_IN input ) { PS_IN output = (PS_IN)0; output.pos = mul(input.pos, worldViewProj); output.col = 1.0f-((input.pos.w /* * input.col*/) / (input.pos.z /* *input.col*/)); output.TextureUV = input.TextureUV; output.normal = normalize(mul(float4(input.normal,0), world).xyz); output.lightDirection=float3(0.0f,0.0f,-1.0f); output.tangent = CalculateTangent(input.normal); output.col = input.col; output.WorldPos = mul( input.pos, world ); return output; } float4 PS( PS_IN input ) : SV_Target { float3 sampledNormal = (2*ShaderTextureNormal.Sample(Sampler,input.TextureUV).xyz) - 1.0f; float3x3 tbn = float3x3(input.tangent, input.binormal, input.normal); sampledNormal = mul(sampledNormal, tbn); float4 N = ShaderTextureNormal.Sample(Sampler, input.TextureUV)*2.0f-1.0f; float4 D = ShaderTexture.Sample(Sampler, input.TextureUV); float3 lightDirection = normalize(-1*input.lightDirection); float n_dot_1 = dot (lightDirection, input.normal); float3 ambient = D.rgb * float3(1.0f,1.0f,1.0f) * 0; float3 diffuse=(float3)0; if( N.x == -1 && N.y == -1 && N.z == -1 && N.w == -1) { //I am not using normal map for now if(n_dot_1>0){ diffuse = D.rgb* float3(1,1,1) * 1 * n_dot_1; } input.col.rgb=(ambient+ diffuse); input.col.a = D.a; } else { //Not used for now. //input.col = saturate(dot(N,input.lightDirection)); } return input.col; }  
    • By ethancodes
      I'm working on spawning several balls in the same location and shooting them all outward randomly within a certain angle. I need to know how I can spawn the balls in the same spot though without them hitting each other. I need them to hit everything else except other balls. Is there a way to do this? 
    • By MatsK
      Guys, if I measure the width and height of each line in a gap buffer (lines are delineated by \n), what would be the formula for finding the X and Y coordinate of any given character in that gap buffer?
      Something like so:
      /// <summary> /// Returns the position of any given character in m_Text. /// </summary> /// <param name="CharacterIndex">The index of the character.</param> /// <returns>THe position of the character indexed by <paramref name="CharacterIndex"/></returns> private Vector2 CharaterPosition(int CharacterIndex) { }  
    • By davejones
      I am developing a 3D interactive mobile Game in Unity3d and am trying to implement a first person camera controller. I have done much research into first person camera controllers, but I can't seem to find the ideal set up. 

      I am trying to develop a first person camera controller that can be used on touch devices. The inputs from the user would have to come from the user swiping, pinching etc rather than using a UI joystick. I have seen first person camera controllers that make use of UI joysticks but this isn't what I am looking for. 
      - First person camera controller 
      - touch device friendly
      - responds to gestures from user such as swiping and pinching. 

      I am unsure what to do right now???
    • By Apocaholist
      Hey, I've created an array of lists
      public List<Cube> [] cubes; This array contains a whole map of cubes compressed with RLE (Run-length encoding) to save memory and I'm wondering is it thread safe to resize a single List inside that array while there is only one thread editing that particular list but multiple threads editing other lists inside the same array?

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!