|
Yes, It's me again
Okay, trying to store 5 cards into a two dimensional array.
Got handBoard[13][4] initialized to all 0's
hand[0] through hand[4] each are holding a random number between 0 and 51.
When I try to populate the two-dimensional array to show the five cards, I get random sections of the array sprouting 1's I didn't specify. Here is the section of the code that should be populating my array.
<code>
for (count = 0; count < 5; count++)
{
if (hand[count] < 13)
handColumn[count] = 0;
else if (( hand[count] > 13) && (hand[count] < 26))
handColumn[count] = 1;
else if ((hand[count] > 26) && (hand[count] < 39))
handColumn[count] = 2;
else if (39 < hand[count])
handColumn[count] = 3;
}
// setting which column the hand goes into
for (count = 0; count < 5; count++)
{
if ((hand[count] == 0) || (hand[count] == 13) || (hand[count] == 26) || (hand[count] == 39))
handRow[count] = 0;
else if ((hand[count] == 1) || (hand[count] == 14) || (hand[count] == 27) || (hand[count] == 40))
handRow[count] = 1;
else if ((hand[count] == 2) || (hand[count] == 15) || (hand[count] == 28) || (hand[count] == 41))
handRow[count] = 2;
else if ((hand[count] == 3) || (hand[count] == 16) || (hand[count] == 29) || (hand[count] == 42))
handRow[count] = 3;
else if ((hand[count] == 4) || (hand[count] == 17) || (hand[count] == 30) || (hand[count] == 43))
handRow[count] = 4;
else if ((hand[count] == 5) || (hand[count] == 18) || (hand[count] == 31) || (hand[count] == 44))
handRow[count] = 5;
else if ((hand[count] == 6) || (hand[count] == 19) || (hand[count] == 32) || (hand[count] == 45))
handRow[count] = 6;
else if ((hand[count] == 7) || (hand[count] == 20) || (hand[count] == 33) || (hand[count] == 46))
handRow[count] = 7;
else if ((hand[count] == 8) || (hand[count] == 21) || (hand[count] == 34) || (hand[count] == 47))
handRow[count] = 8;
else if ((hand[count] == 9) || (hand[count] == 22) || (hand[count] == 35) || (hand[count] == 48))
handRow[count] = 9;
else if ((hand[count] == 10) || (hand[count] == 23) || (hand[count] == 36) || (hand[count] == 49))
handRow[count] = 10;
else if ((hand[count] == 11) || (hand[count] == 24) || (hand[count] == 37) || (hand[count] == 50))
handRow[count] = 11;
else if ((hand[count] == 12) || (hand[count] == 25) || (hand[count] == 38) || (hand[count] == 51))
handRow[count] = 12;
}
// setting which column the hand goes into
for(count = 0; count < 5; count++)
handBoard[handColumn[count]][handRow[count]] = 1;
for(count = 0; count < 13; count++)
cout << handBoard[0][count] << ' ';
cout << endl;
for(count = 0; count < 13; count++)
cout << handBoard[1][count] << ' ';
cout << endl;
for(count = 0; count < 13; count++)
cout << handBoard[2][count] << ' ';
cout << endl;
for(count = 0; count < 13; count++)
cout << handBoard[3][count] << ' ';
cout << endl;
// printing out the array to see if it populates correctly.
</code>
This has been the biggest headache ever. Please, any help?
-- Modified Sunday, May 16, 2010 12:27 PM
|
|
|
|
|
Hi,
1.
you have an error in else if (( hand[count] > 13) && (hand[count] < 26))
what with the values 13, 26, 39 themselves?
2.
you could do the same with less code (and less bugs) by using division and modulo operators.
for positive integers, division yields the integer quotient, and modulo (aka remainder) yields the modulus (or remainder after division).
Example: instead of
if (hand[count] < 13)
handColumn[count] = 0;
else if (( hand[count] > 13) && (hand[count] < 26))
handColumn[count] = 1;
else if ((hand[count] > 26) && (hand[count] < 39))
handColumn[count] = 2;
else if (39 < hand[count])
handColumn[count] = 3;
do
handColumn[count] = hand[count]/13;
that is one line replacing 8, and eliminating the bugs.
And instead of
if ((hand[count] == 0) || (hand[count] == 13) || (hand[count] == 26) || (hand[count] == 39))
handRow[count] = 0;
else if ((hand[count] == 1) || (hand[count] == 14) || (hand[count] == 27) || (hand[count] == 40))
handRow[count] = 1;
...
else if ((hand[count] == 12) || (hand[count] == 25) || (hand[count] == 38) || (hand[count] == 51))
handRow[count] = 12;
do
handRow[count] = hand[count]%13;
now replacing 26 lines.
3.
In general, any time you have a lot of lines that are almost identical, there probably is a smarter way to achieve the same with less code; sometimes it takes an operator, sometimes a loop. However, before committing to similar lines of code, rethink the matter.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
1.
you have an error in else if (( hand[count] > 13) && (hand[count] < 26)) what with the values 13, 26, 39 themselves?
The values of 13, 26, and 39 (and 0 (not shown)) are the values identifying the Ace card in an array of cards from 0 - 51. Ahh! I see the error. It should be (( hand[count] > 12) && (hand[count] < 26)) correct?
2.
handColumn[count] = hand[count]/13;
I'm not understanding how this works, apparently. If count is 3, then handColumn[3] = hand[3]/13;. What if hand[3] was 15? Then 15/13 would be 1..... wait! Thats it! 15/13 would be 1.18 or something, but with an int callout, would only display as 1, which would put it in the second column being as it is the second set of cards! Wow... I'm glad I picked up on that. That makes a whole lot of sense. Thanks again!
3.
handRow[count] = hand[count]%13;
Now let's see if I can understand this. Once again, hand[count] is 15. So, 13/15 is 1 with a remainder of 2, so it would put 15 in the 2 row. 15 in a 0-51 deck is card number 3, which would go into the 3rd row which is 2. Okay, I can see how that works now! Thanks a third time!
Now I need to figure out how to use all of this to determine if the set of five cards meets any win conditions for poker....
Thanks a bunch for all the help!
|
|
|
|
|
You're welcome.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
I wanted to add one more awesome thank you to you and everyone else who helped. I finished my "Video Poker" game at 7:30pm on Sunday, it was due at midnight. I put in over 35 hours between designing the menu, debugging, reading and writing to files, converting repeated sections into separate function and header files, debugging, doing the base code, and debugging.
After a solid 800 lines of code for a final project in my very first actual programming class... I get 600 out of a possible 600 points! And a very special, "FYI, It is very rare to get 100% - Congratulations!"
I wanted to respond back because I wouldn't have gotten that grade without the help I got here. It opened a lot of doors when I was struggling and also became a gateway to understanding a few other things I was missing out on. Thanks again everybody! Your tutoring and help is very much appreciated!
|
|
|
|
|
you're welcome. That is what CodeProject is all about, giving you answers to specific questions, some hints, and the stimulus to study, persevere, google, and try.
congrats again.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
It's nice to see the lightbulb form in slow motion!
Many of these things are hard to teach, or to initially understand. Once your brain makes the click sound, it's hard to see how people *don't* understand.
I've done quite a lot of training in the past, and the hardest bit was putting yourself back in the position of the trainees.
Iain.
I have now moved to Sweden for love (awwww).
|
|
|
|
|
Hi Frank,
Just to expand a bit on Luc's comment above, there's usually a simpler way of doing things when you see repeated code. Have a look at the facilities provided by the <algorithm> header, you'll find plenty of ways to simplify loops. In your case you're transforming the contents of one collection into the contents of another which is exactly what std::transform does.
So taking Luc's comments one stage further you can do most of what you were trying to do with your initialisation loops in two lines:
std::transform( hand, hand + 5, handColumn, []( int n ){ return n / 13; } );
std::transform( hand, hand + 5, handRow, []( int n ){ return n % 13; } );
The arguments to std::transform are a bit weird looking if you've never seen them before:
- the first two describe where you want to get the data to transform from
- the third describes where you want to put the transformed data
- the fourth describes how you want to transform it
So in both cases you're wanting to operate on data from hand[ 0 ] to hand[ 5 ] (not including hand[ 5 ]) and stick the transformed data into handRow or handColumn starting at the beginning. The last parameter is a lambda (it starts with empty square brackets)that says what you want the tranformation to be division by 13 in the first case and modulo by 13 in the second case.
(lambda's are inline objects that behave like function calls. They're part of the C++0x standard - VC++ 2010 and gcc 4.4 support them though so it's easy to get a free compiler that knows about them.)
Going a bit further... even with these changes it takes a bit of looking at the code to work out what's going on. As far as I can tell you're taking an integer representation of a playing card and decoding it into an integer representation of a suit and a card face. Both aren't that obvious - it looks like you're missing a few abstractions in your code. If you had these abstractions you wouldn't be worrying about decoding the card's suit and face value from an integer, it'd just happen.
Anyway, I can witter on a bit more if you want - otherwise the important message to take from this is handcrafted loops are often not as effective as taking an algorithm from <algorithm> and applying it.
Cheers,
Ash
|
|
|
|
|
Yeah, The problem I'm running into, is I only have a portion of C programming knowledge. We're only about halfway through the book with this class and this is the final program due tomorrow... er now today. I've been working on it for a while, but trying to get the win conditions spelled out has been quite difficult. I worked on this project almost 12 hours yesterday, and now going to hit it some more today. Hopefully I can get it done!
|
|
|
|
|
Hi,
I'm trying to port a 3d game for Linux into Windows. I'm stuck right now, because the code has the commands ioperm, outb, and fmod which are Linux only. I'm using Visual Studio 2005. There are dlls out there but I don't know how to implement them. I have a screenshot:
http://forum.freegamedev.net/download/file.php?id=416&mode=view[^]
Can you help me?
|
|
|
|
|
|
If it was, I would know. I've been contributing to it (SuperTuxKart) for a year now.
I found the fmod isn't Linux-only... But I try putting double, float, and long double and none of them work.
|
|
|
|
|
fmod must work on Windows .
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
The error you are getting for fmod indicates it can't decide which of the 3 versions of fmod that it should use.
you will need to explicitly declare or cast the type of your variable for the fmod call.
ioperm and outb are for port access on Linux.
ioperm gives access to the serial ports, which you may or may not need to call on Windows based on your security settings.
outb writes a byte to the specified port. You can open a serial port with a call to CreateFile, and specify the name of the port, such as "COM2". Then use WriteFile to write a single byte. Depending on how complicated the serial port access is in the game, you may want to look up the "Communication Functions" such as SetupComm.
Good Luck
|
|
|
|
|
I put in long double, double, and float in front of fmod and none of them work.
outb: you lost me at CreateFile.... I don't know much of anything about programming.
|
|
|
|
|
I get the error "type unexpected". for fmod prefixes. What should I do?
|
|
|
|
|
Hello, I am trying to interact dynamically with a 3rd party application dialog. This dialog has the usual OK and CANCEL buttons and an edit box. I want to be able to set the text in this edit box. I have managed to enumerate the handle of the dialog, but can't see how to find the ID of the edit box in order to get it's handle and thereby set the text. Perhaps someone can point me in the right direction !!
Doug
|
|
|
|
|
You can use the call GetWindow, and use the GW_CHILD flag to start out with. Then test for the type of class of that window with a call to GetClassName. You are looking for the "EDIT" class. When you find a window whose class matches that criteria, you will have the handle to the Edit control.
After testing each handle, if you have not found the correct window, then call for the next child window of the dialog, using the child window handle from the previous call to GetWindow, and this time use the GW_HWNDNEXT flag.
Ex.
HINSTANCE hInst;
HWND hDlg;
TCHAR className[_MAX_PATH];
...
HWND hChildWnd = ::GetWindow(hDlg, GW_CHILD);
while (hChildWnd != NULL)
{
WNDCLASS wndClass;
::GetClassInfo(hChildWnd, className, sizeof(className));
if (0 == ::_tcscmp(className, _T("EDIT"))
{
// This is the window handle that you want.
// Record the window handle here or do your special processing.
...
break;
}
hChildWnd = ::GetWindow(hChildWnd, GW_HWNDNEXT);
}
If there are more than one edit controls on the dialog things get a bit trickier.
You should look at the tool Spy++ that came with Visual Studio, it will allow you to peek at all of the important data regarding the windows, its class type, id etc.
|
|
|
|
|
Hi Paul, What a brilliantly comprehensive answer !
Very many thanks !
Doug
|
|
|
|
|
Hello all;
I write a simple program to calculate quadratic equation with function in c.
<br />
#include <stdio.h><br />
#include <math.h><br />
float solver(float a,float b, float c){<br />
float delta,x1,x2;<br />
delta=(b*b)-4*a*c;<br />
x1=(-b+sqrt(delta))/2*a;<br />
x2=(-b-sqrt(delta))/2*a;<br />
return(x1,x2);<br />
}<br />
void main(){<br />
float a,b,c,d; <br />
printf("a = ");<br />
scanf("%f", &a);<br />
printf("b = ");<br />
scanf("%f", &b);<br />
printf("c = ");<br />
scanf("%f", &c);<br />
printf("%f\n%f",solver(a,b,c));<br />
<br />
}
the result for a=1,b=2,a=1 is
-1.00000
0.00000
and for any other numbers the second result is 0.00000
Where is the problem.
Thanks anyone help me.
|
|
|
|
|
hasani2007 wrote: printf("%f\n%f",solver(a,b,c));
-here you try to print 2 float values but feed printf only with one.
hasani2007 wrote: return(x1,x2);
-this is not the way to return 2 values from a function (i guess this is what you are tryin to do), use output parameters, a struct, global variables, ..., e.g like:
void solver(float a,float b, float c, float &outX1, float &outX2){
...
outX1 = x1;
outX2 = x2;
}
...
float x1, x2;
solver(a,b,c,x1,x2)
printf("%f\n%f",x1,x2);
...
or
struct result
{
float x1;
float x2;
};
result solver(float a,float b, float c){
...
result res;
res.x1 = x1;
res.x2 = x2;
return res;
}
...
result res = solver(a,b,c);
printf("%f\n%f",res.x1,res.x2);
...
> The problem with computers is that they do what you tell them to do and not what you want them to do. <
> Sometimes you just have to hate coding to do it well. <
|
|
|
|
|
I'm not an expert in the details of C/C++, but the solver function definition shows a float should be returned and it appears you're trying to return a tuple.
CQ de W5ALT
Walt Fair, Jr., P. E.
Comport Computing
Specializing in Technical Engineering Software
|
|
|
|
|
Your program to calculate quadratic equations with .
Input MUST have the format:
AX2 + BX + C = 0
EXAMPLE: input the equation
2X2 + 4X -30 = 0 as:
A= 2 B= 4 C= -30
The answers should be 3 and -5.
x1=3
x2=-5
#include <stdio.h>
#include <math.h>
float x1,x2;
bool solver(float a,float b, float c)
{
float delta = sqrt( (b*b) - (4*a*c) );
if (!a) return false;
x1 = ( -b + delta)/(2*a);
x2 = ( -b - delta)/(2*a);
return true;
}
int main()
{
float a=2,
b=4,
c=-30;
if ( solver(a, b ,c) ) printf("x1=%f\nx2=%f\n",x1,x2);
return 0;
}
..
|
|
|
|
|
Please, don't give such a bad solution!!!
I've adjusted it to avoid global variables:
#include <stdio.h>
#include <math.h>
bool solver(float a,float b, float c, float &x1, float &x2)
{
float delta = sqrt( (b*b) - (4*a*c) );
if (!a) return false;
x1 = ( -b + delta)/(2*a);
x2 = ( -b - delta)/(2*a);
return true;
}
int main()
{
float a=2,
b=4,
c=-30;
float x1,x2;
if ( solver(a, b ,c, x1, x2) ) printf("x1=%f\nx2=%f\n",x1,x2);
return 0;
}
|
|
|
|
|
|