斗地主C语言程序模仿版,不完善。。。求完善并分享。。。。
/*////////////////////////////////////////////////////////////////////////////////////////////////////////////
目前还存在的一些问题:
1.玩家不能出连的三代;
2.电脑一次只能出一张牌;
3.电脑2不能作为地主,而且电脑2现在不能把牌全部出完,我估计是在循环是调用指针时候空指针没有处理好;
4.玩家不能自主的选择pass.
5.图形这次做的很成功但是当时做动态选择牌的时候失败了,否则效果应该与QQ斗地主一样的。
以上问题由于时间问题没有进一步改进。
希望同道中人完善,交流。
////////////////////////////////////////////////////////////////////////////////////////////////////////////*/
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <malloc.h>
#include <bios.h>
#define UP 18432 /*向上的键盘输入标志*/
#define DOWN 20480 /*向下的键盘输入标志*/
#define LEFT 19200 /*向左的键盘输入标志*/
#define RIGHT 19712 /*向右的键盘输入标志*/
int bkcol, x, y;
int a[54];
int b[54];
int flag[20] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; /* flag[i] == 1表示第i张牌还没有出, flag[i] == 0表示这张牌这次之前就出出去了, flag[i] == -1表示这张牌在本次中出出去了 */
char card_value[26] = {'3', '\0', '4', '\0', '5', '\0', '6', '\0', '7', '\0', '8', '\0', '9', '\0', '0', '\0', 'J', '\0', 'Q', '\0', 'K', '\0', 'A', '\0', '2', '\0'};/*加一个'\0'是为了后面以字符串格式输出*/
struct card_node *s1 = NULL, *s2 = NULL;
struct card_node *com1;
struct card_node *com2;
struct card_node
{
int kind;
int num;
char *card;
struct card_node *next;
}card[54];
void first_look ()
{
settextjustify(CENTER_TEXT, CENTER_TEXT);
cleardevice();
x = getmaxx() / 2;
y = getmaxy() / 2;
setcolor (RED);
settextstyle (GOTHIC_FONT, 0, 8);
outtextxy (x, y - 70, "Lord Card");
settextstyle (3, 0, 1);
outtextxy (x + 110, y + 40, "Produced By Li Chao"); outtextxy (x + 110, y + 80, "Version 1.00"); getch ();
}
void table (int x1, int y1)
{
settextjustify(CENTER_TEXT, CENTER_TEXT); bkcol = BLACK; /*MAGENTA*/ cleardevice();
setbkcolor(bkcol);
setfillstyle (SOLID_FILL, LIGHTRED); bar (x1 - 140, y1 - 45, x1 + 136, y1 + 40); setcolor (WHITE);
rectangle (x1 - 141, y1 - 46, x1 + 137, y1 + 41); moveto (x1 , y1 - 8);
settextstyle (GOTHIC_FONT, 0, 6);
outtext ("Lord Card");
}
void delete_table (int x1, int y1)
{
setfillstyle (SOLID_FILL, BLACK);
bar (x1 - 141, y1 - 46, x1 + 137, y1 + 41); }
void operation (int t)
{
settextstyle (3, 0, 2);
switch (t)
{
case 1:
setcolor (RED);
outtextxy (x - 10, 20, "START");
setcolor (WHITE);
outtextxy (x - 10, 50, "ABOUT PRODUCER"); outtextxy (x - 10, 80, "EXIT");
break;
case 2:
setcolor (WHITE);
outtextxy (x - 10, 20, "START");
outtextxy (x - 10, 80, "EXIT");
setcolor (RED);
outtextxy (x - 10, 50, "ABOUT PRODUCER");
break;
case 3:
setcolor (WHITE);
outtextxy (x - 10, 20, "START");
outtextxy (x - 10, 50, "ABOUT PRODUCER"); setcolor (RED);
outtextxy (x - 10, 80, "EXIT");
break;
}
}
int choose_operation ()
{
int key, t = 1;
operation (1);
while (1)
{
while ( bioskey(1) == 0 );
key = bioskey(0);
switch (key)
{
case UP:
if (t == 1)
operation (t);
else
operation (--t);
break;
case DOWN:
if (t == 3)
operation (t);
else
operation (++t);
break;
case LEFT:
break;
case RIGHT:
break;
default :
return t;
}
}
}
void init_graph ()
{
int gdriver = EGA, gmode = EGAHI, errorcode; /* registerbgidriver(EGAVGA_driver); */ initgraph(&gdriver, &gmode, "");
errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error: %s", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}
}
void player_name()
{
setcolor (RED);
settextstyle (3, 0, 1);
outtextxy (x - 260, 10, "COMPUTER 1 :");
outtextxy (x + 256, 10, "COMPUTER 2 :");
outtextxy (x - 180, y + 55, "PLAYER :");
}
void init_card ()
{
int i, j;
for (i = 0; i <= 3; i++)
for (j = 13 * i; j < 13 * i + 13; j++)
{
card[j].kind = i;
card[j].num = j - i * 13;
if (card[j].num == 7)
card[j].card = "10";
else
card[j].card = & card_value[2 * (j - i * 13)];
card[j].next = NULL;
}
card[52].kind = 5;
card[53].kind = 4;
card[52].num = 13;
card[53].num = 14;
card[52].card = "JOKER";
card[53].card = "JOKER";
card[53].next = NULL;
card[52].next = NULL;
}
struct card_node * back_up (struct card_node *head) /* 用来备份用的*/ {
struct card_node *p, *head1, *q;
head1 = (struct card_node *) malloc (sizeof (struct card_node)); head1 -> kind = head -> kind;
head1 -> num = head -> num;
head1 -> card = head -> card;
head1 -> next = NULL;
for (p = head -> next, q = head1; p != NULL; p = p -> next) {
q -> next = (struct card_node *) malloc (sizeof (struct card_node)); q = q -> next;
q -> kind = p -> kind;
q -> num = p -> num;
q -> card = p -> card;
q -> next = NULL;
}
return head1;
}
void card_drawn (int x, int y, int kind, int num, int color) /*传递坐标和牌的花色以及大小,宽60,高80*/
{
char str[6];
setfillstyle (SOLID_FILL, color);
bar (x - 30, y - 40, x + 30, y + 40);
setcolor (BLUE);
rectangle (x - 29, y - 39, x + 29, y + 39);
switch (kind)
{
case 0:
setcolor (RED);
sprintf (str, "%c", 3);
break;
case 1:
setcolor (RED);
sprintf (str, "%c", 4);
break;
case 2:
setcolor (BLACK);
sprintf (str, "%c", 3);
break;
case 3:
setcolor (BLACK);
sprintf (str, "%c", 5);
break;
case 5:
setcolor (LIGHTGRAY);
sprintf (str, "%s", "JOKER");
break;
case 4:
setcolor (RED);
sprintf (str, "%s", "JOKER");
break;
}
if ( kind <= 3)
{
settextstyle (0, 0, 2);
outtextxy (x - 20, y - 29, str);
outtextxy (x + 21, y + 30, str);
if (num == 7)
{
settextstyle (0, 0, 1);
outtextxy (x - 21, y - 15, card[kind * 13 + num].card); outtextxy (x + 21, y + 16, card[kind * 13 + num].card); settextstyle (4, 0, 4);
outtextxy (x, y - 5, card[kind * 13 + num].card); }
else
{
settextstyle (1, 0, 1);
outtextxy (x - 21, y - 15, card[kind * 13 + num].card); outtextxy (x + 21, y + 10, card[kind * 13 + num].card); settextstyle (4, 0, 5);
outtextxy (x - 1, y - 5, card[kind * 13 + num].card); }
}
else
{
settextstyle (0, 1, 1);
outtextxy (x - 21, y - 18, str);
outtextxy (x + 21, y + 18, str);
settextstyle (4, 0, 5);
outtextxy (x, y - 3, "G");
}
}
void lord_choice (int q)
{
setcolor (BLUE);
settextstyle (3, 0, 1);
outtextxy (x, y + 50, "Do You Want To Be the Lord ?");
if (q == 1)
{
setcolor (BLUE);
outtextxy (x + 40, y + 65, "No");
setcolor (LIGHTGRAY);
outtextxy (x - 40, y + 65, "Yes");
}
else
{
setcolor (LIGHTGRAY);
outtextxy (x + 40, y + 65, "No");
setcolor (BLUE);
outtextxy (x - 40, y + 65, "Yes");
}
}
int choose_lord ()
{
int flag = 1, key;
lord_choice (1);
while (1)
{
while (bioskey (1) == 0);
key = bioskey (0);
switch (key)
{
case LEFT:
lord_choice (1);
flag = 1;
break;
case RIGHT:
lord_choice (2);
flag = 2;
break;
case UP:
break;
case DOWN:
break;
default :
return flag;
}
}
}
void cardback_drawn(int x, int y) /*只用传递坐标*/ {
int i;
setfillstyle (SOLID_FILL, WHITE);
bar (x - 40, y - 30, x + 40, y + 30);
setcolor (BLUE);
rectangle (x - 39, y - 29, x + 39, y + 29); setcolor (RED);
for (i = 0; i <= 56; i = i + 2)
line (x - 38, y - 28 + i, x + 38, y - 28 + i); for (i = 0; i <= 76; i = i + 2)
line (x - 38 + i, y - 28, x - 38 + i, y + 28); }
void clear ()
{
cleardevice();
}
void close ()
{
closegraph ();
}
void wash_card ()
{
int t, i, j, k;
randomize ();
for (k = 0; k <= 1000; k++) {
i = rand () % 54;
j = rand () % 54;
t = b[i];
b[i] = b[j];
b[j] = t;
}
}
struct card_node * distribute_lord () {
struct card_node * head; head = & card[b[0]];
card[b[0]].next = & card[b[1]]; card[b[1]].next = & card[b[2]]; card[b[2]].next = NULL; return head;
}
struct card_node * distribute_player () {
struct card_node * head; int i;
head = & card[b[3]];
for (i = 3; i <= 18; i++)
card[b[i]].next = & card[b[i + 1]]; card[b[i]].next = NULL; return head;
}
struct card_node * distribute_com1 () {
struct card_node * head; int i;
head = & card[b[20]];
for (i = 20; i <= 35; i++)
card[b[i]].next = & card[b[i + 1]]; card[b[i]].next = NULL; return head;
}
struct card_node * distribute_com2 () {
struct card_node * head; int i;
head = & card[b[37]];
for (i = 37; i <= 52; i++)
card[b[i]].next = & card[b[i + 1]];
card[b[i]].next = NULL;
return head;
}
void show_lord (struct card_node * head)
{
int i;
struct card_node * p;
for (p = head, i = 0; p != NULL; p = p -> next)
{
card_drawn (x - 80 + i * 80, y - 115, p -> kind, p -> num, WHITE); i++;
}
}
void show_player (struct card_node * head, int x, int y)
{
int i;
struct card_node * p;
for (p = head, i = 0; p != NULL; p = p -> next)
{
card_drawn (x - 160 + i * 20, y + 120, p -> kind, p -> num, WHITE); i++;
}
}
void show_player_1 (struct card_node * head, int x, int y, int j) {
int i;
struct card_node * p;
for (p = head, i = 0; p != NULL; p = p -> next)
{
if (i == j - 1)
{
card_drawn (x - 160 + i * 20, y + 115, p -> kind, p -> num, YELLOW); i++;
}
else
{
card_drawn (x - 160 + i * 20, y + 125, p -> kind, p -> num, WHITE); i++;
}
}
}
void show_player_2 (struct card_node * head, int x, int y, int j) {
int i;
struct card_node * p;
for (p = head, i = 0; p != NULL; p = p -> next)
{
if (i == j - 1)
{
card_drawn (x - 160 + i * 20, y + 125, p -> kind, p -> num, YELLOW); i++;
}
else
{
card_drawn (x - 160 + i * 20, y + 125, p -> kind, p -> num, WHITE); i++;
}
}
}
void show_com1 (struct card_node * head)
{
int i;
struct card_node * p;
for (p = head, i = 0; p != NULL; p = p -> next)
{
cardback_drawn (x - 270, y - 120 + i * 15);
i++;
}
}
void show_com2 (struct card_node * head)
{
int i;
struct card_node * p;
for (p = head, i = 0; p != NULL; p = p -> next)
{
cardback_drawn (x + 270, y - 120 + i * 15);
i++;
}
}
void about_producer1 ()
{
setcolor (RED);
settextstyle (4, 0, 4);
outtextxy (120, 20, "About Producer :");
settextstyle (1, 0, 2);
outtextxy (43, 59, "Li Chao:");
outtextxy (80, 230, "Wang Zhanghu:");
outtextxy (55, 290, "Hu Yuan:");
setcolor (BLUE);
settextstyle (3, 0, 1);
outtextxy (219, 60, "Software Program Class 0603");
outtextxy (218, 90, "Student Number: 012006001701");
outtextxy (216, 130, "Thanks for Wang & Hu's help,");
outtextxy (476, 130, "and thanks to my teacher");
outtextxy (351, 160, "Mr.Shen for his help in my C Programing Language study. "); outtextxy (480, 190, "TEL : 159xxxxxxxx.");
outtextxy (480, 220, "E-mail : lcswr@126.com");
outtextxy (219, 230, "Class 0604");
outtextxy (310, 260, "Student Number: 012006001701");
outtextxy (219, 290, "Class 0603");
outtextxy (310, 320, "Student Number: 012006001701");
}
void about_producer2 ()
{
setcolor (RED);
settextstyle (4, 0, 4);
outtextxy (120, 20, "About Producer :");
settextstyle (1, 0, 2);
outtextxy (43, 90, "Li Chao:");
outtextxy (80, 210, "Wang Zhanghu:");
outtextxy (55, 270, "Hu Yuan:");
setcolor (BLUE);
settextstyle (3, 0, 1);
outtextxy (219, 90, "Class 0603");
outtextxy (310, 120, "Student Number: 012006001701");
outtextxy (219, 210, "Class 0604");
outtextxy (310, 240, "Student Number: 012006003121");
outtextxy (219, 270, "Class 0603");
outtextxy (310, 300, "Student Number: 012006003713");
}
void about_producer3 ()
{
setcolor (RED);
settextstyle (4, 0, 4);
outtextxy (120, 20, "About Producer :");
settextstyle (1, 0, 2);
outtextxy (43, 59, "Li Chao:");
outtextxy (80, 230, "Wang Zhanghu:");
outtextxy (55, 290, "Hu Yuan:");
setcolor (BLUE);
settextstyle (3, 0, 1);
outtextxy (219, 60, "Software Program Class 0603");
outtextxy (218, 90, "Student Number: 012006001701");
outtextxy (216, 130, "Thanks for Wang & Hu's help,");
outtextxy (476, 130, "and thanks to my girlfriend");
outtextxy (351, 160, "Liu Jieyi and I will love her forever !! ");
outtextxy (480, 190, "TEL : 159xxxxxxxx.");
outtextxy (480, 220, "E-mail : lcswr@126.com");
outtextxy (219, 230, "Class 0604");
outtextxy (310, 260, "Student Number: 012006001701");
outtextxy (219, 290, "Class 0603");
outtextxy (310, 320, "Student Number: 012006001701");
}
struct card_node * card_soft (struct card_node *head) /*直接插入排序啦*/
{
struct card_node *p, *q, *r;
for (p = head, q = head, r = head; p -> next != NULL; )
{
if ((p -> next -> num < p -> num) || ((p -> next -> num == p -> num) && (p -> next -> kind < p -> kind)))
{
p = p -> next;
if ((r -> num > p -> num) || ((r -> num == p -> num) && (r -> kind > p -> kind)))
{
q -> next = p -> next;
head = p;
head -> next = r;
r = head;
p = q;
}
else
{
for (r = head; (r -> next -> num < p -> num) || ((r -> next -> num == p -> num) && (r -> next -> kind < p -> kind)); r = r -> next);
q -> next = p -> next;
p -> next = r -> next;
r -> next = p;
r = head;
p = q;
}
}
else
{
p = p -> next;
q = q -> next;
}
}
return head;
}
void delete_player (int x, int y)
{
setfillstyle (SOLID_FILL, BLACK);
bar (x - 225, y + 70, x + 220, y + 175);
}
void delete_head2 ()
{
setfillstyle (SOLID_FILL, BLACK);
bar (x - 200, y - 120, x + 200, y + 40);
}
void delete_com1 (int x, int y)
{
setfillstyle (SOLID_FILL, BLACK);
bar (x - 310, y - 150, x - 230, y + 180);
}
void delete_com2 (int x, int y)
{
setfillstyle (SOLID_FILL, BLACK);
bar (x + 230, y - 150, x + 310, y + 155);
}
/*
int choose_card (struct card_node *head, int s) s == 1表示是地主,否则不是地主
{
struct card_node *p, *q;
int key, i, j, t, flag[20]; flag[i] == 1表示第i张牌还没有出, j是用来记忆当前有多少张牌 flag[20] = 1;
j = 20;
t = 30;
if (s == 0)
{
for (i = 0; i < 3; i++)
flag[17 + i] = 0;
j = 17;
t = 0;
}
i = 1;
p = head;
q = head;
delete_player (x, y);
delete_table (x, y);
show_player_2 (p, x - t, y + 5, i);
while (1)
{
while (bioskey (1) == 0);
key = bioskey (0);
switch (key)
{
case LEFT:
if (i == 1)
break;
else
{
delete_player (x, y);
show_player_2 (p, x - t, y + 5, --i);
break;
}
case RIGHT:
if (i == j)
break;
else
{
delete_player (x, y);
show_player_2 (p, x - t, y + 5, ++i); break;
}
case UP:
{
delete_player (x, y);
show_player_1 (p, x - t, y + 5, i); flag[i - 1] = 0;
break;
}
case DOWN:
delete_player (x, y);
show_player_2 (p, x - t, y + 5, i); flag[i - 1] = 1;
break;
default :
return i;
}
}
}
*/
void print_pointer_1 (int i, int color) {
int arw[16];
arw [0] = x - 217 + i * 20; arw [1] = y + 171;
arw [2] = x - 213 + i * 20; arw [3] = y + 171;
arw [4] = x - 213 + i * 20; arw [5] = y + 165;
arw [6] = x - 210 + i * 20; arw [7] = y + 165;
arw [8] = x - 215 + i * 20; arw [9] = y + 161;
arw [10] = x - 220 + i * 20; arw [11] = y + 165;
arw [12] = x - 217 + i * 20; arw [13] = y + 165;
arw [14] = x - 217 + i * 20; arw [15] = y + 171;
setfillstyle (SOLID_FILL, color); setcolor (BLACK);
fillpoly (8, arw);
}
void print_pointer_2 (int i, int color)
{
int arw[16];
arw [0] = x - 217 + i * 20;
arw [1] = y + 70;
arw [2] = x - 213 + i * 20;
arw [3] = y + 70;
arw [4] = x - 213 + i * 20;
arw [5] = y + 75;
arw [6] = x - 210 + i * 20;
arw [7] = y + 75;
arw [8] = x - 215 + i * 20;
arw [9] = y + 80;
arw [10] = x - 220 + i * 20;
arw [11] = y + 75;
arw [12] = x - 217 + i * 20;
arw [13] = y + 75;
arw [14] = x - 217 + i * 20;
arw [15] = y + 70;
setfillstyle (SOLID_FILL, color);
setcolor (BLACK);
fillpoly (8, arw);
}
void player_pass ()
{
settextstyle (3, 0, 3);
setcolor (RED);
outtextxy (x + 30, y + 20, "PASS");
}
void com1_pass ()
{
settextstyle (3, 1, 3);
setcolor (RED);
outtextxy (x - 180, y - 10, "PASS");
}
void com2_pass ()
{
settextstyle (3, 1, 3);
setcolor (RED);
outtextxy (x + 180, y - 10, "PASS");
}
void showcard_com1 (struct card_node * head1, struct card_node * head2) /*head1 表示传递电脑出的牌, head2表示电脑所剩下的牌*/
{
struct card_node * p1, * p2;
p1 = head1;
p2 = head2;
if (p1 == NULL)
{
com2_pass ();
s1 = NULL;
}
else if (p1 == p2)
{
com1 = com1 -> next;
head2 = com1;
p1 -> next = NULL;
s1 = head1;
show_player (head1, x, y - 200);
delete_com1 (x, y);
show_com1 (head2);
}
else
{
for (p2 = head2; p2 -> next != p1; p2 = p2 -> next);
p2 -> next = p1 -> next;
p1 -> next = NULL;
s1 = head1;
show_player (head1, x, y - 200);
delete_com1 (x, y);
show_com1 (head2);
}
}
void showcard_com2 (struct card_node * head1, struct card_node * head2) /*head1 表示传递电脑出的牌, head2表示电脑所剩下的牌*/
{
struct card_node * p1, * p2;
p1 = head1;
p2 = head2;
if (p1 == NULL)
{
com2_pass ();
s2 = NULL;
}
else if (p1 == p2)
{
com2 = com2 -> next;
head2 = com2;
p1 -> next = NULL;
s2 = head1;
show_player (head1, x, y - 200);
delete_com2 (x, y);
show_com2 (head2);
}
else
{
for (p2 = head2; p2 -> next != p1; p2 = p2 -> next);
p2 -> next = p1 -> next;
p1 -> next = NULL;
s2 = head1;
show_player (head1, x + 280, y - 200);
delete_com2 (x, y);
show_com2 (head2);
}
}
int justify (struct card_node * head, struct card_node *s1, struct card_node *s2) /*s1, s2用来表示电脑上次出的牌*/
{
struct card_node *p;
int flag = 0, k = 0; /*k表示出牌的个数,flag表示出来的牌是否符合标准*/
for (k = 0, p = head; p != NULL; p = p -> next)
k++;
p = head;
if (k == 1)
{
if (s1 == NULL && s2 == NULL)
flag = 1;
else if (s2 != NULL && p -> num > s2 -> num)
flag = 1;
else if (s1 != NULL && s2 == NULL && p -> num > s1 -> num)
flag = 1;
else flag = 0;
}
else if (k == 2 && (p -> num == p -> next -> num) && s1 == NULL && s2 == NULL) flag = 1;
else if (k == 3 && (p -> num == p -> next -> num) && (p -> num == p -> next -> next -> num) && s1 == NULL && s2 == NULL)
flag = 1;
else if (k == 4 && (((p -> num == p -> next -> num) && (p -> num == p -> next -> next -> num)) || ((p -> next -> num == p -> next -> next -> num) && (p -> next -> num == p -> next -> next -> next -> num))) && s1 == NULL && s2 == NULL)
flag = 1;
else if (k > 4 && p -> num != p -> next -> num && s1 == NULL && s2 == NULL) for (p = head; p -> next != NULL; p = p -> next)
{
if (p -> num == p -> next -> num - 1)
flag = 1;
else
return 0;
}
else if (k >= 6 && k % 2 == 0 && p -> num == p -> next -
> num && s1 == NULL && s2 == NULL)
for (p = head; p -> next -> next != NULL; p = p -> next -> next)
{
if (p -> num == p -> next -> num && p -> num == p -> next -> next -> num - 1)
flag = 1;
else
return 0;
}
else
flag = 0;
return flag;
}
struct card_node * justify_com (struct card_node * head1, struct card_node * head2) /*head1传递的是玩家出的牌,head2传递的是电脑所剩下的牌,返回电脑出的牌*/
{
struct card_node *p1, *p2;
int k;
p2 = head2;
for (k = 0, p1 = head1; p1 != NULL; p1 = p1 -> next)
k++;
if (k == 1)
{
for (p2 = head2, p1 = head1; p2 -> num <= p1 -> num && p2 != NULL; p2 = p2 -> next); return p2;
}
else
return NULL;
}
int examine_player(struct card_node * head1, struct card_node * head2) /*head1传递的是电脑的牌, head2传递的是玩家有的牌,返回值为0表示玩家没有比电脑的更大的牌*/
{
int flag = 0;
struct card_node *p1, *p2;
for (p1 = head1, p2 = head2; p2 != NULL; p2 = p2 -> next)
if (p2 -> num > p1 -> num)
flag = 1;
return flag;
}
struct card_node * choose_card (struct card_node *head, struct card_node *com1, struct card_node *com2)
{
struct card_node *p, *q, *head1, *head2, *r; /*head2是用来指向已经出了的牌的*/
int key, i = 0, t = 0, j, k, justify1 = 1, flag1[20], m = 0; /* j是用来记忆当前有多少张牌 */
if (s2 != NULL)
m = examine_player (s2, head);
else if (s1 != NULL)
m = examine_player (s1, head);
else
m = 1;
if (m == 0)
{
while (1)
{
while (bioskey (1) == 0);
key = bioskey (0);
switch (key)
{
case LEFT:
break;
case RIGHT:
break;
case UP:
break;
case DOWN:
break;
default:
delete_head2 ();
player_pass ();
while (1)
{
while (bioskey (1) == 0);
key = bioskey (0);
switch (key)
{
case LEFT:
break;
case RIGHT:
break;
case UP:
break;
case DOWN:
break;
default:
delete_head2 ();
for (p = com2; p != NULL && p -> num <= com1 -> num; p = p -> next); showcard_com1 (com1, com1);
showcard_com2 (p, com2);
return head;
}
}
}
}
}
else
{
head1 = back_up (head);
for (i = 0; i < 20; i++)
flag1[i] = flag[i];
for (i = 0, j = 0; i < 20; i++)
{
if ( flag[i] == 1 )
j++;
else
flag[i] = 0;
}
for (i = 0; i < 20; i++) {
if (i < j)
flag[i] = 1;
else
flag[i] = 0;
}
i = 0;
p = head;
q = head;
head2 = head;
print_pointer_1 (0, WHITE);
while (1)
{
while (bioskey (1) == 0); key = bioskey (0);
switch (key)
{
case LEFT:
if (i == 0)
break;
else
{
print_pointer_1 (i, BLACK); print_pointer_1 (--i, WHITE); break;
}
case RIGHT:
if (i == j - 1)
break;
else
{
print_pointer_1 (i, BLACK); print_pointer_1 (++i, WHITE); break;
}
case UP:
print_pointer_2 (i, YELLOW); flag[i] = -1;
break;
case DOWN:
print_pointer_2 (i, BLACK); flag[i] = 1;
break;
default :
for (k = 0; k < 20; k++)
if (flag[k] == -1)
t = 1;
if (t == 1)
{
for (i = 0; flag[i] != -1 && head2 -> next != NULL; i++) head2 = head2 -> next;
for (i = 0, r = head2; flag[i] != 1 && head != NULL; i++) {
head = head -> next;
if (flag[i + 1] == -1)
{
r -> next = head;
r = r -> next;
}
}
for (p = head; i < j; i++)
{
if (flag[i] == 1)
{
q = p;
p = p -> next;
}
else
{
q -> next = p -> next;
if (flag[i] == -1)
{
r -> next = p;
r = r -> next;
}
p = q -> next;
}
}
r -> next = NULL;
justify1 = justify (head2, s1, s2);
if (justify1 == 1)
{
delete_head2 ();
show_player (head2, x + 115, y - 130);
s1 = justify_com (head2, com1);
if (s1 == NULL)
{
com1_pass ();
s2 = justify_com (head2, com2);
}
else
showcard_com1 (s1, com1);
s2 = justify_com (s1, com2);
if (s2 == NULL)
com2_pass ();
else
showcard_com2 (s2, com2);
/*应该插入一个函数来让你选择是否PASS*/ return head;
}
else
{
for (i = 0; i < 20; i++)
flag[i] = flag1[i];
return head1;
}
}
else
break;
}
}
}
}
void you_win ()
{
setfillstyle (SOLID_FILL, BLACK); bar (x - 320, y - 300, x + 430, y + 300); settextstyle (3, 0, 5);
setcolor (RED);
outtextxy (x - 90, y - 70, "Congratulations"); settextstyle (3, 0, 8);
outtextxy (x + 90, y + 50, "You Win !!"); }
void you_lose ()
{
setfillstyle (SOLID_FILL, BLACK); bar (x - 320, y - 300, x + 430, y + 300); settextstyle (3, 0, 5);
setcolor (RED);
outtextxy (x - 90, y - 70, "I'm so sorry..."); settextstyle (3, 0, 8);
outtextxy (x + 90, y + 50, "You lose ..."); }
int main (void)
{
int gdriver, gmode;
int i;
int t = 1, flag2 = 1, r;
struct card_node *lord;
struct card_node *player;
struct card_node *p;
init_graph ();
first_look ();
while (flag2 == 1)
{
table (x, y);
operation (1);
t = choose_operation ();
for (i = 0; i < 20; i++)
flag[i] = 1;
if (t == 1)
{
table (x, y);
player_name ();
init_card ();
for (i = 0; i <= 53; i++)
b[i] = i;
wash_card ();
lord = distribute_lord ();
player = distribute_player ();
com1 = distribute_com1 ();
com2 = distribute_com2 ();
show_lord (lord);
show_player (player, x, y);
show_com1 (com1);
show_com2 (com2);
r = choose_lord (); /*选择是否当地主*/
if (r == 1)
{
for (p = player; p -> next != NULL; p = p -> next);
p -> next = lord;
table (x, y);
player_name ();
show_player (player, x - 30, y);
show_com1 (com1);
show_com2 (com2);
player = card_soft (player);
com1 = card_soft (com1);
com2 = card_soft (com2);
getch ();
show_player (player, x - 30, y);
getch ();
delete_table (x, y);
while (player != NULL && com1 != NULL && com2 != NULL) {
player = choose_card (player, com1, com2);
delete_player (x, y);
show_player (player, x - 30, y);
}
}
else
{
for (i = 0; i < 3; i++)
flag[17 + i] = 0;
for (p = com1; p -> next != NULL; p = p -> next);
p -> next = lord;
table (x, y);
player_name ();
show_com1 (com1);
show_player (player, x - 30, y);
show_com2 (com2);
player = card_soft (player);
com1 = card_soft (com1);
com2 = card_soft (com2);
getch ();
show_player (player, x - 30, y);
getch ();
delete_table (x, y);
while (player != NULL && com1 != NULL && com2 != NULL) {
player = choose_card (player, com1, com2);
delete_player (x, y);
show_player (player, x - 30, y);
}
}
getch ();
if (player == NULL)
you_win ();
else
you_lose ();
getch ();
}
else if (t == 2)
{
table (x + 175, y - 120);
about_producer1 ();
getch ();
}
else
flag2 = 0; }
close (); return 0;
}
1小王都会被大王拍死说明副职没有实权2没有一张大牌开路再顺的小牌都出不去说明领导很重要3无论你多会记牌打牌都抵不过人家手中的一把好…
斗地主C语言程序模仿版不完善目前还存在的一些问题1玩家不能出连的三代2电脑一次只能出一张牌3电脑2不能作为地主而且电脑2现在不能把…
斗地主C语言程序模仿版不完善求完善并分享目前还存在的一些问题1玩家不能出连的三代2电脑一次只能出一张牌3电脑2不能作为地主而且电脑…
游戏规则一发牌一副牌54张一人17张留3张做底牌在确定地主之前边个都唔可以睇底牌二叫牌叫牌按出牌噶顺序轮流进行叫牌噶时候可以选择叫…
斗地主斗地主赢话费免费报名试试手气活动时间斗地主赢话费每周一至周五19002000比赛房间斗地主8元奖品兑换券争夺场9人开赛奖项设…
1小王都会被大王拍死说明副职没有实权2没有一张大牌开路再顺的小牌都出不去说明领导很重要3无论你多会记牌打牌都抵不过人家手中的一把好…
游戏规则一发牌一副牌54张一人17张留3张做底牌在确定地主之前边个都唔可以睇底牌二叫牌叫牌按出牌噶顺序轮流进行叫牌噶时候可以选择叫…
斗地主AItstooboringInthedormitoryBWhatdoyouhavefunadviceCHeyHeyIgoto…
手游玩家第一站赢话费斗地主应用介绍赢话费斗地主人生从此真快乐玩法多花样多不止是斗地主更是比拼智慧赢奖励赢话费斗地主是速度极快刺激简…
星星斗地主如何赢话费星星斗地主如何赢话费呢如果您有大量的琐碎时间可以在手机上下载个星星斗地主赢话费攒翡翠换话费很多赢手机电视的由于…