tools.hpp

#pragma once
#include<easyx.h>void drawImg(int x, int y,IMAGE *src)
{// 变量初始化DWORD* pwin = GetImageBuffer();           //窗口缓冲区指针DWORD* psrc = GetImageBuffer(src);        //图片缓冲区指针int win_w = getwidth();                   //窗口宽高int win_h = getheight();int src_w = src->getwidth();         //图片宽高int src_h = src->getheight();// 计算贴图的实际长宽int real_w = (x + src_w > win_w) ? win_w - x : src_w;           // 处理超出右边界int real_h = (y + src_h > win_h) ? win_h - y : src_h;            // 处理超出下边界if (x < 0) { psrc += -x;         real_w -= -x;  x = 0; }   // 处理超出左边界if (y < 0) { psrc += (src_w * -y);   real_h -= -y;  y = 0; }   // 处理超出上边界// 修正贴图起始位置pwin += (win_w * y + x);// 实现透明贴图for (int iy = 0; iy < real_h; iy++){for (int ix = 0; ix < real_w; ix++){byte a = (byte)(psrc[ix] >> 24);//计算透明通道的值[0,256) 0为完全透明 255为完全不透明if (a > 100){pwin[ix] = psrc[ix];}}//换到下一行pwin += win_w;psrc += src_w;}
}void drawImg(int x, int y, int dstW, int dstH, IMAGE* src, int srcX, int srcY)
{// 变量初始化DWORD* pwin = GetImageBuffer();           //窗口缓冲区指针DWORD* psrc = GetImageBuffer(src);        //图片缓冲区指针int win_w = getwidth();                   //窗口宽高int win_h = getheight();int src_w = src->getwidth();         //图片宽高int src_h = src->getheight();// 计算贴图的实际长宽int real_w = (x + dstW > win_w) ? win_w - x : dstW;             // 处理超出右边界int real_h = (y + dstH > win_h) ? win_h - y : dstH;              // 处理超出下边界if (x < 0) { psrc += -x;         real_w -= -x;  x = 0; }   // 处理超出左边界if (y < 0) { psrc += (dstW * -y);    real_h -= -y;  y = 0; }   // 处理超出上边界//printf("realw,h(%d,%d)\n", real_w, real_h);// 修正贴图起始位置pwin += (win_w * y + x);// 实现透明贴图for (int iy = 0; iy < real_h; iy++){for (int ix = 0; ix < real_w; ix++){byte a = (byte)(psrc[ix + srcX + srcY * src_w] >> 24);//计算透明通道的值[0,256) 0为完全透明 255为完全不透明if (a > 100){pwin[ix] = psrc[ix + srcX + srcY * src_w];}}//换到下一行pwin += win_w;psrc += src_w;}
}

