Skip to content

Rust Coffee Vending Machine Simulator: Build Your Logical Thinking

(Made by Me, Designed for Ultimate Logical Flow Mastery)

Before We Start

If you have not set up Rust development environment on Windows yet,
πŸ‘‰ Please read this guide first:
How to Set Up Rust Development Environment on Windows

This project assumes you already have Rust and Cargo installed!


rust coffee vending machine simulator

Introduction

Welcome! β˜•
Today I want to proudly introduce a project that I personally designed and built:
The Rust Coffee Vending Machine Simulator.

Why did I create this?
Because mastering logical flow is the secret key to becoming a real developer.
Without strong logical thinking, no amount of fancy libraries or GUIs can help.

And trust me β€” this small but complete project will teach you how to think step-by-step like a real computer!

βœ… You will practice:

  • Making decisions
  • Handling user input safely
  • Managing inventory like a real machine
  • Simulating real-world processes logically

Important: Install rand Library First!

Before you even start coding,
πŸ‘‰ You MUST add the rand library.

Why?
Because we will simulate random temperatures (like a real heating machine),
and Rust does not include random number generation by default to keep it lightweight.

If you forget to add it, your code will throw errors like:

“unresolved import rand
“cannot find function thread_rng in crate rand

πŸ‘‰ To install it, open your terminal inside the project folder and type:

cargo add rand

βœ… This installs the latest rand 0.9 version,
which introduces the new, easier rand::rng() and random_range() functions.

Without this step, the simulator WILL NOT COMPILE!


Why This Project Is the Best for Learning Logical Flow

μ΄μœ μ„€λͺ…
Real-World SimulationHeating, menu choice, payment, and stock management β€” just like real machines!
Clear Step-by-Step ThinkingYou control everything: input β†’ decision β†’ reaction
Transferable to Other Languages (like C)Logical thinking is universal: once you master it here, you can apply it in C, C++, Python, Java and everywhere!
Fast Skill GrowthPracticing small but real scenarios sharpens your mind faster than just copying tutorials

This is the secret:
“Mastering logical flow here makes any future coding project much easier.”


Logical Flowchart

[Start]
↓
[Check if Coffee Exists]
↓
[Heat Machine to 80Β°C+]
↓
[Show Drink Menu]
↓
[User Selects Drink]
↓
[User Sets Sugar Level]
↓
[Insert 25Β’ Coin]
↓
[Check Ingredient Availability]
↓
(Enough?)
β”œβ”€β”€ Yes β†’ [Brew Coffee β†’ Update Inventory β†’ Show Remaining Stock β†’ Check if Stock is Empty]
└── No β†’ [Refund Coin β†’ End]
↓
[End]

βœ… This flow teaches clear problem-solving thinking.


Full Rust Code (Friendly Comments, rand 0.9 Version)

// rand 0.9 version is required!
// Import random number generator
use rand::Rng;

// Import libraries for input, sleep, and time control
use std::{io, thread, time};

fn main() {
// Set initial inventory (in grams)
let mut sugar = 500;
let mut creamer = 400;
let mut coffee = 600;

// Define how much each spoon uses
let sugar_per_spoon = 5; // 5 grams per spoon of sugar
let creamer_per_spoon = 4; // 4 grams per spoon of creamer
let coffee_per_spoon = 6; // 6 grams per spoon of coffee

println!("β˜• Welcome to the Rust Coffee Vending Machine Simulator!");

// Step 1: Check if any coffee exists
if coffee == 0 {
println!("Sorry, no coffee left. Machine shutting down.");
return;
}

// Step 2: Heat the machine
loop {
let mut rng = rand::rng(); // create a random number generator
let temperature = rng.random_range(50..=100); // pick a number between 50 and 100
println!("Current Temperature: {}Β°C", temperature);

if temperature >= 80 {
println!("Temperature is good! Ready to serve!");
break; // Exit the loop
} else {
println!("Heating... Please wait 2 seconds.");
thread::sleep(time::Duration::from_secs(2)); // Wait 2 seconds
}
}

// Step 3: Show the drink menu
let drink_type = loop {
println!("=========================");
println!(" Menu");
println!("=========================");
if creamer > 0 {
println!("1. Milk Coffee (with creamer)");
}
println!("2. Black Coffee (no creamer)");
println!("=========================");
println!("Select your drink:");

let mut menu_input = String::new();
io::stdin().read_line(&mut menu_input).expect("Failed to read input");

let menu_choice: u32 = match menu_input.trim().parse() {
Ok(num) => num,
Err(_) => {
println!("Please enter a valid number.");
continue; // Try again
}
};

match menu_choice {
1 if creamer > 0 => {
println!("You chose Milk Coffee!");
break 1;
}
2 => {
println!("You chose Black Coffee!");
break 2;
}
_ => {
println!("Invalid choice. Please try again.");
}
}
};

// Step 4: Ask how many spoons of sugar
println!("How many spoons of sugar would you like? (0 to 5):");
let sugar_spoons = read_number();

// Step 5: Insert one 25Β’ coin
println!("Please insert one 25Β’ coin:");
let coin = read_number();

if coin != 25 {
println!("Only one 25Β’ coin is accepted. Canceling order.");
return;
}

println!("Payment received! Preparing your coffee...");

// Step 6: Calculate the needed ingredients
let (sugar_needed, creamer_needed, coffee_needed) = match drink_type {
1 => (sugar_spoons * sugar_per_spoon, 4 * creamer_per_spoon, 3 * coffee_per_spoon),
2 => (sugar_spoons * sugar_per_spoon, 0, 5 * coffee_per_spoon),
_ => (0, 0, 0),
};

// Step 7: Check if enough ingredients
if sugar < sugar_needed || creamer < creamer_needed || coffee < coffee_needed {
println!("Sorry, not enough ingredients. Refunding your 25Β’.");
return;
}

// Step 8: Brew the coffee
println!("Brewing your coffee... Please wait!");
thread::sleep(time::Duration::from_secs(3));
println!("βœ… Your coffee is ready! Enjoy!");

// Step 9: Subtract used ingredients
sugar -= sugar_needed;
creamer -= creamer_needed;
coffee -= coffee_needed;

// Step 10: Show remaining stock
println!("---------------------------");
println!("Remaining Ingredients:");
println!("Sugar: {} grams", sugar);
println!("Creamer: {} grams", creamer);
println!("Coffee: {} grams", coffee);
println!("---------------------------");

// Step 11: Check if coffee is finished
if coffee == 0 {
println!("⚠️ Coffee stock depleted. Machine shutting down.");
}
}

// Helper function to read numbers safely
fn read_number() -> u32 {
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Failed to read input");
input.trim().parse().unwrap_or(0) // Return 0 if failed
}

rust coffee vending machine simulator

Conclusion

βœ… By building this Coffee Vending Machine, you learned:

  • How to think like a machine (step-by-step!)
  • How to handle input and errors cleanly
  • How to simulate real processes easily
  • How to use Rust’s random tools safely (rand 0.9)

Logical flow mastery first. Then anything becomes easy.

I’m proud of this project because it’s a real shortcut to smart programming. πŸš€

And remember:
This logical approach is NOT just for Rust.
βœ… It is also powerful in C, C++, Java, Python β€” ANY language!


External Resources

If you want to learn more about Rust, here are some trusted sources:


Leave a Reply

Your email address will not be published. Required fields are marked *