斗地主C语言源代码(草版)

斗地主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;

}

相关推荐