.cpp

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <easyx.h>
#include <graphics.h>
#include <conio.h>
#include <Windows.h>
#include <mmsystem.h>
#include "tools.hpp"
#pragma comment(lib, "winmm.lib")
//定义全局变量
IMAGE img[55];//定义扑克牌图像数组
IMAGE img_bg;//定义背景图片
IMAGE img_start;//定义开始图片
IMAGE img_user0;//定义用户图片
IMAGE img_farmer1,img_landlord1;//定义地主农民图片
IMAGE img_rob_2,img_notrob_2,img_rob2,img_notrob2;//定义 是否抢与不抢地主的图片
IMAGE img_play2,img_notplay2;//定义出不出牌的图片
IMAGE img_123_2,img_132_2, img_231_2;//定义自动成为地主的提示图片
IMAGE img_left[21];//定义所剩牌数的图片                //定义出牌的特效
IMAGE img_san2,img_sandaiyi2,img_kingbomb2,img_sidaier2,img_plane2;
IMAGE img_bomb2;
IMAGE img_win2,img_lose2;//定义胜利或失败的场面int user1[20] = { 0 };//定义用户1的手牌
int user2[20] = { 0 };//定义用户2的手牌
int user3[20] = { 0 };//定义用户3的手牌
int bottom_card[3] = { 0 };//定义3张底牌
int pile[55] = { 0 };//定义牌堆
int flag_card = 0;//定义标志牌,决定抢地主顺序
int first_rob = 0;//谁获得抢地主的机会
int who_is_landlord = 0;//保存谁是地主
int clicktimes[20] = { 0 };//保存是否被点击
int user1_card_number = 0;//保存玩家一所剩余的牌数
int user2_card_number = 0;//。。
int user3_card_number = 0;//。。
int user1_compare[20] = { 0 };//保存玩家牌的具体大小,例如牌为5-8,这保存为4
int user2_compare[20] = { 0 };//。。
int user3_compare[20] = { 0 };//。。
int temp[20] = { 0 }, temp_img[20] = { 0 }, temp_number = 0, flag = 0;//分别存放已经出的牌,已经出的牌的图像的,出的牌的数量,是否有人未出牌
int temp_card[18] = { 0 }, temp_card_type[15] = { 0 }, temp_card_type_number = 0;//分别存放已经出的牌的大小,已经出的牌的种类,已经出的牌的所有总数
int user1_card[18] = { 0 }, user2_card[18] = { 0 }, user3_card[18] = { 0 };//存放用户的牌的大小
MOUSEMSG m;//定义鼠标
void forword_pile(int i)//i表示从哪一张之后开始移
{int j;for (j = i; j < 54; j++){pile[j] = pile[j + 1];}//牌堆前移,避免产生重复的牌}
void search_flag_card()//查找标志牌在哪位玩家的手上
{int i;for (i = 0; i < 17; i++){if (user1[i] == flag_card){first_rob = 1;break;}if (user2[i] == flag_card){first_rob = 2;break;}if (user3[i] == flag_card){first_rob = 3;break;}}
}
void sort_cards(int* p, int n)//运用选择排序整理手牌
{int i, j, temp, max, maxj;for (i = 0; i < n - 1; i++){max = *(p + i);maxj = i;for (j = i + 1; j < n; j++){if (*(p + j) > max){max = *(p + j);maxj = j;}}temp = *(p + i);*(p + i) = *(p + maxj);*(p + maxj) = temp;}
}
void deal_cards()//发牌
{int i, card_number;i = rand() % 54 + 1;//先拿出3张作为底牌bottom_card[0] = pile[i];forword_pile(i);i = rand() % 53 + 1;bottom_card[1] = pile[i];forword_pile(i);i = rand() % 52 + 1;bottom_card[2] = pile[i];forword_pile(i);//发标志牌,因为不能与底牌重复,否则不能确定谁抢地主,所以放在下面i = rand() % 51 + 1;flag_card = pile[i];//与标志牌重复没关系,所以不需要前移for (card_number = 0; card_number < 17; card_number++)//再每人发17张牌{i = rand() % (51 - card_number * 3) + 1;user1[card_number] = pile[i];forword_pile(i);i = rand() % (51 - card_number * 3 - 1) + 1;user2[card_number] = pile[i];forword_pile(i);i = rand() % (51 - card_number * 3 - 2) + 1;user3[card_number] = pile[i];forword_pile(i);}
}
void load_image()//加载图像
{loadimage(&img[4], _T("梅花3.jpg"));loadimage(&img[8], _T("梅花4.jpg"));loadimage(&img[12], _T("梅花5.jpg"));loadimage(&img[16], _T("梅花6.jpg"));loadimage(&img[20], _T("梅花7.jpg"));loadimage(&img[24], _T("梅花8.jpg"));loadimage(&img[28], _T("梅花9.jpg"));loadimage(&img[32], _T("梅花10.jpg"));loadimage(&img[36], _T("梅花J.jpg"));loadimage(&img[40], _T("梅花Q.jpg"));loadimage(&img[44], _T("梅花K.jpg"));loadimage(&img[48], _T("梅花A.jpg"));loadimage(&img[52], _T("梅花2.jpg"));loadimage(&img[1], _T("黑桃3.jpg"));loadimage(&img[5], _T("黑桃4.jpg"));loadimage(&img[9], _T("黑桃5.jpg"));loadimage(&img[13], _T("黑桃6.jpg"));loadimage(&img[17], _T("黑桃7.jpg"));loadimage(&img[21], _T("黑桃8.jpg"));loadimage(&img[25], _T("黑桃9.jpg"));loadimage(&img[29], _T("黑桃10.jpg"));loadimage(&img[33], _T("黑桃J.jpg"));loadimage(&img[37], _T("黑桃Q.jpg"));loadimage(&img[41], _T("黑桃K.jpg"));loadimage(&img[45], _T("黑桃A.jpg"));loadimage(&img[49], _T("黑桃2.jpg"));loadimage(&img[3], _T("方块3.jpg"));loadimage(&img[7], _T("方块4.jpg"));loadimage(&img[11], _T("方块5.jpg"));loadimage(&img[15], _T("方块6.jpg"));loadimage(&img[19], _T("方块7.jpg"));loadimage(&img[23], _T("方块8.jpg"));loadimage(&img[27], _T("方块9.jpg"));loadimage(&img[31], _T("方块10.jpg"));loadimage(&img[35], _T("方块J.jpg"));loadimage(&img[39], _T("方块Q.jpg"));loadimage(&img[43], _T("方块K.jpg"));loadimage(&img[47], _T("方块A.jpg"));loadimage(&img[51], _T("方块2.jpg"));loadimage(&img[2], _T("红桃3.jpg"));loadimage(&img[6], _T("红桃4.jpg"));loadimage(&img[10], _T("红桃5.jpg"));loadimage(&img[14], _T("红桃6.jpg"));loadimage(&img[18], _T("红桃7.jpg"));loadimage(&img[22], _T("红桃8.jpg"));loadimage(&img[26], _T("红桃9.jpg"));loadimage(&img[30], _T("红桃10.jpg"));loadimage(&img[34], _T("红桃J.jpg"));loadimage(&img[38], _T("红桃Q.jpg"));loadimage(&img[42], _T("红桃K.jpg"));loadimage(&img[46], _T("红桃A.jpg"));loadimage(&img[50], _T("红桃2.jpg"));loadimage(&img[53], _T("小王.jpg"));loadimage(&img[54], _T("大王.jpg"));loadimage(&img[0], _T("牌背.png"), 100, 150);loadimage(&img_bg, _T("背景.jpg"), 1440, 960);loadimage(&img_user0, _T("用户1.png"), 100, 150);loadimage(&img_start, _T("开始.png"), 1440, 960);loadimage(&img_farmer1, _T("农民1.png"), 100, 150);loadimage(&img_landlord1, _T("地主1.png"), 100, 150);loadimage(&img_rob_2, _T("rob_2.jpg"), 100, 50);loadimage(&img_notrob_2, _T("notrob_2.jpg"), 100, 50);loadimage(&img_rob2, _T("rob2.jpg"), 50, 100);loadimage(&img_notrob2, _T("notrob2.jpg"), 50, 100);loadimage(&img_play2, _T("出牌2.jpg"), 100, 50);loadimage(&img_notplay2, _T("不出2.jpg"), 100, 50);loadimage(&img_123_2, _T("1+2=3 2.png"), 500, 100);loadimage(&img_132_2, _T("1+3=2 2.png"), 500, 100);loadimage(&img_231_2, _T("2+3=1 2.png"), 500, 100);loadimage(&img_left[1], _T("1.jpg"), 30, 50);loadimage(&img_left[2], _T("2.jpg"), 30, 50);loadimage(&img_left[3], _T("3.jpg"), 30, 50);loadimage(&img_left[4], _T("4.jpg"), 30, 50);loadimage(&img_left[5], _T("5.jpg"), 30, 50);loadimage(&img_left[6], _T("6.jpg"), 30, 50);loadimage(&img_left[7], _T("7.jpg"), 30, 50);loadimage(&img_left[8], _T("8.jpg"), 30, 50);loadimage(&img_left[9], _T("9.jpg"), 30, 50);loadimage(&img_left[10], _T("10.jpg"), 30, 50);loadimage(&img_left[11], _T("11.jpg"), 30, 50);loadimage(&img_left[12], _T("12.jpg"), 30, 50);loadimage(&img_left[13], _T("13.jpg"), 30, 50);loadimage(&img_left[14], _T("14.jpg"), 30, 50);loadimage(&img_left[15], _T("15.jpg"), 30, 50);loadimage(&img_left[16], _T("16.jpg"), 30, 50);loadimage(&img_left[17], _T("17.jpg"), 30, 50);loadimage(&img_left[18], _T("18.jpg"), 30, 50);loadimage(&img_left[19], _T("19.jpg"), 30, 50);loadimage(&img_left[20], _T("20.jpg"), 30, 50);loadimage(&img_win2, _T("win2.png"),292,139);loadimage(&img_lose2, _T("lose2.png"),292,139);loadimage(&img_san2, _T("san2.png"));loadimage(&img_sidaier2, _T("sidaier2.png"));loadimage(&img_sandaiyi2, _T("sandaiyi2.png"));loadimage(&img_kingbomb2, _T("kingbomb2.png"));loadimage(&img_plane2, _T("plane2.png"));loadimage(&img_bomb2, _T("bomb2.png"));}
void load_music()//加载音乐
{//mciSendString(_T("open music.mp3 alias mymusic"), NULL, 0, NULL);//mciSendString(_T("play mymusic repeat"), NULL, 0, NULL);
}
void show_bottom_image()//显示底牌
{drawImg(560, 50, &img[0]);drawImg(660, 50, &img[0]);//全是牌背drawImg(760, 50, &img[0]);
}
void show_mycard_image_first()//显示手牌一张一张生成的效果
{int i;for (i = 0; i < 17; i++){drawImg(450 + 25 * i, 760, &img[user2[i]]);drawImg(200, 160 + i * 25, &img[0]);drawImg(1200, 160 + i * 25, &img[0]);Sleep(80);}}
void show_mycard_image_after()//直接显示最终的手牌(17张)
{int i;for (i = 0; i < 17; i++){drawImg(450 + 25 * i, 760, &img[user2[i]]);//输出玩家手牌}for (i = 0; i < 17; i++){drawImg(200, 160 + i * 25, &img[0]);//输出左边用户的手牌(全为牌背)}for (i = 0; i < 17; i++){drawImg(1200, 160 + i * 25, &img[0]);//输出右边用户的手牌(全为牌背)}
}
void show_bg_and_user()//输出背景和用户
{drawImg(0, 0, &img_bg);//输出背景drawImg(0, 300, &img_user0);//输出用户1drawImg(300, 760, &img_user0);//输出用户2drawImg(1350, 300, &img_user0);//输出用户3}
void show_flagcard_move()//显示标志牌移动的效果
{int i;for (i = 1; i <= 10; i++)//输出标志牌牌移动效果{show_bg_and_user();//输出背景和用户show_mycard_image_after();//显示最终的手牌(17张)show_bottom_image();//显示底牌if (i == 1){drawImg(660, 400, &img[0]);//一开始先出现在最中间Sleep(1000);}else{drawImg(660 + 30 * i, 400 - 35 * i, &img[flag_card]);//接下来逐渐往右上方移动}Sleep(20);}
}
void case_user1_is_landlord()//玩家一为地主时显示的画面
{int i;drawImg(0, 0, &img_bg);//输出背景drawImg(0, 300, &img_landlord1);//输出用户1drawImg(300, 760, &img_farmer1);//输出用户2drawImg(1350, 300, &img_farmer1);//输出用户3show_bottom_image();//显示底牌drawImg(960, 50, &img[flag_card]);for (i = 17; i < 20; i++)//将底牌给玩家一{user1[i] = bottom_card[i - 17];}sort_cards(user1, 20);//加入手牌之后,再次理牌//显示手牌for (i = 0; i < 17; i++){drawImg(450 + 25 * i, 760, &img[user2[i]]);}for (i = 0; i < 17; i++){drawImg(200, 160 + i * 25, &img[0]);}for (i = 0; i < 17; i++){drawImg(1200, 160 + i * 25, &img[0]);}for (i = 0; i < 3; i++){drawImg(200, 585 + i * 25, &img[0]);Sleep(80);}Sleep(1000);drawImg(560, 50, &img[bottom_card[0]]);//使底牌有掀开的效果drawImg(660, 50, &img[bottom_card[1]]);drawImg(760, 50, &img[bottom_card[2]]);
}
void case_user2_is_landlord()//玩家二为地主时显示的画面
{int i;drawImg(0, 0, &img_bg);//输出背景drawImg(0, 300, &img_farmer1);//输出用户1drawImg(300, 760, &img_landlord1);//输出用户2drawImg(1350, 300, &img_farmer1);//输出用户3show_bottom_image();//显示底牌drawImg(960, 50, &img[flag_card]);for (i = 17; i < 20; i++)//将底牌给玩家二{user2[i] = bottom_card[i - 17];}sort_cards(user2, 20);//加入手牌之后,再次理牌//显示手牌for (i = 0; i < 17; i++){drawImg(200, 160 + i * 25, &img[0]);}for (i = 0; i < 17; i++){drawImg(1200, 160 + i * 25, &img[0]);}for (i = 0; i < 20; i++){drawImg(450 + 25 * i, 760, &img[user2[i]]);Sleep(80);}Sleep(1000);drawImg(560, 50, &img[bottom_card[0]]);drawImg(660, 50, &img[bottom_card[1]]);drawImg(760, 50, &img[bottom_card[2]]);
}
void case_user3_is_landlord()//玩家三为地主时显示的画面
{int i;drawImg(0, 0, &img_bg);//输出背景drawImg(0, 300, &img_farmer1);//输出用户1drawImg(300, 760, &img_farmer1);//输出用户2drawImg(1350, 300, &img_landlord1);//输出用户3show_bottom_image();//显示底牌drawImg(960, 50, &img[flag_card]);for (i = 17; i < 20; i++)//将手牌给玩家三{user3[i] = bottom_card[i - 17];}sort_cards(user3, 20);//加入手牌之后,再次理牌//显示手牌for (i = 0; i < 17; i++){drawImg(450 + 25 * i, 760, &img[user2[i]]);}for (i = 0; i < 17; i++){drawImg(200, 160 + i * 25, &img[0]);}for (i = 0; i < 17; i++){drawImg(1200, 160 + i * 25, &img[0]);}for (i = 0; i < 3; i++){drawImg(1200, 585 + i * 25, &img[0]);Sleep(80);}Sleep(1000);drawImg(560, 50, &img[bottom_card[0]]);drawImg(660, 50, &img[bottom_card[1]]);drawImg(760, 50, &img[bottom_card[2]]);
}
void case_user1_is_landlord_update()//更新用户的手牌
{int i;drawImg(0, 0, &img_bg);//输出背景drawImg(0, 300, &img_landlord1);//输出用户1drawImg(300, 760, &img_farmer1);//输出用户2drawImg(1350, 300, &img_farmer1);//输出用户3drawImg(960, 50, &img[flag_card]);drawImg(560, 50, &img[bottom_card[0]]);drawImg(660, 50, &img[bottom_card[1]]);drawImg(760, 50, &img[bottom_card[2]]);for (i = 0; i < user2_card_number; i++){drawImg(450 + 25 * i, 760 - clicktimes[i] * 25, &img[user2[i]]);}for (i = 0; i < user1_card_number; i++){drawImg(200, 160 + i * 25, &img[0]);}for (i = 0; i < user3_card_number; i++){drawImg(1200, 160 + i * 25, &img[0]);}drawImg(40, 460, &img_left[user1_card_number]);//输出用户所剩余的牌drawImg(950, 850, &img_left[user2_card_number]);drawImg(1390, 460, &img_left[user3_card_number]);
}
void case_user2_is_landlord_update()//更新用户的手牌
{int i;drawImg(0, 0, &img_bg);//输出背景drawImg(0, 300, &img_farmer1);//输出用户1drawImg(300, 760, &img_landlord1);//输出用户2drawImg(1350, 300, &img_farmer1);//输出用户3drawImg(960, 50, &img[flag_card]);drawImg(560, 50, &img[bottom_card[0]]);drawImg(660, 50, &img[bottom_card[1]]);drawImg(760, 50, &img[bottom_card[2]]);for (i = 0; i < user2_card_number; i++){drawImg(450 + 25 * i, 760 - clicktimes[i] * 25, &img[user2[i]]);}for (i = 0; i < user1_card_number; i++){drawImg(200, 160 + i * 25, &img[0]);}for (i = 0; i < user3_card_number; i++){drawImg(1200, 160 + i * 25, &img[0]);}drawImg(40, 460, &img_left[user1_card_number]);drawImg(1050, 850, &img_left[user2_card_number]);drawImg(1390, 460, &img_left[user3_card_number]);
}
void case_user3_is_landlord_update()//更新用户的手牌
{int i;drawImg(0, 0, &img_bg);//输出背景drawImg(0, 300, &img_farmer1);//输出用户1drawImg(300, 760, &img_farmer1);//输出用户2drawImg(1350, 300, &img_landlord1);//输出用户3drawImg(960, 50, &img[flag_card]);drawImg(560, 50, &img[bottom_card[0]]);drawImg(660, 50, &img[bottom_card[1]]);drawImg(760, 50, &img[bottom_card[2]]);for (i = 0; i < user2_card_number; i++){drawImg(450 + 25 * i, 760 - clicktimes[i] * 25, &img[user2[i]]);}for (i = 0; i < user1_card_number; i++){drawImg(200, 160 + i * 25, &img[0]);}for (i = 0; i < user3_card_number; i++){drawImg(1200, 160 + i * 25, &img[0]);}drawImg(40, 460, &img_left[user1_card_number]);drawImg(950, 850, &img_left[user2_card_number]);drawImg(1390, 460, &img_left[user3_card_number]);
}
void temp_card_is_what()//把已经出的牌的特征找出来
{int i, j, k;for (i = 3; i < 18; i++){temp_card[i] = 0; //重置未初值,避免后面改变影响这里}for (i = 0; i < 15; i++){temp_card_type[i] = 0;重置未初值,避免后面改变影响这里}temp_card_type_number = 0;//重置未初值,避免后面改变影响这里for (i = 0; i < temp_number; i++){temp_card[temp[i]]++;//将牌的大小转换成每张牌的数量,比如说有两个3,这temp_card[3]=2;}for (i = 3; i < 18; i++){if (temp_card[i] != 0)//如果拍的数量不等于0,就证明有牌{temp_card_type[temp_card_type_number] = i;//保存已有的牌的种类temp_card_type_number++;//保存种类总数}}for (i = 0; i < temp_card_type_number; i++)//利用冒泡排序,将数量多的牌排在前面,其余未从小到大{for (j = 0; j < temp_card_type_number - 1 - i; j++){if (temp_card[temp_card_type[j]] < temp_card[temp_card_type[j + 1]]){k = temp_card_type[j];temp_card_type[j] = temp_card_type[j + 1];temp_card_type[j + 1] = k;}}}}
int type_is_what()
{int i;if (temp_number == 1)return 1;//出的牌为单牌时,返回为类型一if (temp_number == 2 && temp_card_type_number == 1)return 2;//出的牌为对子时,返回为类型二if (temp_number == 3 && temp_card_type_number == 1)return 3;//出的牌为三个时,返回为类型三if (temp_number == 4 && temp_card_type_number == 1)return 4;//出的牌为炸弹时,返回为类型四if (temp_card_type_number == 2 && (temp_card[16] == 1 && temp_card[17] == 1))return 5;//出的牌为王炸时,返回为类型五if (temp_card_type_number == 2 && (temp_card[temp_card_type[0]] == 3 && temp_card[temp_card_type[1]] == 1))return 6;//出的牌为三带1时,返回为类型六if (temp_card_type_number == 2 && (temp_card[temp_card_type[0]] == 3 && temp_card[temp_card_type[1]] == 2))return 7;//出的牌为三带二时,返回为类型七if (temp_card_type_number == 3 && (temp_card[temp_card_type[0]] == 4 && temp_card[temp_card_type[1]] == 1 && temp_card[temp_card_type[2]] == 1))return 8;//出的牌为炸弹带二单时,返回为类型八if (temp_card_type_number == 3 && (temp_card[temp_card_type[0]] == 4 && temp_card[temp_card_type[1]] == 2 && temp_card[temp_card_type[2]] == 2))return 9;//出的牌为炸弹带二双时,返回为类型九if (temp_card_type_number == 4 && temp_card[temp_card_type[0]] == 3 && temp_card[temp_card_type[1]] == 3 && temp_card[temp_card_type[2]] == 1 && temp_card[temp_card_type[3]] == 1 && (temp_card_type[0] == (temp_card_type[1] - 1)))return 10;//出的牌为飞机带二单时,返回为类型十if (temp_card_type_number == 4 && temp_card[temp_card_type[0]] == 3 && temp_card[temp_card_type[1]] == 3 && temp_card[temp_card_type[2]] == 2 && temp_card[temp_card_type[3]] == 2 && (temp_card_type[0] == (temp_card_type[1] - 1)))return 11;//出的牌为飞机带二双时,返回为类型十一if (temp_card_type_number == temp_number)//出的牌位顺子时,返回位类似十二{for (i = 0; i < temp_number - 1; i++){if (temp[i] != (temp[i + 1] - 1))break;}if (i == (temp_number - 1))return 12;}return 0;//都没有返回则为不合法类型}
void user_change_to_user_compare()
{int i, j;//将用户的手牌转换为牌的大小,例如牌53,为小王,转为17,牌1-4为3,转化为3for (j = 0; j < user1_card_number; j++){i = 0;while (1){if (user1[j] == 53){user1_compare[j] = 16;break;}if (user1[j] == 54){user1_compare[j] = 17;break;}if (user1[j] >= (1 + i * 4) && user1[j] <= (4 + i * 4)){user1_compare[j] = 3 + i;break;}i++;}}for (j = 0; j < user2_card_number; j++){i = 0;while (1){if (user2[j] == 53){user2_compare[j] = 16;break;}if (user2[j] == 54){user2_compare[j] = 17;break;}if (user2[j] >= (1 + i * 4) && user2[j] <= (4 + i * 4)){user2_compare[j] = 3 + i;break;}i++;}}for (j = 0; j < user3_card_number; j++){i = 0;while (1){if (user3[j] == 53){user3_compare[j] = 16;break;}if (user3[j] == 54){user3_compare[j] = 17;break;}if (user3[j] >= (1 + i * 4) && user3[j] <= (4 + i * 4)){user3_compare[j] = 3 + i;break;}i++;}}
}
void update_with_play_card()//在出牌阶段,更新用户的手牌
{int q;switch (who_is_landlord){case 1:case_user1_is_landlord_update(); break;case 2:case_user2_is_landlord_update(); break;case 3:case_user3_is_landlord_update(); break;}for (q = 0; q < temp_number; q++){drawImg(660 + q * 25, 400, &img[temp_img[q]]);}Sleep(1000);
}
void user1_compare_change_to_user1_card()//把用户的牌的大小转为数量
{int i;for (i = 3; i < 18; i++){user1_card[i] = 0;}for (i = 0; i < user1_card_number; i++){user1_card[user1_compare[i]]++;}
}
void user3_compare_change_to_user3_card()
{int i;for (i = 3; i < 18; i++){user3_card[i] = 0;}for (i = 0; i < user3_card_number; i++){user3_card[user3_compare[i]]++;}
}
void user1_deal_and_play_card(int m, int n, int k)
{int q, j;for (q = m; q < n; q++)//k为所要出的牌,m为所要保存出牌数组中的小标,n也是下表,m为起始的保存下标,n为最终的保存下标{for (j = user1_card_number - 1; j >= 0; j--)//遍历手牌{if (user1_compare[j] == k)//找到用出的牌{temp_img[q] = user1[j];//把牌的图像保存temp[q] = user1_compare[j];//把牌的大小保存user1[j] = 0;//置为0表示已经出了user1_compare[j] = 0; // 置为0表示已经出了sort_cards(user1, user1_card_number);//整理手牌sort_cards(user1_compare, user1_card_number);user1_card_number--;//总牌数-1flag = 0;//已经出牌,置为0break;}}}
}
void user3_deal_and_play_card(int m, int n, int k)
{int q, j;for (q = m; q < n; q++){for (j = user3_card_number - 1; j >= 0; j--){if (user3_compare[j] == k){temp_img[q] = user3[j];temp[q] = user3_compare[j];user3[j] = 0;user3_compare[j] = 0;sort_cards(user3, user3_card_number);sort_cards(user3_compare, user3_card_number);user3_card_number--;flag = 0;break;}}}
}
void user1_play_directly()//玩家一直接出牌
{temp_number = 1;//机器人只能出一张temp_img[0] = user1[user1_card_number - 1];//保存出牌的图像temp[0] = user1_compare[user1_card_number - 1];//保存出牌的大小user1[user1_card_number - 1] = 0;//置为0表示已经出牌user1_compare[user1_card_number - 1] = 0;sort_cards(user1, user1_card_number);//整理手牌sort_cards(user1_compare, user1_card_number);user1_card_number--;//总牌数-1flag = 0;//已经出牌,置为0update_with_play_card();//更新手牌以及出牌
}
void user1_play_compare()
{int i, j, k, q, m, k1, n, k2;temp_card_is_what();if (type_is_what() == 1)//判断是否使单牌,建议比对type_is_what()函数看{for (j = user1_card_number - 1; j >= 0; j--)//如果时单牌,怎么出{if (user1_compare[j] > temp[0]){temp_number = 1;temp_img[0] = user1[j];temp[0] = user1_compare[j];user1[j] = 0;user1_compare[j] = 0;sort_cards(user1, user1_card_number);sort_cards(user1_compare, user1_card_number);user1_card_number--;flag = 0;update_with_play_card();break;}}if (j == -1)flag++;}if (type_is_what() == 2)//同理,建议比对type_is_what()函数看{user1_compare_change_to_user1_card();for (i = 3; i < 18; i++){if (user1_card[i] >= 2 && i > temp[0]){k = i;temp_number = 2;user1_deal_and_play_card(0, temp_number, k);update_with_play_card();break;}}if (i == 18)flag++;}if (type_is_what() == 3){user1_compare_change_to_user1_card();for (i = 3; i < 18; i++){if (user1_card[i] >= 3 && i > temp[0]){k = i;temp_number = 3;user1_deal_and_play_card(0, temp_number, k);update_with_play_card();drawImg(500, 400, &img_san2);Sleep(100);break;}}if (i == 18)flag++;}if (type_is_what() == 4){user1_compare_change_to_user1_card();for (i = 3; i < 18; i++){if (user1_card[i] >= 4 && i > temp[0]){k = i;temp_number = 4;user1_deal_and_play_card(0, temp_number, k);update_with_play_card();drawImg(500, 400, &img_bomb2);Sleep(100);break;}}if (i == 18)flag++;}if (type_is_what() == 5){flag++;}if (type_is_what() == 6){user1_compare_change_to_user1_card();for (i = 3; i < 18; i++){if (user1_card[i] >= 3 && i > temp_card_type[0]){k = i;for (m = 3; m < 18; m++){if (m != k && user1[m] >= 1){k1 = m;temp_number = 3;user1_deal_and_play_card(0, temp_number, k);temp_number++;user1_deal_and_play_card(3, temp_number, k1);update_with_play_card();drawImg(500, 400, &img_sandaiyi2);Sleep(100);break;}}if (m < 18)break;}}if (i == 18)flag++;}if (type_is_what() == 7){user1_compare_change_to_user1_card();for (i = 3; i < 18; i++){if (user1_card[i] >= 3 && i > temp_card_type[0]){k = i;for (m = 3; m < 18; m++){if (m != k && user1[m] >= 2){k1 = m;temp_number = 3;user1_deal_and_play_card(0, temp_number, k);temp_number++;temp_number++;user1_deal_and_play_card(3, temp_number, k1);update_with_play_card();break;}}if (m < 18)break;}}if (i == 18)flag++;}if (type_is_what() == 8){user1_compare_change_to_user1_card();for (i = 3; i < 18; i++){if (user1_card[i] >= 4 && i > temp_card_type[0]){k = i;for (m = 3; m < 18; m++){if (m != k && user1[m] >= 1){k1 = m;for (n = 3; n < 18; n++){if (n != k && n != k1 && user1[n] >= 1){k2 = n;temp_number = 4;user1_deal_and_play_card(0, temp_number, k);temp_number++;user1_deal_and_play_card(4, temp_number, k1);temp_number++;user1_deal_and_play_card(5, temp_number, k2);update_with_play_card();break;}}if (n < 18)break;}}if (m < 18)break;}}if (i == 18)flag++;}if (type_is_what() == 9){user1_compare_change_to_user1_card();for (i = 3; i < 18; i++){if (user1_card[i] >= 4 && i > temp_card_type[0]){k = i;for (m = 3; m < 18; m++){if (m != k && user1[m] >= 2){k1 = m;for (n = 3; n < 18; n++){if (n != k && n != k1 && user1[n] >= 2){k2 = n;temp_number = 4;user1_deal_and_play_card(0, temp_number, k);temp_number++;temp_number++;user1_deal_and_play_card(4, temp_number, k1);temp_number++;temp_number++;user1_deal_and_play_card(6, temp_number, k2);update_with_play_card();drawImg(500, 400, &img_sidaier2);Sleep(100);break;}}if (n < 18)break;}}if (m < 18)break;}}if (i == 18)flag++;}if (type_is_what() == 10){user1_compare_change_to_user1_card();for (i = 3; i < 18; i++){if (user1_card[i] >= 3 && i > temp_card_type[0] && user1_card[i + 1] >= 3){k = i;for (m = 3; m < 18; m++){if (m != k && m != (k + 1) && user1[m] >= 1){k1 = m;for (n = 3; n < 18; n++){if (n != k && n != k1 && n != (k + 1) && user1[n] >= 1){k2 = n;temp_number = 3;user1_deal_and_play_card(0, temp_number, k);temp_number++;temp_number++;temp_number++;user1_deal_and_play_card(3, temp_number, k + 1);temp_number++;user1_deal_and_play_card(6, temp_number, k1);temp_number++;user1_deal_and_play_card(7, temp_number, k2);update_with_play_card();drawImg(500, 400, &img_plane2);Sleep(100);break;}}if (n < 18)break;}}if (m < 18)break;}}if (i == 18)flag++;}if (type_is_what() == 11){user1_compare_change_to_user1_card();for (i = 3; i < 18; i++){if (user1_card[i] >= 3 && i > temp_card_type[0] && user1_card[i + 1] >= 3){k = i;for (m = 3; m < 18; m++){if (m != k && m != (k + 1) && user1[m] >= 2){k1 = m;for (n = 3; n < 18; n++){if (n != k && n != k1 && n != (k + 1) && user1[n] >= 2){k2 = n;temp_number = 3;user1_deal_and_play_card(0, temp_number, k);temp_number++;temp_number++;temp_number++;user1_deal_and_play_card(3, temp_number, k + 1);temp_number++;temp_number++;user1_deal_and_play_card(6, temp_number, k1);temp_number++;temp_number++;user1_deal_and_play_card(8, temp_number, k2);update_with_play_card();drawImg(500, 400, &img_plane2);Sleep(100);break;}}if (n < 18)break;}}if (m < 18)break;}}if (i == 18)flag++;}if (type_is_what() == 12){user1_compare_change_to_user1_card();for (i = temp[0] + 1; i < 18 - temp_number - 2; i++){for (j = i; j < i + temp_number; j++){if (user1_card[j] < 1)break;}if (j == (i + temp_number)){for (q = 0; q < temp_number; q++){user1_deal_and_play_card(q, q + 1, i + q);}update_with_play_card();break;}}if (i == (18 - temp_number - 2))flag++;}
}
void user2_play_directly()
{int i;while (1)//死循环直至人输入{//drawImg(650, 670, &img_play1);drawImg(650, 670, &img_play2);//输出框架,只能出牌,不能不出m = GetMouseMsg();if (m.uMsg == WM_LBUTTONDOWN)//判断是否点击,点击时牌上移,点到出牌时退出{if (m.x >= 650 && m.x <= 750 && m.y >= 670 && m.y <= 720)break;if (m.x >= 450 && m.x <= (550 + (user2_card_number - 1) * 25)){if (m.x <= (450 + (user2_card_number - 1) * 25) && m.y >= (760 - clicktimes[(m.x - 450) / 25] * 25) && m.y <= (910 - clicktimes[(m.x - 450) / 25] * 25))clicktimes[(m.x - 450) / 25] = (clicktimes[(m.x - 450) / 25] + 1) % 2;else if (m.x > (450 + (user2_card_number - 1) * 25) && m.y >= (760 - clicktimes[16] * 25) && m.y <= (910 - clicktimes[16] * 25))clicktimes[user2_card_number - 1] = (clicktimes[user2_card_number - 1] + 1) % 2;}switch (who_is_landlord)//输出更新之后的牌{case 1:case_user1_is_landlord_update(); break;case 2:case_user2_is_landlord_update(); break;case 3:case_user3_is_landlord_update(); break;}for (i = 0; i < temp_number; i++){drawImg(660 + i * 25, 400, &img[temp_img[i]]);//与最开始的出牌不同,前面以及有人出牌}}}temp_number = 0;//置为0,使下面的代码成立for (i = user2_card_number - 1; i >= 0; i--){if (clicktimes[i] == 1)//如果牌时上移的,就代表时要出的{temp_img[temp_number] = user2[i];temp[temp_number] = user2_compare[i];user2[i] = 0;user2_compare[i] = 0;flag = 0;clicktimes[i] = 0;temp_number++;}}sort_cards(user2, user2_card_number);sort_cards(user2_compare, user2_card_number);user2_card_number -= temp_number;update_with_play_card();temp_card_is_what();if (type_is_what() == 3)//判断类形,输出效果{drawImg(500, 400, &img_san2);}if (type_is_what() == 4){drawImg(500, 400, &img_bomb2);}if (type_is_what() == 5){drawImg(500, 400, &img_kingbomb2);}if (type_is_what() == 6){drawImg(500, 400, &img_sandaiyi2);}if (type_is_what() == 9){drawImg(500, 400, &img_sidaier2);}if (type_is_what() == 10 || type_is_what() == 11){drawImg(500, 400, &img_plane2);}Sleep(100);
}
void user2_play_compare()
{int i, state = 0;while (1){drawImg(550, 670, &img_play2);drawImg(750, 670, &img_notplay2);m = GetMouseMsg();if (m.uMsg == WM_LBUTTONDOWN){if (m.x >= 550 && m.x <= 650 && m.y >= 670 && m.y <= 720){state = 1;break;}if (m.x >= 750 && m.x <= 850 && m.y >= 670 && m.y <= 720){state = 0;break;}if (m.x >= 450 && m.x <= (550 + (user2_card_number - 1) * 25)){if (m.x <= (450 + (user2_card_number - 1) * 25) && m.y >= (760 - clicktimes[(m.x - 450) / 25] * 25) && m.y <= (910 - clicktimes[(m.x - 450) / 25] * 25))clicktimes[(m.x - 450) / 25] = (clicktimes[(m.x - 450) / 25] + 1) % 2;else if (m.x > (450 + (user2_card_number - 1) * 25) && m.y >= (760 - clicktimes[16] * 25) && m.y <= (910 - clicktimes[16] * 25))clicktimes[user2_card_number - 1] = (clicktimes[user2_card_number - 1] + 1) % 2;}switch (who_is_landlord){case 1:case_user1_is_landlord_update(); break;case 2:case_user2_is_landlord_update(); break;case 3:case_user3_is_landlord_update(); break;}for (i = 0; i < temp_number; i++){drawImg(660 + i * 25, 400, &img[temp_img[i]]);}}}if (state == 1){temp_number = 0;for (i = user2_card_number - 1; i >= 0; i--){if (clicktimes[i] == 1){temp_img[temp_number] = user2[i];temp[temp_number] = user2_compare[i];user2[i] = 0;user2_compare[i] = 0;flag = 0;clicktimes[i] = 0;temp_number++;}}sort_cards(user2, user2_card_number);sort_cards(user2_compare, user2_card_number);user2_card_number -= temp_number;}else if (state == 0){flag++;}update_with_play_card();temp_card_is_what();if (type_is_what() == 3){drawImg(500, 400, &img_san2);}if (type_is_what() == 4){drawImg(500, 400, &img_bomb2);}if (type_is_what() == 5){drawImg(500, 400, &img_kingbomb2);}if (type_is_what() == 6){drawImg(500, 400, &img_sandaiyi2);}if (type_is_what() == 9){drawImg(500, 400, &img_sidaier2);}if (type_is_what() == 10 || type_is_what() == 11){drawImg(500, 400, &img_plane2);}Sleep(100);
}
void user3_play_directly()
{temp_number = 1;temp_img[0] = user3[user3_card_number - 1];temp[0] = user3_compare[user3_card_number - 1];user3[user3_card_number - 1] = 0;user3_compare[user3_card_number - 1] = 0;sort_cards(user3, user3_card_number);sort_cards(user3_compare, user3_card_number);user3_card_number--;flag = 0;update_with_play_card();
}
void user3_play_compare()
{int i, j, k, q, m, k1, n, k2;temp_card_is_what();if (type_is_what() == 1){for (j = user3_card_number - 1; j >= 0; j--){if (user3_compare[j] > temp[0]){temp_number = 1;temp_img[0] = user3[j];temp[0] = user3_compare[j];user3[j] = 0;user3_compare[j] = 0;sort_cards(user3, user3_card_number);sort_cards(user3_compare, user3_card_number);user3_card_number--;flag = 0;update_with_play_card();break;}}if (j == -1)flag++;}if (type_is_what() == 2){user3_compare_change_to_user3_card();for (i = 3; i < 18; i++){if (user3_card[i] >= 2 && i > temp[0]){k = i;temp_number = 2;user3_deal_and_play_card(0, temp_number, k);update_with_play_card();break;}}if (i == 18)flag++;}if (type_is_what() == 3){user3_compare_change_to_user3_card();for (i = 3; i < 18; i++){if (user3_card[i] >= 3 && i > temp[0]){k = i;temp_number = 3;user3_deal_and_play_card(0, temp_number, k);update_with_play_card();drawImg(500, 400, &img_san2);Sleep(100);break;}}if (i == 18)flag++;}if (type_is_what() == 4){user3_compare_change_to_user3_card();for (i = 3; i < 18; i++){if (user3_card[i] >= 4 && i > temp[0]){k = i;temp_number = 4;user3_deal_and_play_card(0, temp_number, k);update_with_play_card();drawImg(500, 400, &img_bomb2);Sleep(100);break;}}if (i == 18)flag++;}if (type_is_what() == 5){flag++;}if (type_is_what() == 6){user3_compare_change_to_user3_card();for (i = 3; i < 18; i++){if (user3_card[i] >= 3 && i > temp_card_type[0]){k = i;for (m = 3; m < 18; m++){if (m != k && user3[m] >= 1){k1 = m;temp_number = 3;user3_deal_and_play_card(0, temp_number, k);temp_number++;user3_deal_and_play_card(3, temp_number, k1);update_with_play_card();drawImg(500, 400, &img_sandaiyi2);Sleep(100);break;}}if (m < 18)break;}}if (i == 18)flag++;}if (type_is_what() == 7){user3_compare_change_to_user3_card();for (i = 3; i < 18; i++){if (user3_card[i] >= 3 && i > temp_card_type[0]){k = i;for (m = 3; m < 18; m++){if (m != k && user3[m] >= 2){k1 = m;temp_number = 3;user3_deal_and_play_card(0, temp_number, k);temp_number++;temp_number++;user3_deal_and_play_card(3, temp_number, k1);update_with_play_card();break;}}if (m < 18)break;}}if (i == 18)flag++;}if (type_is_what() == 8){user3_compare_change_to_user3_card();for (i = 3; i < 18; i++){if (user3_card[i] >= 4 && i > temp_card_type[0]){k = i;for (m = 3; m < 18; m++){if (m != k && user3[m] >= 1){k1 = m;for (n = 3; n < 18; n++){if (n != k && n != k1 && user3[n] >= 1){k2 = n;temp_number = 4;user3_deal_and_play_card(0, temp_number, k);temp_number++;user3_deal_and_play_card(4, temp_number, k1);temp_number++;user3_deal_and_play_card(5, temp_number, k2);update_with_play_card();break;}}if (n < 18)break;}}if (m < 18)break;}}if (i == 18)flag++;}if (type_is_what() == 9){user3_compare_change_to_user3_card();for (i = 3; i < 18; i++){if (user3_card[i] >= 4 && i > temp_card_type[0]){k = i;for (m = 3; m < 18; m++){if (m != k && user3[m] >= 2){k1 = m;for (n = 3; n < 18; n++){if (n != k && n != k1 && user3[n] >= 2){k2 = n;temp_number = 4;user3_deal_and_play_card(0, temp_number, k);temp_number++;temp_number++;user3_deal_and_play_card(4, temp_number, k1);temp_number++;temp_number++;user3_deal_and_play_card(6, temp_number, k2);update_with_play_card();drawImg(500, 400, &img_sidaier2);Sleep(100);break;}}if (n < 18)break;}}if (m < 18)break;}}if (i == 18)flag++;}if (type_is_what() == 10){user3_compare_change_to_user3_card();for (i = 3; i < 18; i++){if (user3_card[i] >= 3 && i > temp_card_type[0] && user3_card[i + 1] >= 3){k = i;for (m = 3; m < 18; m++){if (m != k && m != (k + 1) && user3[m] >= 1){k1 = m;for (n = 3; n < 18; n++){if (n != k && n != (k + 1) && n != k1 && user3[n] >= 1){k2 = n;temp_number = 3;user3_deal_and_play_card(0, temp_number, k);temp_number++;temp_number++;temp_number++;user3_deal_and_play_card(3, temp_number, k + 1);temp_number++;user3_deal_and_play_card(6, temp_number, k1);temp_number++;user3_deal_and_play_card(7, temp_number, k2);update_with_play_card();drawImg(500, 400, &img_plane2);Sleep(100);break;}}if (n < 18)break;}}if (m < 18)break;}}if (i == 18)flag++;}if (type_is_what() == 11){user3_compare_change_to_user3_card();for (i = 3; i < 18; i++){if (user3_card[i] >= 3 && i > temp_card_type[0] && user3_card[i + 1] >= 3){k = i;for (m = 3; m < 18; m++){if (m != k && m != (k + 1) && user3[m] >= 2){k1 = m;for (n = 3; n < 18; n++){if (n != k && n != (k + 1) && n != k1 && user3[n] >= 2){k2 = n;temp_number = 3;user3_deal_and_play_card(0, temp_number, k);temp_number++;temp_number++;temp_number++;user3_deal_and_play_card(3, temp_number, k + 1);temp_number++;temp_number++;user3_deal_and_play_card(6, temp_number, k1);temp_number++;temp_number++;user3_deal_and_play_card(8, temp_number, k2);update_with_play_card();drawImg(500, 400, &img_plane2);Sleep(100);break;}}if (n < 18)break;}}if (m < 18)break;}}if (i == 18)flag++;}if (type_is_what() == 12){user3_compare_change_to_user3_card();for (i = temp[0] + 1; i < 18 - temp_number - 2; i++){for (j = i; j < i + temp_number; j++){if (user3_card[j] < 1)break;}if (j == (i + temp_number)){for (q = 0; q < temp_number; q++){user3_deal_and_play_card(q, q + 1, q + i);}update_with_play_card();break;}}if (i == (18 - temp_number - 2))flag++;}
}
void init()//初始化,为游戏启动做准备工作
{int i;for (i = 1; i < 55; i++){pile[i] = i;//初始化牌堆}srand((unsigned int)time(NULL));//使发牌随机load_image();//加载图片load_music();//加载音乐并播放deal_cards();//发牌sort_cards(user1, 17);//理牌sort_cards(user2, 17);//理牌sort_cards(user3, 17);//理牌
}
void init_show()//显示选地主前的全部画面
{int i;drawImg(0, 0, &img_start);//输出开始界面while (1)//判断是否点击屏幕{m = GetMouseMsg();if (m.uMsg == WM_LBUTTONDOWN){break;}}show_bg_and_user();//显示背景和用户show_mycard_image_first();//第一次显示手牌,一张张出来。show_bottom_image();//显示底牌show_flagcard_move();//显示标志牌移动效果}
void choose_landlord_show()//显示抢地主的过程画面
{search_flag_card();//查询哪位玩家获得了标志牌if (first_rob == 1){if (rand() % 2)//随机数为1,玩家一即抢得地主{//drawImg(320, 350, &img_rob1);//显示玩家一的抢地主画面drawImg(320, 350, &img_rob2);//显示玩家一的抢地主画面Sleep(1000);who_is_landlord = 1;//保存谁是地主}else//顺延至下一位{drawImg(320, 350, &img_notrob2);//显示玩家一的不抢地主画面Sleep(1000);//输出抢地主与不抢的框架,供真人玩家点击drawImg(550, 690, &img_rob_2);//显示玩家二的抢地主选项drawImg(750, 690, &img_notrob_2);//显示玩家二的不抢地主选项while (1){m = GetMouseMsg();if (m.uMsg == WM_LBUTTONDOWN)//检测鼠标点击事件{if (m.x >= 550 && m.x <= 650 && m.y >= 690 && m.y <= 740)//如果点击了抢地主的选项{//消除框架show_bg_and_user();//展示背景和用户show_bottom_image();//展示底牌drawImg(960, 50, &img[flag_card]);//展示标志牌show_mycard_image_after();//展示不移动的手牌drawImg(320, 350, &img_notrob2);//显示玩家一的不抢地主画面drawImg(650, 640, &img_rob_2);//显示玩家二抢地主的画面Sleep(1000);who_is_landlord = 2;//保存谁是地主}else if (m.x >= 750 && m.x <= 850 && m.y >= 690 && m.y <= 740){//消除框架show_bg_and_user();//展示背景和用户show_bottom_image();//展示底牌drawImg(960, 50, &img[flag_card]);//展示标志牌show_mycard_image_after();//展示不移动的手牌drawImg(320, 350, &img_notrob2);//显示玩家一的不抢地主画面drawImg(650, 640, &img_notrob_2);//显示玩家二不抢地主的画面Sleep(1000);drawImg(500, 400, &img_123_2);Sleep(1000);who_is_landlord = 3;//保存谁是地主}//鼠标如果做出选择,退出循环if (m.x >= 550 && m.x <= 650 && m.y >= 690 && m.y <= 740 || m.x >= 750 && m.x <= 850 && m.y >= 690 && m.y <= 740)break;}}}}if (first_rob == 2){//输出抢地主与不抢的框架,供真人玩家点击drawImg(550, 690, &img_rob_2);drawImg(750, 690, &img_notrob_2);while (1){m = GetMouseMsg();if (m.uMsg == WM_LBUTTONDOWN)//判断鼠标点击事件{if (m.x >= 550 && m.x <= 650 && m.y >= 690 && m.y <= 740)//如果点击到了抢地主的选项{//消除框架show_bg_and_user();show_bottom_image();drawImg(960, 50, &img[flag_card]);show_mycard_image_after();drawImg(650, 640, &img_rob_2);//输出玩家二的抢地主画面Sleep(1000);who_is_landlord = 2;}else if (m.x >= 750 && m.x <= 850 && m.y >= 690 && m.y <= 740)//如果点击到了不抢地主的选项{//消除框架show_bg_and_user();show_bottom_image();drawImg(960, 50, &img[flag_card]);show_mycard_image_after();drawImg(650, 640, &img_notrob_2);//输出玩家二的不抢地主画面Sleep(1000);if (rand() % 2)//随机数为1,玩家三即抢得地主{drawImg(1120, 350, &img_rob2);//输出玩家三抢地主的画面Sleep(1000);who_is_landlord = 3;}else{drawImg(1120, 350, &img_notrob2);//输出玩家三不抢地主的画面Sleep(1000);drawImg(500, 400, &img_231_2);Sleep(1000);who_is_landlord = 1;}}//鼠标如果做出选择,退出循环if (m.x >= 550 && m.x <= 650 && m.y >= 690 && m.y <= 740 || m.x >= 750 && m.x <= 850 && m.y >= 690 && m.y <= 740)break;}}}if (first_rob == 3){if (rand() % 2)//随机数为1,玩家三即抢得地主{drawImg(1120, 350, &img_rob2);//输出玩家三抢地主的画面Sleep(1000);who_is_landlord = 3;}else{drawImg(1120, 350, &img_notrob2);//输出玩家三不抢地主的画面Sleep(1000);if (rand() % 2)//随机数为1,玩家一即抢得地主{drawImg(320, 350, &img_rob2);//输出玩家一抢地主的画面Sleep(1000);who_is_landlord = 1;}else{drawImg(320, 350, &img_notrob2);//输出玩家一不抢地主的画面Sleep(1000);drawImg(500, 400, &img_132_2);Sleep(1000);who_is_landlord = 2;}}}switch (who_is_landlord)//展示成为地主的画面{case 1: case_user1_is_landlord(); break;case 2: case_user2_is_landlord(); break;case 3: case_user3_is_landlord(); break;}
}
void with_input_show()
{int  i;if (who_is_landlord == 1){user1_card_number = 20;user2_card_number = 17;user3_card_number = 17;user_change_to_user_compare();//将全部用户的手牌转化为直接大小的牌,比如说1-4转化为3user1_play_directly();//玩家一直接出牌while (1){if (flag == 2)//flag中存放之前是否有人未出牌,如果有2次未出,这次直接为这位玩家获得出牌权{user2_play_directly();//玩家二直接出牌}else{user2_play_compare();//玩家二接牌}if (user1_card_number == 0 || user2_card_number == 0 || user3_card_number == 0)//判断是否有人出完全部牌{if (user2_card_number == 0 || user3_card_number == 0)//获胜,输出胜利画面{drawImg(500, 400, &img_win2);}else//失败输出失败画面{drawImg(500, 400, &img_lose2);}break;}if (flag == 2){user3_play_directly();}else{user3_play_compare();}if (user1_card_number == 0 || user2_card_number == 0 || user3_card_number == 0){if (user2_card_number == 0 || user3_card_number == 0){drawImg(500, 400, &img_win2);}else{drawImg(500, 400, &img_lose2);}break;}if (flag == 2){user1_play_directly();}else{user1_play_compare();}if (user1_card_number == 0 || user2_card_number == 0 || user3_card_number == 0){if (user2_card_number == 0 || user3_card_number == 0){drawImg(500, 400, &img_win2);}else{drawImg(500, 400, &img_lose2);}break;}}}else if (who_is_landlord == 2){user1_card_number = 17;user2_card_number = 20;user3_card_number = 17;user_change_to_user_compare();while (1)//由于玩家二率先出牌的话,场面上是没有中间已经出的牌的,但是输出已经出的牌在函数中间,所以不能使用函数{         //如不懂 可以仔细看下面代码与函数中的区别//下面代码将在函数中介绍,请到函数中看drawImg(650, 670, &img_play2);m = GetMouseMsg();if (m.uMsg == WM_LBUTTONDOWN){if (m.x >= 650 && m.x <= 750 && m.y >= 670 && m.y <= 720)break;if (m.x >= 450 && m.x <= (550 + (user2_card_number - 1) * 25)){if (m.x <= (450 + (user2_card_number - 1) * 25) && m.y >= (760 - clicktimes[(m.x - 450) / 25] * 25) && m.y <= (910 - clicktimes[(m.x - 450) / 25] * 25))clicktimes[(m.x - 450) / 25] = (clicktimes[(m.x - 450) / 25] + 1) % 2;else if (m.x > (450 + (user2_card_number - 1) * 25) && m.y >= (760 - clicktimes[16] * 25) && m.y <= (910 - clicktimes[16] * 25))clicktimes[user2_card_number - 1] = (clicktimes[user2_card_number - 1] + 1) % 2;}switch (who_is_landlord){case 1:case_user1_is_landlord_update(); break;case 2:case_user2_is_landlord_update(); break;case 3:case_user3_is_landlord_update(); break;}}}temp_number = 0;for (i = user2_card_number - 1; i >= 0; i--){if (clicktimes[i] == 1){temp_img[temp_number] = user2[i];temp[temp_number] = user2_compare[i];user2[i] = 0;user2_compare[i] = 0;flag = 0;clicktimes[i] = 0;temp_number++;}}sort_cards(user2, user2_card_number);sort_cards(user2_compare, user2_card_number);user2_card_number -= temp_number;update_with_play_card();temp_card_is_what();if (type_is_what() == 3){drawImg(500, 400, &img_san2);}if (type_is_what() == 4){drawImg(500, 400, &img_bomb2);}if (type_is_what() == 5){drawImg(500, 400, &img_kingbomb2);}if (type_is_what() == 6){drawImg(500, 400, &img_sandaiyi2);}if (type_is_what() == 9){drawImg(500, 400, &img_sidaier2);}if (type_is_what() == 10 || type_is_what() == 11){drawImg(500, 400, &img_plane2);}Sleep(100);while (1){if (flag == 2){user3_play_directly();}else{user3_play_compare();}if (user1_card_number == 0 || user2_card_number == 0 || user3_card_number == 0){if (user2_card_number == 0){drawImg(500, 400, &img_win2);}else{drawImg(500, 400, &img_lose2);}break;}if (flag == 2){user1_play_directly();}else{user1_play_compare();}if (user1_card_number == 0 || user2_card_number == 0 || user3_card_number == 0){if (user2_card_number == 0){drawImg(500, 400, &img_win2);}else{drawImg(500, 400, &img_lose2);}break;}if (flag == 2){user2_play_directly();}else{user2_play_compare();}if (user1_card_number == 0 || user2_card_number == 0 || user3_card_number == 0){if (user2_card_number == 0){drawImg(500, 400, &img_win2);}else{drawImg(500, 400, &img_lose2);}break;}}}else if (who_is_landlord == 3){user1_card_number = 17;user2_card_number = 17;user3_card_number = 20;user_change_to_user_compare();user3_play_directly();while (1){if (flag == 2){user1_play_directly();}else{user1_play_compare();}if (user1_card_number == 0 || user2_card_number == 0 || user3_card_number == 0){if (user1_card_number == 0 || user2_card_number == 0){drawImg(500, 400, &img_win2);}else{drawImg(500, 400, &img_lose2);}break;}if (flag == 2){user2_play_directly();}else{user2_play_compare();}if (user1_card_number == 0 || user2_card_number == 0 || user3_card_number == 0){if (user1_card_number == 0 || user2_card_number == 0){drawImg(500, 400, &img_win2);}else{drawImg(500, 400, &img_lose2);}break;}if (flag == 2){user3_play_directly();}else{user3_play_compare();}if (user1_card_number == 0 || user2_card_number == 0 || user3_card_number == 0){if (user1_card_number == 0 || user2_card_number == 0){drawImg(500, 400, &img_win2);}else{drawImg(500, 400, &img_lose2);}break;}}}
}
int main()
{initgraph(1440, 960);//生成画布大小为1440×960init();//初始化,为游戏启动做准备工作while (1){init_show();//显示选地主前的全部画面 choose_landlord_show();//显示抢地主的过程画面with_input_show();//显示出牌阶段的画面Sleep(3000);}_getch();//使程序不会马上退出closegraph();//关闭画布
}

Easyx-----c语言实现斗地主相关推荐

  1. python实现实例_用python语言实现斗地主基础版-案例

    Talk is cheap, show me code!(屁话少说,放码过来) """ 案例斗地主分析: 1.扑克牌作为对象呈现 2.创建未发牌的牌堆的列表 3.创建三个 ...

  2. C语言:斗地主发牌器

    思想: 一副扑克牌共有54张,大小王各一张,每个花色各13张,花色共有4种,黑桃.红桃.方块.梅花,13*4+2=52+2=54,对就是这样,没错啦.玩斗地主会有3人参与,先从整副牌中拿出3张分给叫地 ...

  3. 集合框架练习—使用JAVA语言模拟斗地主洗牌、发牌并对牌进行排序案例代码。

    未排序前: package File;import java.util.ArrayList; import java.util.Collections;public class Poker {/*** ...

  4. C语言:斗地主发牌程序

    题目来源仍然是小学期,就当娱乐 贴代码: #include<stdio.h> #include<stdlib.h> #include<time.h> //函数声明 ...

  5. 保姆级零基础 C 语言学习路线,万字总结!

    从大学接触 C 语言编程,工作之后一直从事互联网 C/C++ 后台开发工作,粗略算下来有 10 多年经验了(但是年限也并不能代表什么),只能说对 C 语言学习有一些经验可以分享给初学者,让你少走一些弯 ...

  6. 有哪些比较流行的 C、C++和Java 的入门级项目?

    学习编程语言除了看书看视频,还需要找一些适合自己的开源项目,本文给大家安排了C.C++.JAVA相关的开源项目,不废话直接开车! 神级编程网站,堪称程序员的充电站,我给你找好了不能错过_程序员编程指南 ...

  7. Android 仿UC浏览器详情页评论弹框效果

    大概就这种效果 额,突然发现UC被我卸载了,这个是QQ浏览器的效果,不过都一样,如果当前页面不是全屏的话,把根布局设为相对布局,然后设置评论布局为处于底部,这样在点击评论时弹开键盘会触发布局重绘,底部 ...

  8. 人形图案c语言程序_做游戏,学编程(C语言) 7 学习EasyX图形交互功能----flappy bird源代码...

    经过之前的学习,我们基本掌握了开发小游戏所需要的语法知识和搭建方法,但是基础C语言的可视化与交互功能实在是太弱了 . 利用免费的EasyX插件,我们可以快速上手,简单实现很酷的视觉效果 . EasyX ...

  9. c语言图形库三角形,Flappy Bird C语言实现及C图形库Easyx的使用

    学习Eaxy X图形库后我的成果: 花了一周时间做出并完善了Flappy Bird,目前功能如下: 1. 背景的显示 2. 加入小鸟image 3. 小鸟自由下落,按空格键/鼠标右键后上升 4. 加入 ...

最新文章

  1. 【建模必备】遗传算法的基本原理与步骤(交叉)
  2. Matlab 区域扫描,30+行Matlab代码实现文件扫描
  3. 用 Redis 实现分布式锁(分析)
  4. 关于DNS服务中查询域名的命令
  5. FPGA的ip核之概念和分类
  6. 前端学习(2625):vs安装
  7. JAVA获得天气json数据的方法,获取从天气预报接口返回回来的json数据
  8. 【ICCV2019】完整论文列表
  9. Michael Dell承诺打造新的EMC/戴尔/VMware工程技术系统
  10. Faster RCNN 学习笔记
  11. 公司来的新同事能力没我强,但是工资比我高,我应该提出加薪还是选择辞职?
  12. es6-3.webpack应用
  13. NiFi ListSFTP精讲
  14. 短诗整理5—景物+记事
  15. 基于TI Sitara系列AM437x ARM Cortex-A9核心板 处理器
  16. 拓嘉启远:拼多多38“福女节”优惠如何参与
  17. Conflux的自我进化:从DAG到树图| 对话伍鸣
  18. 拂去那份浮躁,心中独留静谧
  19. Python获取前一天的日期,前一个月的第一天,前一个月的最后一天
  20. adb push与adb pull

热门文章

  1. c语言中可以在函数内改变全局变量的值
  2. 可以修改常变量的值吗(c语言)
  3. CentOS7命令集合
  4. HS5104红外遥控芯片应用
  5. vue开发demo - 音乐播放器(二)
  6. matlab中将mat数据文件转成excel文件
  7. 17个面向Web 开发人员的杀手级网站,值得你收藏
  8. 谷歌SEO全面教程-让网站排名第一的秘密
  9. 【K8S那些事儿】李华搭建k8s集群一次成功,坑太多都踩完啦
  10. 如何修改固定了格式的WPS表格