April 1, 2003
hÄller pÄ med ett litet spel i skolan, i sprÄket C. spelet gÄr ut pÄ att den som tar sista myntet frÄn en hög förlorar, NIM heter det(kÀr barn har mÄnga namn, men vÄr lÀrare kallar det NIM). iaf sÄ har jag problem med att skriva ut vinnaren..
Jag har gjort sÄ att i början pÄ huvudprogrammet sÄ kollar den om det Àr 1 eller mindre mynt kvar, om det Àr det, sÄ kollar den vem den senaste spelaren var, o dÄ e den personen vinnaren. detta gör jag med variabeln "spelare", nÀr den Àr 1, dÄ Àr det personen som spelar som spelare, nÀr den Àr 0, sÄ Àr det datorns tur. men av nÄn anlednign sÄ Àr alltid spelare = 1 oavsett om det var datorn som tog sist...varför vet jag inte...
bifogar hela koden till spelet, plz help me =)
#include <stdio.h>
#include <stdbool.h>
#include <time.h>
#include <stdlib.h>
#define DATOR_SLUMP_MAX 3
#define MAX 3
#define MIN 1
#define STACK 13
#define LOOP_KOLL 1
#define PLAYER_TURN 0
void clear_buffer(){ /*clear buffer-function*/
int ch;
while(true){
ch = getchar();
if(ch == 'n'){
break;
}
}
}
int antal_mynt_datorn_tar(){ /* gives the computer the number of coins it will take from the stack*/
int slumpad_mynt;
srand(time(NULL));
slumpad_mynt = rand() % DATOR_SLUMP_MAX +1;
return slumpad_mynt;
}
int players_turn(){ /*switches between computer and player */
int player_turn = PLAYER_TURN;
player_turn++;
return player_turn;
}
int player(int stack){ /* player funktion*/
int stack_of_coins = stack;
int inmatningskontroll;
int player_antal_mynt_tagna;
int loop_koll;
loop_koll = LOOP_KOLL;
while(loop_koll==1){
printf("Hur mÄnga mynt vill du ta? (1-3)n");
inmatningskontroll = scanf("%d", &player_antal_mynt_tagna);/*to check if the player wrote a number*/
if(inmatningskontroll == 1){/*if player did'nt wrote a number then ask for a number again.*/
loop_koll++;
stack = stack_of_coins - player_antal_mynt_tagna;
clear_buffer();
printf("Antal mynt kvar i högen %d n ", stack);
return stack;
}else{
clear_buffer();
}
}
}
int computer(int stack){ /*computer function */
int dator_tar_antal = antal_mynt_datorn_tar();/*generates number of coins computer will take*/
int computer_stack_of_coins = stack;
stack = computer_stack_of_coins - dator_tar_antal; /*removes computers chosie from stack of coins*/
printf("datorn tog %d myntn", dator_tar_antal);
return stack;
}
int main(){
int spelare; /* if spelare = 1 then it is the players turn, else if spelare = 0 the it is the computers turn*/
int stack = STACK;
while(true){
if(stack <=1 ){ /* hÀr kollar jag vem som var sist*/
if(spelare == 0){
printf("du förlorade");
return 0;
} else if(spelare==1) {
printf("Du vann, grattisn");
return 0;
}
}
spelare = players_turn() % 2;
switch(spelare){
case 1: stack = player(stack); break;
case 0: stack = computer(stack); break;
}
printf("Antal mynt kvar i högen %d n ", stack);
}
return 0;
}
September 13, 2001
Orkar inte rĂ€tta, ta min đ
Var ju ett tag sedan jag skrev den, sÄ jag ansvarar inte för "smutsig kod".
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
using namespace std;
int main()
{
int
coins = 13, // Number of coins in the pile.
inCoins, // InputCoins.
max = 3, // Maximum coins to choose from.
min = 1; // Minimum coins to choose from.
string
player;
// Input
cout << "Nim is a game where you from 13 coins, choose between one and three. "
<< endl << "Make sure you dont draw the last coin, or you loose."
<< endl << "Right now there are " << coins << " coins, in the pile.n"<< endl;
// No real input at the moment.
// cout << "How many coins do you want in the pile. " << endl;
// cin >> coins;
// Logic
srand(time(0));
while (coins > 0)
{
// Players turn.
player = "You";
if (coins <= 3) // Makes sure you cant choose more then the existing number of coins +1.
{
switch(coins)
{
case 3: max = 2; break;
case 2: max = 1; break;
default: ;
}
}
cout << "Choose a number of coins: (" << min << "-" << max << ") > ";
cin >> inCoins;
while (inCoins < min || inCoins > max) // The loop starts when input is wrong.
{
cout << "Try again ! " << endl;
cin >> inCoins;
}
coins -= inCoins;
cout << "There are " << coins << " coins in the pile.n" << endl;
if (coins == 1) // This occurs when the player winns.
{
cout << "Congratiulations." << endl;
break;
}
if (coins <= 1) // Breaks when the number of coins is less or equal to zero.
{
break;
}
// Computers turn.
player = "Computer";
switch(coins) // Simple AI.
{
case 2: inCoins = 1; break;
case 3: inCoins = 2; break;
case 4: inCoins = 3; break;
default: inCoins = rand() % 3+1;
}
coins -= inCoins;
cout << "The computer draws " << inCoins << " coins" << endl;
if (coins == 1) // This occurs when players looses.
{
cout << "nSorry you loose." << endl;
break;
}
cout << "There are " << coins << " coins in the pile.n" << endl;
if (coins <= 1) // Breaks when the number of coins is less or equal to zero.
{
break;
}
}
// Output
cout << player << " winns !n" << endl;
return 0;
}
September 11, 2002
nu har ju jag aldrig programmerat i C men om det fungerar som i exempelvis java sÄ returnerar metoden players_turn alltid 1:
players_turn(){
int player_turn = PLAYER_TURN;
player_turn++;
return player_turn;
}
du sĂ€tter ju alltid player_turn till PLAYER_TURN som alltid Ă€r 0 (jag antar att #define PLAYER_TURN 0 skapar ett attribut, Ă€r ju inte hemma pĂ„ C direkt đ . iaf sĂ„ Ă€ndrar du aldrig detta om det Ă€r det du vill göra). sen plussar du pĂ„ med ett och returnerar vĂ€rdet. alltsĂ„ hade metoden lika gĂ€rna kunnat skrivas
players_turn(){
return 1
}
en enkel metod för att se vem vinnaren Àr Àr
April 1, 2003
fet_loa wrote: nu har ju jag aldrig programmerat i C men om det fungerar som i exempelvis java sÄ returnerar metoden players_turn alltid 1:
players_turn(){
int player_turn = PLAYER_TURN;
player_turn++;
return player_turn;
}du sĂ€tter ju alltid player_turn till PLAYER_TURN som alltid Ă€r 0 (jag antar att #define PLAYER_TURN 0 skapar en konstant, Ă€r ju inte hemma pĂ„ C direkt đ ). sen plussar du pĂ„ med ett och returnerar vĂ€rdet. alltsĂ„ hade metoden lika gĂ€rna kunnat skrivas
players_turn(){
return 1
}
hm....kanske det, men dÀrför tar jag modulo 2(player_turn() % 2) dÄ fÄr det vÀrdet 1 eller 0, oavsett vad funktionen Àr för nÄgot...iaf enligt lÀraren...
September 11, 2002
oxiswoofer wrote: hm....kanske det, men dÀrför tar jag modulo 2(player_turn() % 2) dÄ fÄr det vÀrdet 1 eller 0, oavsett vad funktionen Àr för nÄgot...iaf enligt lÀraren...
jo men eftersom vÀrdet du tar modulo tvÄ pÄ alltid Àr 1 sÄ fÄr du ju samma resultat.. (jag hoppas jag inte rör till det nu, du fÄr ursÀkta om det beror pÄ sprÄkskillnader) vill du inte att players_turn() varannan gÄng ska ge jÀmnt o varannan udda resultat? dÄ mÄste du Àndra attributet PLAYER_TURN pÄ ngt sÀtt, (antar att du vill plussa pÄ det med ett varje gÄng) nu gör metoden sÄ att den sÀtter en int till 0 sen plussar den med ett sÄ den fÄr vÀrdet 1, sen returnerar du det.
sÄhÀr typ, hur du vill plussa pÄ Àr upp till dig och beroende pÄ nÀr du vill göra det:
int players_turn(){
PLAYER_TURN++;
return PLAYER_TURN;
}
dÄ blir vÀrdet som returneras jÀmnt varannan gÄng och ojÀmnt varannan.
sen nÀr du vill se vem vinnaren blir sÄ kan du anropa metoden med modulo 2 nÀr mynten Àr slut och skriva ut lÀmplig vinnare..
September 13, 2001
oxiswoofer wrote: hm..tack...
men hur gör du för att kolla vem som e vinnaren? hittar inte det i koden/förstÄr inte...
đ
Ăhh det Ă€r ohelig/smutsig kod, mer en tĂ€vling i vem som gjorde klart det först sĂ„ man fick gĂ„ hem tror jag.
Det finns en variabel "player" som hÄller reda pÄ det.
Kolla sista utskriften, 3:e raden nerifrÄn.
September 13, 2001
Du kan föresten lösa ditt problem genom att skita i funktionen "players_turn()"
int main(){
int spelare;
while(true){
if((spelare %2) == 0){
printf("du förlorade");
return 0;
} else if((spelare%2)==1) {
printf("Du vann, grattisn");
return 0;
}
}
switch(spelare){
case 1: stack = player(stack); break;
case 0: stack = computer(stack); break;
}
printf("Antal mynt kvar i högen %d n ", stack);
spelare++; // <-------------
}
Gör ngt sÄnt istÀllet.
Möblera om lite med sÄ du slipper ha en "return 0" mitt i koden i onödan, ser ganska fult ut.
February 16, 2004
En liten sak för snygghetens skull som jag sÄg att du hade.
DÄ man har tvÄ alternativ sÄ rÀcker det ju med att du har if och sen else onödigt att ha else if dÄ du endast har tvÄ möjligheter eller rÀcker ju med if ocksÄ dÄ. Man kollar bara om man vann annars trycker man ut att du förlorade.
1 Guest(s)