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) 66
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