Your game runs as fast as possible in one core. This is normal depending on what you have done.
I don’t know if you want to take MORE power (thus reach 100%) or LESS (and use less poor user energy accounts ...)
If you want to take more energy, you need to use threads somehow to use both cores. Since I am not very versed in threads, I will not even try to explain, this is not my area.
If you want to use LESS power, there are also two options ...
One of them is the "exit", since some game library APIs call it (for example, Allegro), it consists of creating an FPS counter and providing processor control for every frame in sufficient time. For example, if your game wants to work at a speed of 120 FPS, and you want it to run at 60, you can give it about the same time as the frame takes to calculate (about 83,333 ... ms).
Another uses an event-based method to encode a game, not a loop. In this form, you put your code in a function called "Update", which takes as argument the amount of time spent since the last call (this is very important ...). This "update" can be either for the entire application (more classical), or for each object that has its own (popular after the invention of Flash, which uses it as "OnEnterFrame", Unity also uses this and some other engines). And you make code that throws an interrupt and causes this update, usually it's just a timer that starts at normal times (16.6 .... ms for 60FPS, 33.33333 ... ms for 30FPS).
Obviously, there are many other ways, but I will not explain them, because this is sufficient information for a small book ...
I used various approaches on my own, I like to just use the full CPU stream (without streaming) and use more and more offensive effects of the system as power becomes available. But for simpler games, I usually make a loop that "gives", the easiest way, as a rule, to calculate how much time it took to calculate everything, subtract from 16.6 ms and call the sleep function (which gives control over the OS for this time) for the result ... For example, if the frame took 3 ms to calculate, I cause sleep (16-3). And several engines make me work with the "event style" (i.e., the input comes from keyboard, mouse and joystick interrupts, and the timer interrupts and calls "Update (step)"), I don’t like it, but I had to learn .. .
And a final note: The "step" var, which I named (the Update argument), is usually used in math game logic, for example: "position.x = position.x + speed * step" to make the object move at an actual constant speed .. . (obviously, the operation used depends on what constitutes a "step").