点击(此处)折叠或打开
- /*判定扑克的牌型。给5张牌,返回它的牌型,
- *顺子:case 55
- *4个的+1个单张:case 41
- *3个+对子:case 32
- *3个+2个单张:case 311
- *2对+1个单张:case 221
- *1对+3个单张:case 2111
- *5个单张:case 51
- */
- #include <iostream>
- #include <cstdlib>
- using namespace std;
- void sort_cards(const int *cards, int *cards_sorted, int num);
- int is_straight(int *my_cards, int start, int end);//case 55
- int is_4same1(int *my_cards, int start, int end);//case 41
- int is_3same2same(int *my_cards, int start, int end);//case 32
- int
- main(int argc, char *argv[])
- {
- int cards[] = {5, 4, 1, 3, 2};
- int cards_sorted[5];
- int num = 5;
- sort_cards(cards, cards_sorted, num);
- if(is_straight(cards_sorted, 0 , 4))
- cout << "\n cards are straight.55" << endl;
- if(is_4same1(cards_sorted, 0, 4))
- cout << "\n cards are 4same1.41" << endl;
- int result32 = is_3same2same(cards_sorted, 0 ,4);
- switch (result32){
- case 5:
- cout << "\n cards are 3same2same.32" << endl;
- break;
- case 4:
- cout << "\n cards are 2match1different.221" << endl;
- break;
- case 3:
- cout << "\n cards are 3same2different.311" << endl;
- break;
- case 2:
- cout << "\n cards are 1match3different.2111" << endl;
- break;
- case 0:
- cout << "\n cards are 5different.51" << endl;
- break;
- default:
- break;
- }
- return 0;
- }
- /*C++功底不够,还是有很多C的影子*/
- void
- sort_cards(const int *cards, int *cards_sorted, int num){
- int i, j, min_value, min_position, tmp_value;
- for(i = 0; i < num; i++){
- *(cards_sorted + i) = *(cards + i);
- }
- for(i = 0; i < num; i++){
- min_value = *(cards_sorted + i);
- min_position = i;
- for(j = i+1; j < num; j++){
- if(*(cards_sorted + j) < min_value){
- min_value = *(cards_sorted + j);
- min_position = j;
- }
- }
- tmp_value = *(cards_sorted + i);
- *(cards_sorted + i) = min_value;
- *(cards_sorted + min_position) = tmp_value;
- }
- cout << "cards_sorted are:" << endl;
- for(i = 0; i < num; i++){
- cout << *(cards_sorted + i) << " ";
- }
- }
- int
- is_straight(int *my_cards, int start, int end)//case 55
- {
- int i;
- for(i = 0; i < 4; i++){
- if(*(my_cards + start) < 3)
- return 0;
- if(*(my_cards + start + i + 1) - *(my_cards + start + i) != 1)
- return 0;
- }
- return 1;
- }
- int
- is_4same1(int *my_cards, int start, int end)//case 41
- {
- int i, j;
- for(i = start; i < (end -3); i++){
- for(j = 0; j < 3; j++){
- if(*(my_cards + i + j + 1) != *(my_cards + i + j))
- break;
- if(j == 2)
- return 1;
- }
- }
- return 0;
- }
- /*这个函数的设计还是比较巧妙,根据返回值,得到不同的类型。
- */
- int
- is_3same2same(int *my_cards, int start, int end)//case 32
- {
- int i, j;
- int hit3 = 0;
- int hit2 = 0;
- for(i = start; i < end;){
- for(j = 0; j < 2; j++){
- if(*(my_cards + i + j + 1) != *(my_cards + i + j))
- break;
- }
- if(j == 2){
- hit3 += 3;
- i += 3;
- continue;
- }
- if(j == 1){
- hit2 += 2;
- i += 2;
- continue;
- }
- i++;
- }
- return (hit2 + hit3);
- }
- /*还有很多需要改进的地方。真想做个斗地主。或许应该找个斗地主的源码学习下。
- *Look, before I If I don't know the direction, I should do some small things.
- */