I have been working on the number guessing game project for a couple of days now and, despite my script working in all of my tests, many of the tasks still won’t pass. I’ve tried many different ways and check many other posts of other users who struggled with this project, but I could not find an answer. Any help is appreciated.
Here is my script:
#!/bin/bash
PSQL="psql --username=freecodecamp --dbname=number_guess -t --no-align -c"
NUMBER=$(( RANDOM % 1000 + 1))
MAIN() {
echo -e "\nEnter your username:\n"
read USERNAME
USER_ID=$($PSQL "SELECT user_id FROM users WHERE name = '$USERNAME'")
if [[ -z $USER_ID ]]
then
INSERT_NEW_USERNAME=$($PSQL "INSERT INTO users(name) VALUES('$USERNAME')")
USER_ID=$($PSQL "SELECT user_id FROM users WHERE name = '$USERNAME'")
fi
NUMBER_OF_GAMES=$($PSQL "SELECT COUNT(user_id) FROM games WHERE user_id = $USER_ID AND finished = TRUE")
BEST_GAME=$($PSQL "SELECT number_of_guesses FROM games WHERE user_id = $USER_ID AND finished = TRUE ORDER BY number_of_guesses LIMIT 1")
if [ $NUMBER_OF_GAMES -eq 0 ]
then
echo -e "\nWelcome, $USERNAME! It looks like this is your first time here."
else
echo -e "\nWelcome back, $USERNAME! You have played $NUMBER_OF_GAMES games, and your best game took $BEST_GAME guesses."
fi
INSERT_GAME=$($PSQL "INSERT INTO games(user_id, number, finished) VALUES($USER_ID, $NUMBER, FALSE)")
GAME_ID=$($PSQL "SELECT game_id FROM games ORDER BY game_id DESC LIMIT 1")
GUESSING
}
GUESSING() {
echo -e "\nGuess the secret number between 1 and 1000:\n"
read GUESS
NUMBER_OF_GUESSES=0
while true
do
if ! [[ $GUESS =~ ^[0-9]+$ ]]
then
echo -e "\nThat is not an integer, guess again:\n"
else
((NUMBER_OF_GUESSES++))
if [ $GUESS -gt $NUMBER ]
then
INSERT_INCORRECT=$($PSQL "INSERT INTO guesses(user_id, guess, correct, game_id) VALUES($USER_ID, $GUESS, FALSE, $GAME_ID)")
echo -e "\nIt's lower than that, guess again:\n"
elif [ $GUESS -lt $NUMBER ]
then
INSERT_INCORRECT=$($PSQL "INSERT INTO guesses(user_id, guess, correct, game_id) VALUES($USER_ID, $GUESS, FALSE, $GAME_ID)")
echo -e "\nIt's higher than that, guess again:\n"
else
INSERT_CORRECT=$($PSQL "INSERT INTO guesses(user_id, guess, correct, game_id) VALUES($USER_ID, $GUESS, TRUE, $GAME_ID)")
UPDATE_GAME=$($PSQL "UPDATE games SET finished = TRUE, number_of_guesses = $NUMBER_OF_GUESSES WHERE game_id = $GAME_ID")
echo -e "\nYou guessed it in $NUMBER_OF_GUESSES tries. The secret number was $NUMBER. Nice job!\n"
break
fi
fi
read GUESS
done
}
MAIN
And this is the sql dump:
--
-- PostgreSQL database dump
--
-- Dumped from database version 12.9 (Ubuntu 12.9-2.pgdg20.04+1)
-- Dumped by pg_dump version 12.9 (Ubuntu 12.9-2.pgdg20.04+1)
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
DROP DATABASE number_guess;
--
-- Name: number_guess; Type: DATABASE; Schema: -; Owner: freecodecamp
--
CREATE DATABASE number_guess WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'C.UTF-8' LC_CTYPE = 'C.UTF-8';
ALTER DATABASE number_guess OWNER TO freecodecamp;
\connect number_guess
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
SET default_tablespace = '';
SET default_table_access_method = heap;
--
-- Name: games; Type: TABLE; Schema: public; Owner: freecodecamp
--
CREATE TABLE public.games (
game_id integer NOT NULL,
number_of_guesses integer,
user_id integer NOT NULL,
finished boolean
);
ALTER TABLE public.games OWNER TO freecodecamp;
--
-- Name: games_game_id_seq; Type: SEQUENCE; Schema: public; Owner: freecodecamp
--
CREATE SEQUENCE public.games_game_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.games_game_id_seq OWNER TO freecodecamp;
--
-- Name: games_game_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: freecodecamp
--
ALTER SEQUENCE public.games_game_id_seq OWNED BY public.games.game_id;
--
-- Name: guesses; Type: TABLE; Schema: public; Owner: freecodecamp
--
CREATE TABLE public.guesses (
user_id integer NOT NULL,
guess integer NOT NULL,
correct boolean NOT NULL,
guess_id integer NOT NULL,
game_id integer NOT NULL
);
ALTER TABLE public.guesses OWNER TO freecodecamp;
--
-- Name: guesses_guess_id_seq; Type: SEQUENCE; Schema: public; Owner: freecodecamp
--
CREATE SEQUENCE public.guesses_guess_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.guesses_guess_id_seq OWNER TO freecodecamp;
--
-- Name: guesses_guess_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: freecodecamp
--
ALTER SEQUENCE public.guesses_guess_id_seq OWNED BY public.guesses.guess_id;
--
-- Name: users; Type: TABLE; Schema: public; Owner: freecodecamp
--
CREATE TABLE public.users (
name character varying(25) NOT NULL,
user_id integer NOT NULL
);
ALTER TABLE public.users OWNER TO freecodecamp;
--
-- Name: users_user_id_seq; Type: SEQUENCE; Schema: public; Owner: freecodecamp
--
CREATE SEQUENCE public.users_user_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.users_user_id_seq OWNER TO freecodecamp;
--
-- Name: users_user_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: freecodecamp
--
ALTER SEQUENCE public.users_user_id_seq OWNED BY public.users.user_id;
--
-- Name: games game_id; Type: DEFAULT; Schema: public; Owner: freecodecamp
--
ALTER TABLE ONLY public.games ALTER COLUMN game_id SET DEFAULT nextval('public.games_game_id_seq'::regclass);
--
-- Name: guesses guess_id; Type: DEFAULT; Schema: public; Owner: freecodecamp
--
ALTER TABLE ONLY public.guesses ALTER COLUMN guess_id SET DEFAULT nextval('public.guesses_guess_id_seq'::regclass);
--
-- Name: users user_id; Type: DEFAULT; Schema: public; Owner: freecodecamp
--
ALTER TABLE ONLY public.users ALTER COLUMN user_id SET DEFAULT nextval('public.users_user_id_seq'::regclass);
--
-- Data for Name: games; Type: TABLE DATA; Schema: public; Owner: freecodecamp
--
INSERT INTO public.games VALUES (549, 9, 197, true);
INSERT INTO public.games VALUES (550, 10, 197, true);
INSERT INTO public.games VALUES (551, NULL, 197, false);
INSERT INTO public.games VALUES (552, NULL, 198, false);
INSERT INTO public.games VALUES (553, NULL, 198, false);
INSERT INTO public.games VALUES (554, NULL, 199, false);
INSERT INTO public.games VALUES (555, NULL, 199, false);
INSERT INTO public.games VALUES (556, NULL, 198, false);
INSERT INTO public.games VALUES (557, NULL, 198, false);
INSERT INTO public.games VALUES (558, NULL, 198, false);
--
-- Data for Name: guesses; Type: TABLE DATA; Schema: public; Owner: freecodecamp
--
INSERT INTO public.guesses VALUES (197, 500, false, 4995, 549);
INSERT INTO public.guesses VALUES (197, 750, false, 4996, 549);
INSERT INTO public.guesses VALUES (197, 666, false, 4997, 549);
INSERT INTO public.guesses VALUES (197, 700, false, 4998, 549);
INSERT INTO public.guesses VALUES (197, 690, false, 4999, 549);
INSERT INTO public.guesses VALUES (197, 680, false, 5000, 549);
INSERT INTO public.guesses VALUES (197, 670, false, 5001, 549);
INSERT INTO public.guesses VALUES (197, 668, false, 5002, 549);
INSERT INTO public.guesses VALUES (197, 667, true, 5003, 549);
INSERT INTO public.guesses VALUES (197, 500, false, 5004, 550);
INSERT INTO public.guesses VALUES (197, 750, false, 5005, 550);
INSERT INTO public.guesses VALUES (197, 875, false, 5006, 550);
INSERT INTO public.guesses VALUES (197, 933, false, 5007, 550);
INSERT INTO public.guesses VALUES (197, 902, false, 5008, 550);
INSERT INTO public.guesses VALUES (197, 915, false, 5009, 550);
INSERT INTO public.guesses VALUES (197, 925, false, 5010, 550);
INSERT INTO public.guesses VALUES (197, 920, false, 5011, 550);
INSERT INTO public.guesses VALUES (197, 922, false, 5012, 550);
INSERT INTO public.guesses VALUES (197, 921, true, 5013, 550);
INSERT INTO public.guesses VALUES (198, 0, false, 5014, 552);
INSERT INTO public.guesses VALUES (198, 1, false, 5015, 552);
INSERT INTO public.guesses VALUES (198, 2, false, 5016, 552);
INSERT INTO public.guesses VALUES (198, 3, false, 5017, 552);
INSERT INTO public.guesses VALUES (198, 4, false, 5018, 552);
INSERT INTO public.guesses VALUES (198, 5, false, 5019, 552);
INSERT INTO public.guesses VALUES (198, 6, false, 5020, 552);
INSERT INTO public.guesses VALUES (198, 7, false, 5021, 552);
INSERT INTO public.guesses VALUES (198, 8, false, 5022, 552);
INSERT INTO public.guesses VALUES (198, 9, false, 5023, 552);
INSERT INTO public.guesses VALUES (198, 10, false, 5024, 552);
INSERT INTO public.guesses VALUES (198, 11, false, 5025, 552);
INSERT INTO public.guesses VALUES (198, 12, false, 5026, 552);
INSERT INTO public.guesses VALUES (198, 13, false, 5027, 552);
INSERT INTO public.guesses VALUES (198, 14, false, 5028, 552);
INSERT INTO public.guesses VALUES (198, 15, false, 5029, 552);
INSERT INTO public.guesses VALUES (198, 16, false, 5030, 552);
INSERT INTO public.guesses VALUES (198, 0, false, 5031, 553);
INSERT INTO public.guesses VALUES (198, 1, false, 5032, 553);
INSERT INTO public.guesses VALUES (198, 2, false, 5033, 553);
INSERT INTO public.guesses VALUES (198, 3, false, 5034, 553);
INSERT INTO public.guesses VALUES (198, 4, false, 5035, 553);
INSERT INTO public.guesses VALUES (198, 5, false, 5036, 553);
INSERT INTO public.guesses VALUES (198, 6, false, 5037, 553);
INSERT INTO public.guesses VALUES (198, 7, false, 5038, 553);
INSERT INTO public.guesses VALUES (198, 8, false, 5039, 553);
INSERT INTO public.guesses VALUES (198, 9, false, 5040, 553);
INSERT INTO public.guesses VALUES (198, 10, false, 5041, 553);
INSERT INTO public.guesses VALUES (198, 11, false, 5042, 553);
INSERT INTO public.guesses VALUES (198, 12, false, 5043, 553);
INSERT INTO public.guesses VALUES (198, 13, false, 5044, 553);
INSERT INTO public.guesses VALUES (198, 14, false, 5045, 553);
INSERT INTO public.guesses VALUES (198, 15, false, 5046, 553);
INSERT INTO public.guesses VALUES (198, 16, false, 5047, 553);
INSERT INTO public.guesses VALUES (199, 0, false, 5048, 554);
INSERT INTO public.guesses VALUES (199, 1, false, 5049, 554);
INSERT INTO public.guesses VALUES (199, 2, false, 5050, 554);
INSERT INTO public.guesses VALUES (199, 3, false, 5051, 554);
INSERT INTO public.guesses VALUES (199, 4, false, 5052, 554);
INSERT INTO public.guesses VALUES (199, 5, false, 5053, 554);
INSERT INTO public.guesses VALUES (199, 6, false, 5054, 554);
INSERT INTO public.guesses VALUES (199, 7, false, 5055, 554);
INSERT INTO public.guesses VALUES (199, 8, false, 5056, 554);
INSERT INTO public.guesses VALUES (199, 9, false, 5057, 554);
INSERT INTO public.guesses VALUES (199, 10, false, 5058, 554);
INSERT INTO public.guesses VALUES (199, 11, false, 5059, 554);
INSERT INTO public.guesses VALUES (199, 12, false, 5060, 554);
INSERT INTO public.guesses VALUES (199, 13, false, 5061, 554);
INSERT INTO public.guesses VALUES (199, 14, false, 5062, 554);
INSERT INTO public.guesses VALUES (199, 15, false, 5063, 554);
INSERT INTO public.guesses VALUES (199, 16, false, 5064, 554);
INSERT INTO public.guesses VALUES (199, 0, false, 5065, 555);
INSERT INTO public.guesses VALUES (199, 1, false, 5066, 555);
INSERT INTO public.guesses VALUES (199, 2, false, 5067, 555);
INSERT INTO public.guesses VALUES (199, 3, false, 5068, 555);
INSERT INTO public.guesses VALUES (199, 4, false, 5069, 555);
INSERT INTO public.guesses VALUES (199, 5, false, 5070, 555);
INSERT INTO public.guesses VALUES (199, 6, false, 5071, 555);
INSERT INTO public.guesses VALUES (199, 7, false, 5072, 555);
INSERT INTO public.guesses VALUES (199, 8, false, 5073, 555);
INSERT INTO public.guesses VALUES (199, 9, false, 5074, 555);
INSERT INTO public.guesses VALUES (199, 10, false, 5075, 555);
INSERT INTO public.guesses VALUES (199, 11, false, 5076, 555);
INSERT INTO public.guesses VALUES (199, 12, false, 5077, 555);
INSERT INTO public.guesses VALUES (199, 13, false, 5078, 555);
INSERT INTO public.guesses VALUES (199, 14, false, 5079, 555);
INSERT INTO public.guesses VALUES (199, 15, false, 5080, 555);
INSERT INTO public.guesses VALUES (199, 16, false, 5081, 555);
INSERT INTO public.guesses VALUES (198, 1, false, 5082, 556);
INSERT INTO public.guesses VALUES (198, 1000, false, 5083, 556);
INSERT INTO public.guesses VALUES (198, 0, false, 5084, 556);
INSERT INTO public.guesses VALUES (198, 1, false, 5085, 556);
INSERT INTO public.guesses VALUES (198, 2, false, 5086, 556);
INSERT INTO public.guesses VALUES (198, 3, false, 5087, 556);
INSERT INTO public.guesses VALUES (198, 4, false, 5088, 556);
INSERT INTO public.guesses VALUES (198, 5, false, 5089, 556);
INSERT INTO public.guesses VALUES (198, 6, false, 5090, 556);
INSERT INTO public.guesses VALUES (198, 7, false, 5091, 556);
INSERT INTO public.guesses VALUES (198, 8, false, 5092, 556);
INSERT INTO public.guesses VALUES (198, 9, false, 5093, 556);
INSERT INTO public.guesses VALUES (198, 10, false, 5094, 556);
INSERT INTO public.guesses VALUES (198, 11, false, 5095, 556);
INSERT INTO public.guesses VALUES (198, 12, false, 5096, 556);
INSERT INTO public.guesses VALUES (198, 13, false, 5097, 556);
INSERT INTO public.guesses VALUES (198, 14, false, 5098, 556);
INSERT INTO public.guesses VALUES (198, 0, false, 5099, 557);
INSERT INTO public.guesses VALUES (198, 1, false, 5100, 557);
INSERT INTO public.guesses VALUES (198, 2, false, 5101, 557);
INSERT INTO public.guesses VALUES (198, 3, false, 5102, 557);
INSERT INTO public.guesses VALUES (198, 4, false, 5103, 557);
INSERT INTO public.guesses VALUES (198, 5, false, 5104, 557);
INSERT INTO public.guesses VALUES (198, 6, false, 5105, 557);
INSERT INTO public.guesses VALUES (198, 7, false, 5106, 557);
INSERT INTO public.guesses VALUES (198, 8, false, 5107, 557);
INSERT INTO public.guesses VALUES (198, 9, false, 5108, 557);
INSERT INTO public.guesses VALUES (198, 10, false, 5109, 557);
INSERT INTO public.guesses VALUES (198, 11, false, 5110, 557);
INSERT INTO public.guesses VALUES (198, 12, false, 5111, 557);
INSERT INTO public.guesses VALUES (198, 13, false, 5112, 557);
INSERT INTO public.guesses VALUES (198, 14, false, 5113, 557);
INSERT INTO public.guesses VALUES (198, 15, false, 5114, 557);
INSERT INTO public.guesses VALUES (198, 16, false, 5115, 557);
INSERT INTO public.guesses VALUES (198, 0, false, 5116, 558);
INSERT INTO public.guesses VALUES (198, 1, false, 5117, 558);
INSERT INTO public.guesses VALUES (198, 2, false, 5118, 558);
INSERT INTO public.guesses VALUES (198, 3, false, 5119, 558);
INSERT INTO public.guesses VALUES (198, 4, false, 5120, 558);
INSERT INTO public.guesses VALUES (198, 5, false, 5121, 558);
INSERT INTO public.guesses VALUES (198, 6, false, 5122, 558);
INSERT INTO public.guesses VALUES (198, 7, false, 5123, 558);
INSERT INTO public.guesses VALUES (198, 8, false, 5124, 558);
INSERT INTO public.guesses VALUES (198, 9, false, 5125, 558);
INSERT INTO public.guesses VALUES (198, 10, false, 5126, 558);
INSERT INTO public.guesses VALUES (198, 11, false, 5127, 558);
INSERT INTO public.guesses VALUES (198, 12, false, 5128, 558);
INSERT INTO public.guesses VALUES (198, 13, false, 5129, 558);
INSERT INTO public.guesses VALUES (198, 14, false, 5130, 558);
INSERT INTO public.guesses VALUES (198, 15, false, 5131, 558);
INSERT INTO public.guesses VALUES (198, 16, false, 5132, 558);
--
-- Data for Name: users; Type: TABLE DATA; Schema: public; Owner: freecodecamp
--
INSERT INTO public.users VALUES ('Vitor', 197);
INSERT INTO public.users VALUES ('user_1675566799546', 198);
INSERT INTO public.users VALUES ('user_1675566799545', 199);
--
-- Name: games_game_id_seq; Type: SEQUENCE SET; Schema: public; Owner: freecodecamp
--
SELECT pg_catalog.setval('public.games_game_id_seq', 558, true);
--
-- Name: guesses_guess_id_seq; Type: SEQUENCE SET; Schema: public; Owner: freecodecamp
--
SELECT pg_catalog.setval('public.guesses_guess_id_seq', 5132, true);
--
-- Name: users_user_id_seq; Type: SEQUENCE SET; Schema: public; Owner: freecodecamp
--
SELECT pg_catalog.setval('public.users_user_id_seq', 199, true);
--
-- Name: games games_pkey; Type: CONSTRAINT; Schema: public; Owner: freecodecamp
--
ALTER TABLE ONLY public.games
ADD CONSTRAINT games_pkey PRIMARY KEY (game_id);
--
-- Name: guesses guesses_pkey; Type: CONSTRAINT; Schema: public; Owner: freecodecamp
--
ALTER TABLE ONLY public.guesses
ADD CONSTRAINT guesses_pkey PRIMARY KEY (guess_id);
--
-- Name: users users_pkey; Type: CONSTRAINT; Schema: public; Owner: freecodecamp
--
ALTER TABLE ONLY public.users
ADD CONSTRAINT users_pkey PRIMARY KEY (user_id);
--
-- Name: games games_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: freecodecamp
--
ALTER TABLE ONLY public.games
ADD CONSTRAINT games_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(user_id);
--
-- Name: guesses guesses_game_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: freecodecamp
--
ALTER TABLE ONLY public.guesses
ADD CONSTRAINT guesses_game_id_fkey FOREIGN KEY (game_id) REFERENCES public.games(game_id);
--
-- Name: guesses guesses_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: freecodecamp
--
ALTER TABLE ONLY public.guesses
ADD CONSTRAINT guesses_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(user_id);
--
-- PostgreSQL database dump complete
--