C prog fel, visa vinnaren|Programmering / Grafisk formgivning|Forum|Nordichardware

Search
Forum Scope


Match



Forum Options



Minimum search word length is 3 characters - maximum search word length is 84 characters
Lost password?
The forums are currently locked and only available for read only access
sp_Feed sp_TopicIcon
C prog fel, visa vinnaren
oxiswoofer
Member
Medlem
Forum Posts: 2101
Member Since:
April 1, 2003
sp_UserOfflineSmall Offline
1
November 12, 2004 - 12:26 pm
sp_Permalink sp_Print

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;
}
Chewie
Kommer du hit ofta?
Medlem
Forum Posts: 1516
Member Since:
September 13, 2001
sp_UserOfflineSmall Offline
771129
November 12, 2004 - 12:40 pm
sp_Permalink sp_Print

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;
}
oxiswoofer
Member
Medlem
Forum Posts: 2101
Member Since:
April 1, 2003
sp_UserOfflineSmall Offline
771130
November 12, 2004 - 12:43 pm
sp_Permalink sp_Print

hm..tack...
men hur gör du för att kolla vem som e vinnaren? hittar inte det i koden/förstÄr inte...
🙄

fet_loa
Kommer du hit ofta?
Medlem
Forum Posts: 1332
Member Since:
September 11, 2002
sp_UserOfflineSmall Offline
771173
November 12, 2004 - 1:39 pm
sp_Permalink sp_Print

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

oxiswoofer
Member
Medlem
Forum Posts: 2101
Member Since:
April 1, 2003
sp_UserOfflineSmall Offline
771177
November 12, 2004 - 1:46 pm
sp_Permalink sp_Print

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...

fet_loa
Kommer du hit ofta?
Medlem
Forum Posts: 1332
Member Since:
September 11, 2002
sp_UserOfflineSmall Offline
771184
November 12, 2004 - 1:58 pm
sp_Permalink sp_Print

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..

Chewie
Kommer du hit ofta?
Medlem
Forum Posts: 1516
Member Since:
September 13, 2001
sp_UserOfflineSmall Offline
771307
November 12, 2004 - 3:56 pm
sp_Permalink sp_Print

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.

Chewie
Kommer du hit ofta?
Medlem
Forum Posts: 1516
Member Since:
September 13, 2001
sp_UserOfflineSmall Offline
771314
November 12, 2004 - 4:02 pm
sp_Permalink sp_Print

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.

oxiswoofer
Member
Medlem
Forum Posts: 2101
Member Since:
April 1, 2003
sp_UserOfflineSmall Offline
772524
November 14, 2004 - 10:52 am
sp_Permalink sp_Print

skall testa det Chewie, tack sÄ mkt =)

Pojo
Member
Medlem
Forum Posts: 2239
Member Since:
February 16, 2004
sp_UserOfflineSmall Offline
772708
November 14, 2004 - 6:30 pm
sp_Permalink sp_Print

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.

Forum Timezone: Europe/Stockholm
Most Users Ever Online: 1030
Currently Online:
Guest(s) 341
Currently Browsing this Page:
1 Guest(s)
Top Posters:
Andreas Galistel: 16287
Jonas Klar: 15897
ilg@dd: 10810
Nyhet: 10607
Mind: 10550
Ctrl: 10355
Gueno: 9881
Guest: 9344
Snorch: 8881
Callister: 8468
Newest Members:
PetrbonFU PetrbonFU
Karine Bembry
Dolores Mcdaniels
Anibal McLeish
Francisca Alt
Alfie Everhart
Lester Huitt
Orlando Jorgensen
Mikki Lundgren
Dakota Kozlowski
Forum Stats:
Groups: 11
Forums: 59
Topics: 146630
Posts: 1300967

 

Member Stats:
Guest Posters: 2
Members: 79425
Moderators: 0
Admins: 11
Administrators: nordicadmin, Henrik Berntsson, Anton Karmehed, Carl Holmberg, Joel Oscarsson, Mikael Linnér, Mikael Schwartz, Andreas Paulsson, Nickebjrk, Mattias Pettersson, EmxL