五子棋 C语言程序
五子棋设计与实现完整版

哈尔滨商业大学毕业设计(论文)五子棋的设计与实现学生姓名周玉春指导教师李恩林专业计算机科学与技术学院计算机与信息工程2010年06月02日Graduation Project (Thesis)Harbin University of CommerceThe Design and Implementationof GobangStudent Zhou YuchunSupervisor Li EnlinSpecialty Computer Science and Technology School Computer and Information Engineering2010 - 06 - 02毕业设计(论文)任务书姓名:周玉春学院:计算机与信息工程班级:2006级4班专业:计算机科学与技术毕业设计(论文)题目:五子棋的设计与实现立题目的和意义:本程序旨在用JA V A实现一个基本于C/S模式的五子棋网络对战游戏。
玩家作为客户端通过服务器端与其它玩家进行对战,聊天等功能。
通过实现本程序加深对计算机网络编程的了解。
技术要求与工作计划:开发环境:Intel core 2 duo 1.8GHz 1G内存160硬盘;Microsoft® Windows™XP Professional;JDK 1.50;Eclipse 3.3.2运行环境:IntelPentium® 2及以上处理器,32M以上内存,4G以上硬盘;Microsoft® Windows™ 9X/NT/XP 操作系统;800*600或以上的屏幕分辨率工作计划:第一阶段需求分析第二阶段系统设计第三阶段系统实现第四阶段论文初稿,程序调试第五阶段论文终稿,程序修订第六阶段准备论文答辩时间安排:1月--2月收集论文资料,确定毕业设计题目3月--4月实习和调研,编写开题报告4月--5月程序设计和调试5月--6月论文初稿6月--答辩论文终稿及答辩指导教师要求:(签字)年月日教研室主任意见:(签字)年月日院长意见:(签字)年月日毕业设计(论文)审阅评语一、指导教师评语:指导老师签字:年月日毕业设计(论文)审阅评语二、评阅人评语:评阅人签字:年月日毕业设计(论文)答辩评语三、答辩委员会评语:四、毕业设计(论文)成绩:专业答辩组负责人签字:年月日五、答辩委员会主任签章答辩委员会主任单位:(签章)答辩委员会主任职称:答辩委员会主任签字:年月日摘要随着互联网迅速的发展,网络游戏已经成为人们普遍生活中不可或缺的一部分,它不仅能使人娱乐,也能够开发人的智力,就像本文所主要讲的五子棋游戏一样能挖掘人们聪明的才干与脑袋的机灵程度。
C语言可以开发哪些项目?

C语⾔可以开发哪些项⽬?C语⾔是我们⼤多数⼈的编程⼊门语⾔,对其也再熟悉不过了,不过很多初学者在学习的过程中难免会出现迷茫,⽐如:不知道C语⾔可以开发哪些项⽬,可以应⽤在哪些实际的开发中……,这些迷茫也导致了我们在学习的过程中不知道如何学、学什么,所以,总结这个列表,希望对C语⾔初学者可以有所帮助~C语⾔可以做什么?从最简单的、最熟悉的说起吧,毕竟我们在学校学习的时候,⽼师⼏乎都会让我们去开发:⼀、C语⾔可以实现⼀些常见的应⽤以下⼏个⼏乎是我们学习C语⾔到⼀定阶段之后必开发的⼀个⼩项⽬了,简单。
1、项⽬⽤C语⾔做⼀个简单的计算器,进⾏加、减、乘、除操作。
2、项⽬使⽤ C 语⾔完成⼀个简单的通讯录。
会涉及到结构体、数组、链表等重要概念。
3、项⽬实现客户端和服务端编程,服务端使⽤epoll机制,⾼并发必备,⽀持多客户聊天室聊天;客户端使⽤epoll和fork,⽗进程与⼦进程通过pipe通信。
4、使⽤ C 语⾔完成⼀个简单的⽇历功能。
输⼊相应的年/⽉即可看到当⽉的⽇历。
⼆、C语⾔可以开发游戏当然C语⾔也可以开发⼀些⼩游戏,有趣的同时也掌握了相应的知识点。
5、使⽤ C 语⾔完成⼀个2048游戏。
6、使⽤ C 语⾔来实现⼀个字符版 Flappy Bird7、使⽤ C 语⾔完成⼀个简单的扫雷游戏。
8、使⽤C语⾔实现五⼦棋游戏。
三、 C语⾔可以开发的其他应⽤如果你以为C语⾔只能开发上⾯介绍的⼩游戏以及⼀些⽿熟能详的应⽤呢,那么就⼤错特错了,因为C语⾔还可以开发很多东西,如下:9、⽤C语⾔实现⼀个简易的WEB服务器,并能⽀持动态解析PHP程序。
主要涉及到的技术有:Linux Socket编程,HTTP协议(只实现GET请求),Fast-CGI协议。
10、项⽬⽤C语⾔实现ping命令。
通过项⽬可以更深⼊地理解TCP/IP协议,掌握C语⾔进⾏⽹络编程的技巧⽅法。
11、项⽬通过原⽣套接字的⽅式,监听所有本地主机收发的数据链路层帧结构,然后解析数据包的类型,并记录到⽇志⽂件。
(最新版)五子棋毕业课程设计报告

上海海事大学程序设计课程设计报告课程题目FIVE CHESS GAME作者姓名学号联系方式指导教师学科(专业)所在学院提交日期目录1引言 (3)1.1五子棋介绍 (3)1.2选题背景和动机 (3)1.3系统所要解决的问题 (3)2 系统框架 (5)2.1棋盘类 (6)2.1.1 主要成员变量说明: (6)2.1.2清空棋盘——Clear (6)2.1.3绘制棋子——Draw (6)2.1.4左键消息——OnLButtonUp (7)2.1.5载入棋盘 (7)2.1.6对方落子完毕——Over (7)2.1.7设置游戏模式——SetGameMode (7)2.1.8胜负的判断——Win (7)2.2游戏模式类 (8)3关键技术 (9)3.1 棋盘对话框的制作 (9)3.1.1 对话框机制 (9)3.1.3 棋子 (10)3.2 人机对弈 (10)3.2.1 难度的选择 (10)3.2.2 机器的落子判断 (11)4运行结果 (15)4.1开发环境及运行环境 (15)4.1.1开发环境 (15)4.1.2运行环境 (15)4.2运行图示 (15)4.2.1 棋盘显示 (15)4.2.2 开始的选择对话框 (16)4.2.3 主界面中的游戏难度选项 (16)4.2.4 电脑的应对 (17)5调试分析 (19)6总结 (21)参考文献 (22)1引言1.1五子棋介绍五子棋是起源于中国古代的传统黑白棋种之一。
现代五子棋日文称之为“連珠”,英译为“Renju”,英文称之为“Gobang”或“FIR”(Five in a Row的缩写),亦有“连五子”、“五子连”、“串珠”、“五目”、“五目碰”、“五格”等多种称谓。
五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。
斗地主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;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");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);elseoperation (--t);break;case DOWN:if (t == 3)operation (t);elseoperation (++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";elsecard[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;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){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:159****2688.");outtextxy(480,220,"E-mail:*************");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 (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:159****2688.");outtextxy(480,220,"E-mail:*************");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;{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);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 [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);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;elsereturn 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;return 0;}elseflag = 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;}elsereturn 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);elsem = 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++;elseflag[i] = 0;}for (i = 0; i < 20; i++){if (i < j)flag[i] = 1;elseflag[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;elseprint_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);}elseshowcard_com1 (s1, com1);s2 = justify_com (s1, com2);if (s2 == NULL)com2_pass ();elseshowcard_com2 (s2, com2);/*应该插入一个函数来让你选择是否PASS*/ return head;}else{for (i = 0; i < 20; i++)flag[i] = flag1[i];return head1;}}elsebreak;}}}}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");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_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);show_player (player, x - 30, y); }}getch ();if (player == NULL)you_win ();elseyou_lose ();getch ();}else if (t == 2){table (x + 175, y - 120);about_producer1 ();getch ();}elseflag2 = 0;}close ();return 0;}。
8086汇编实现的五子棋小游戏

8086汇编实现的五⼦棋⼩游戏⼀、五⼦程序设计要求汇编实现五⼦棋游戏。
⾸先显⽰空⽩棋盘,让玩家选择旗⾊,⽩⼦先⾏。
进⼊游戏对弈循环只要有⼀⽅连成同⾊五⼦,即获胜。
事先写了⼀个普通的c++五⼦棋,然后将这个思路⽤汇编实现出来,代码逾500⾏,五⼦棋功能⽐较完善了,获胜逻辑什么的判断部分基本没有问题,花费了我很⼤的精⼒。
选择旗⾊,先⼿玩家即为⽩⾊,后⼿玩家为⿊⾊,分别以W,B代表⿊⽩棋⼦。
⼆、设计思路五⼦棋,⾸先需要显⽰棋盘,然后玩家输⼊落⼦坐标,⽩⽅落⼦,⿊⽅落⼦,落⼦循环,其中每次落⼦都要判断⼀次落⼦点是否已经有棋⼦了,那就需要提醒玩家重新输⼊落⼦坐标,同理玩家输⼊的坐标超出棋盘边界的时候也要提醒玩家。
落⼦的部分解决了,就得考虑获胜的判定逻辑了,每次成功的落⼦,就要对该坐标进⾏判定,我的判定获胜的⽅法是这样的,对于落⼦坐标进⾏四类判定,⼀种是横向的,⼀种是纵向的,另外两类是左上到右下,与左下到右上的,这样就涵盖了所有的获胜的情况,并且具体怎么实现?设定⼀个变量COUNT计算同⼀线上的同⾊棋⼦数⽬,COUNT初始为1。
从落⼦坐标出发,对于横向的,分两种搜索,⼀类向左搜索,遇到同类的棋⼦COUNT+1,⼀旦不是同⾊棋⼦或者是搜索到棋盘外便转到向右搜索的循环中去,每次COUNT+1后判断是否达到5,达到5了则当前落⼦⽅获胜,遇到⾮同⾊棋⼦或搜索到棋盘外跳出循环,重置COUNT为1后进⼊其它三类判定,其它三类的获胜判定与该法原理⼀致。
原理简单易懂,但是在汇编上实现起来还是遇到了不少问题的。
同时,每次有效落⼦的时候有个变量OVERFLOW需要+1,这个是计算和棋的变量,五⼦棋的棋盘是15*15⼤⼩的,当OVERFLOW达到225时还没有决出胜负,这时候便可以宣布和棋了。
⼀些实现上的问题,由于8086汇编的输⼊中断⼀次仅识别⼀个ASII字符,导致两位数的输⼊还得⼿撸,便设置了两个暂存量TI,TJ⽤于暂存输⼊,事后再赋值给真正的落⼦坐标I,J。
五子棋论文——精选推荐

本科毕业论文(设计)题目:五子棋博弈系统研究以及单机版网络版的实现姓名:方杰学号:***********院(系):信息工程学院专业:软件工程系指导教师:杨林权职称:副教授评阅人:职称:2011 年6 月学位论文原创性声明本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。
除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。
本人完全意识到本声明的法律后果由本人承担。
作者签名:年月日学位论文版权使用授权书本学位论文作者完全了解学校有关保障、使用学位论文的规定,同意学校保留并向有关学位论文管理部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。
本人授权省级优秀学士学位论文评选机构将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
本学位论文属于1.保密□,在_________年解密后适用本授权书。
2.不保密□√。
(请在以上相应方框内打“√”)作者签名:年月日导师签名:年月日摘要人工智能是近年来很活跃的研究领域之一。
计算机博弈是人工智能研究的一个重要分支,它的研究为人工智能带来了很多重要的方法和理论,产生了广泛的社会影响和学术影响。
国内外对博弈的研究已经较为广泛,特别是IBM的国际象棋程序“深蓝”,已经达到了人类的世界冠军水平。
“深蓝”的研究成果,特别是基于剪枝的极大极小树搜索技术为设计其它的计算机棋类博奕系统提供了良好的参照。
但是不同的棋类博奕,其规则的千差万别赋予了每一种棋类博奕特殊的专业知识。
这就必然要求设计一个具体的棋类博奕系统时应该深入研究它的基本原理和内在规律。
随着网络的发展,简单的单机版已满足不了人们的需要,将单机版晋升成为网络版已是必然的。
C++语言是一种面向对象语言,尽管在当前,可视化语言发展迅速,晋级很快,但c++语言作为一种基础的语言,它还是有它的存在价值,甚至有时它是不可替代的,特别是在和硬件接口技术相联系的软件方面。
c语言围棋程序代码
c语言围棋程序代码以下是一个简单的C语言围棋程序的示例代码:```c#include <stdio.h>#define BOARD_SIZE 9enum Stone {EMPTY,BLACK,WHITE};enum Stone board[BOARD_SIZE][BOARD_SIZE];void init_board() {for (int i = 0; i < BOARD_SIZE; i++) {for (int j = 0; j < BOARD_SIZE; j++) {board[i][j] = EMPTY;}}}void print_board() {for (int i = 0; i < BOARD_SIZE; i++) { for (int j = 0; j < BOARD_SIZE; j++) { switch (board[i][j]) {case EMPTY:printf(".");break;case BLACK:printf("X");break;case WHITE:printf("O");break;}}printf("\n");}}int main() {init_board();print_board();return 0;}```这个程序定义了一个9x9的围棋棋盘,使用`enum Stone`枚举类型表示棋盘上的三种棋子状态:空、黑子、白子。
`init_board()`函数用于初始化棋盘,将所有位置都设为EMPTY。
`print_board()`函数用于打印当前棋盘状态。
在`main()`函数中,首先调用`init_board()`初始化棋盘,然后调用`print_board()`打印初始棋盘状态。
你可以根据需要进一步扩展和完善这个程序,例如添加下子功能、判断胜负等等。
JAVA课程设计 五子棋(内附完整代码)
JAVA课程设计设计题目:五子棋游戏一.简要的介绍五子棋1.五子棋的起源五子棋,又被称为“连五子、五子连、串珠、五目、五目碰、五格、五石、五法、五联、京棋”。
五子棋相传起源于四千多年前的尧帝时期,比围棋的历史还要悠久,可能早在“尧造围棋”之前,民间就已有五子棋游戏。
有关早期五子棋的文史资料与围棋有相似之处,因为古代五子棋的棋具与围棋是完全相同的。
2.现在五子棋标准棋盘(如图所示)3.五子棋的棋子五子棋采用两种颜色棋子,黑色棋子和白色棋子,和围棋相同,4.五子棋规则五子棋就是五个棋子连在一起就算赢,黑棋先行,下棋下在棋盘交叉线上,由于黑棋先行,优势太大,所以对黑棋设了禁手,又规定了“三手交换”,就是黑棋下第 2 手棋,盘面第 3 着棋之后,白方在应白 2 之前,如感觉黑方棋形不利于己方,可出交换,即执白棋一方变为执黑棋一方。
和“五手两打法”,就是黑棋在下盘面上关键的第 5 手时,必须下两步棋,让白方在这两步棋中任选一步,然后再续下。
不过一般爱好者不需要遵循这么多规则。
二.程序流程三.代码设计与分析main方法创建了ChessFrame类的一个实例对象(cf),并启动屏幕显示显示该实例对象。
public class FiveChessAppletDemo {public static void main(String args[]){ChessFrame cf = new ChessFrame();cf.show();}}用类ChessFrame创建五子棋游戏主窗体和菜单import java.awt.*;import java.awt.event.*;import java.applet.*;import javax.swing.*;import java.io.PrintStream;import javax.swing.JComponent;import javax.swing.JPanel;class ChessFrame extends JFrame implements ActionListener { private String[] strsize={"标准棋盘","改进棋盘","扩大棋盘"}; private String[] strmode={"人机对战","人人对战"};public static boolean iscomputer=true,checkcomputer=true; private int width,height;private ChessModel cm;private MainPanel mp;构造五子棋游戏的主窗体public ChessFrame() {this.setTitle("五子棋游戏");cm=new ChessModel(1);mp=new MainPanel(cm);Container con=this.getContentPane();con.add(mp,"Center");this.setResizable(false);this.addWindowListener(new ChessWindowEvent());MapSize(14,14);JMenuBar mbar = new JMenuBar();this.setJMenuBar(mbar);JMenu gameMenu = new JMenu("游戏");mbar.add(makeMenu(gameMenu, new Object[] {"开局", null,"棋盘",null,"模式", null, "退出"}, this));JMenu lookMenu =new JMenu("外观");mbar.add(makeMenu(lookMenu,new Object[] {"类型一","类型二","类型三"},this));JMenu helpMenu = new JMenu("版本");mbar.add(makeMenu(helpMenu, new Object[] {"关于"}, this));}构造五子棋游戏的主菜单public JMenu makeMenu(Object parent, Object items[], Object target){ JMenu m = null;if(parent instanceof JMenu)m = (JMenu)parent;else if(parent instanceof String)m = new JMenu((String)parent);elsereturn null;for(int i = 0; i < items.length; i++)if(items[i] == null)m.addSeparator();else if(items[i] == "棋盘"){JMenu jm = new JMenu("棋盘");ButtonGroup group=new ButtonGroup();JRadioButtonMenuItem rmenu;for (int j=0;j<strsize.length;j++){rmenu=makeRadioButtonMenuItem(strsize[j],target);if (j==0)rmenu.setSelected(true);jm.add(rmenu);group.add(rmenu);}m.add(jm);}else if(items[i] == "模式"){JMenu jm = new JMenu("模式");ButtonGroup group=new ButtonGroup();JRadioButtonMenuItem rmenu;for (int h=0;h<strmode.length;h++){rmenu=makeRadioButtonMenuItem(strmode[h],target);if(h==0)rmenu.setSelected(true);jm.add(rmenu);group.add(rmenu);}m.add(jm);}elsem.add(makeMenuItem(items[i], target));return m;}构造五子棋游戏的菜单项public JMenuItem makeMenuItem(Object item, Object target){ JMenuItem r = null;if(item instanceof String)r = new JMenuItem((String)item);else if(item instanceof JMenuItem)r = (JMenuItem)item;elsereturn null;if(target instanceof ActionListener)r.addActionListener((ActionListener)target);return r;}构造五子棋游戏的单选按钮式菜单项public JRadioButtonMenuItem makeRadioButtonMenuItem(Object item, Object target){JRadioButtonMenuItem r = null;if(item instanceof String)r = new JRadioButtonMenuItem((String)item);else if(item instanceof JRadioButtonMenuItem)r = (JRadioButtonMenuItem)item;elsereturn null;if(target instanceof ActionListener)r.addActionListener((ActionListener)target);return r;}public void MapSize(int w,int h){setSize(w * 24, h * 27);if(this.checkcomputer)this.iscomputer=true;elsethis.iscomputer=false;mp.setModel(cm);mp.repaint();}public boolean getiscomputer(){return this.iscomputer;}public void restart(){int modeChess = cm.getModeChess();if(modeChess <= 3 && modeChess >= 0){cm = new ChessModel(modeChess);MapSize(cm.getWidth(),cm.getHeight());}}public void actionPerformed(ActionEvent e){String arg=e.getActionCommand();try{if (arg.equals("类型三"))UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");else if(arg.equals("类型二"))UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");elseUIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel" );SwingUtilities.updateComponentTreeUI(this);}catch(Exception ee){}if(arg.equals("标准棋盘")){this.width=14;this.height=14;cm=new ChessModel(1);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("改进棋盘")){this.width=18;this.height=18;cm=new ChessModel(2);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("扩大棋盘")){this.width=22;this.height=22;cm=new ChessModel(3);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("人机对战")){this.checkcomputer=true;this.iscomputer=true;cm=new ChessModel(cm.getModeChess());MapSize(cm.getWidth(),cm.getHeight());SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("人人对战")){this.checkcomputer=false;this.iscomputer=false;cm=new ChessModel(cm.getModeChess());MapSize(cm.getWidth(),cm.getHeight());SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("开局")){restart();}if(arg.equals("关于"))JOptionPane.showMessageDialog(null, "第一版", "版本",JOptionPane.PLAIN_MESSAGE );if(arg.equals("退出"))System.exit(0);}}用类ChessModel实现了整个五子棋程序算法的核心import java.awt.*;import java.awt.event.*;import java.applet.*;import javax.swing.*;import java.io.PrintStream;import javax.swing.JComponent;import javax.swing.JPanel;class ChessModel {规定棋盘的宽度、高度、棋盘的模式private int width,height,modeChess;规定棋盘方格的横向、纵向坐标private int x=0,y=0;棋盘方格的横向、纵向坐标所对应的棋子颜色,数组arrMapShow只有3个值:1,2,3,-1,其中1代表该棋盘方格上下的棋子为黑子,2代表该棋盘方格上下的棋子为白子,3代表为该棋盘方格上没有棋子,-1代表该棋盘方格不能够下棋子private int[][] arrMapShow;交换棋手的标识,棋盘方格上是否有棋子的标识符private boolean isOdd,isExist;public ChessModel() {}该构造方法根据不同的棋盘模式(modeChess)来构建对应大小的棋盘public ChessModel(int modeChess){this.isOdd=true;if(modeChess == 1){PanelInit(14, 14, modeChess);}if(modeChess == 2){PanelInit(18, 18, modeChess);}if(modeChess == 3){PanelInit(22, 22, modeChess);}}按照棋盘模式构建棋盘大小private void PanelInit(int width, int height, int modeChess){ this.width = width;this.height = height;this.modeChess = modeChess;arrMapShow = new int[width+1][height+1];for(int i = 0; i <= width; i++){for(int j = 0; j <= height; j++){arrMapShow[i][j] = -1;}}}获取是否交换棋手的标识符public boolean getisOdd(){return this.isOdd;}设置交换棋手的标识符public void setisOdd(boolean isodd){ if(isodd)this.isOdd=true;elsethis.isOdd=false;}获取某棋盘方格是否有棋子的标识值public boolean getisExist(){return this.isExist;}获取棋盘宽度public int getWidth(){return this.width;}获取棋盘高度public int getHeight(){return this.height;}获取棋盘模式public int getModeChess(){return this.modeChess;}获取棋盘方格上棋子的信息public int[][] getarrMapShow(){return arrMapShow;}判断下子的横向、纵向坐标是否越界private boolean badxy(int x, int y){if(x >= width+20 || x < 0)return true;return y >= height+20 || y < 0;}计算棋盘上某一方格上八个方向棋子的最大值,这八个方向分别是:左、右、上、下、左上、左下、右上、右下public boolean chessExist(int i,int j){if(this.arrMapShow[i][j]==1 || this.arrMapShow[i][j]==2)return true;return false;}判断该坐标位置是否可下棋子public void readyplay(int x,int y){if(badxy(x,y))return;if (chessExist(x,y))return;this.arrMapShow[x][y]=3;}在该坐标位置下棋子public void play(int x,int y){if(badxy(x,y))return;if(chessExist(x,y)){this.isExist=true;return;}elsethis.isExist=false;if(getisOdd()){setisOdd(false);this.arrMapShow[x][y]=1;}else{setisOdd(true);this.arrMapShow[x][y]=2;}}计算机走棋说明:用穷举法判断每一个坐标点的四个方向的的最大棋子数,最后得出棋子数最大值的坐标,下子public void computerDo(int width,int height){int max_black,max_white,max_temp,max=0;setisOdd(true);System.out.println("计算机走棋 ...");for(int i = 0; i <= width; i++){for(int j = 0; j <= height; j++){算法判断是否下子if(!chessExist(i,j)){判断白子的最大值max_white=checkMax(i,j,2);判断黑子的最大值max_black=checkMax(i,j,1);max_temp=Math.max(max_white,max_black);if(max_temp>max){max=max_temp;this.x=i;this.y=j;}}}}setX(this.x);setY(this.y);this.arrMapShow[this.x][this.y]=2;}记录电脑下子后的横向坐标public void setX(int x){this.x=x;}记录电脑下子后的纵向坐标public void setY(int y){this.y=y;}获取电脑下子的横向坐标public int getX(){return this.x;}获取电脑下子的纵向坐标public int getY(){return this.y;}计算棋盘上某一方格上八个方向棋子的最大值,这八个方向分别是:左、右、上、下、左上、左下、右上、右下public int checkMax(int x, int y,int black_or_white){ int num=0,max_num,max_temp=0;int x_temp=x,y_temp=y;int x_temp1=x_temp,y_temp1=y_temp;判断右边for(int i=1;i<5;i++){x_temp1+=1;if(x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white)num++;elsebreak;}判断左边x_temp1=x_temp;for(int i=1;i<5;i++){x_temp1-=1;if(x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num<5)max_temp=num;判断上面x_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){y_temp1-=1;if(y_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}判断下面y_temp1=y_temp;for(int i=1;i<5;i++){y_temp1+=1;if(y_temp1>this.height)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;判断左上方x_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){x_temp1-=1;y_temp1-=1;if(y_temp1<0 || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}判断右下方x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<5;i++){x_temp1+=1;y_temp1+=1;if(y_temp1>this.height || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;判断右上方x_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){x_temp1+=1;y_temp1-=1;if(y_temp1<0 || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}判断左下方x_temp1=x_temp;for(int i=1;i<5;i++){x_temp1-=1;y_temp1+=1;if(y_temp1>this.height || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;max_num=max_temp;return max_num;}判断胜负public boolean judgeSuccess(int x,int y,boolean isodd){ int num=1;int arrvalue;int x_temp=x,y_temp=y;if(isodd)arrvalue=2;elsearrvalue=1;int x_temp1=x_temp,y_temp1=y_temp;判断右边胜负for(int i=1;i<6;i++){x_temp1+=1;if(x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}判断左边胜负x_temp1=x_temp;for(int i=1;i<6;i++){x_temp1-=1;break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;判断上方胜负x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){y_temp1-=1;if(y_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}判断下方胜负y_temp1=y_temp;for(int i=1;i<6;i++){y_temp1+=1;if(y_temp1>this.height)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;判断左上胜负x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){y_temp1-=1;if(y_temp1<0 || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}判断右下胜负x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<6;i++){x_temp1+=1;y_temp1+=1;if(y_temp1>this.height || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;判断右上胜负x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){x_temp1+=1;y_temp1-=1;if(y_temp1<0 || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}判断左下胜负x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<6;i++){x_temp1-=1;y_temp1+=1;if(y_temp1>this.height || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}if(num==5)return true;return false;}赢棋后的提示public void showSuccess(JPanel jp){JOptionPane.showMessageDialog(jp,"你赢了","结果",RMATION_MESSAGE);}输棋后的提示public void showDefeat(JPanel jp){JOptionPane.showMessageDialog(jp,"你输了","结果",RMATION_MESSAGE);}}用类MainPanel主要完成如下功能:1、构建一个面板,在该面板上画上棋盘;2、处理在该棋盘上的鼠标事件(如鼠标左键点击、鼠标右键点击、鼠标拖动等)import java.awt.*;import java.awt.event.*;import java.applet.*;import javax.swing.*;import java.io.PrintStream;import javax.swing.JComponent;import javax.swing.JPanel;class MainPanel extends JPanelimplements MouseListener,MouseMotionListener{设定棋盘的宽度和高度private int width,height;private ChessModel cm;根据棋盘模式设定面板的大小MainPanel(ChessModel mm){cm=mm;width=cm.getWidth();height=cm.getHeight();addMouseListener(this);}根据棋盘模式设定棋盘的宽度和高度public void setModel(ChessModel mm){cm = mm;width = cm.getWidth();height = cm.getHeight();}根据坐标计算出棋盘方格棋子的信息(如白子还是黑子),然后调用draw方法在棋盘上画出相应的棋子public void paintComponent(Graphics g){super.paintComponent(g);for(int j = 0; j <= height; j++){for(int i = 0; i <= width; i++){int v = cm.getarrMapShow()[i][j];draw(g, i, j, v);}}}根据提供的棋子信息(颜色、坐标)画棋子public void draw(Graphics g, int i, int j, int v){ int x = 20 * i+20;int y = 20 * j+20;画棋盘if(i!=width && j!=height){g.setColor(Color.darkGray);g.drawRect(x,y,20,20);}画黑色棋子if(v == 1 ){g.setColor(Color.gray);g.drawOval(x-8,y-8,16,16);g.setColor(Color.black);g.fillOval(x-8,y-8,16,16);}画白色棋子if(v == 2 ){g.setColor(Color.gray);g.drawOval(x-8,y-8,16,16);g.setColor(Color.white);g.fillOval(x-8,y-8,16,16);}if(v ==3){g.setColor(Color.cyan);g.drawOval(x-8,y-8,16,16);}}响应鼠标的点击事件,根据鼠标的点击来下棋,根据下棋判断胜负等public void mousePressed(MouseEvent evt){int x = (evt.getX()-10) / 20;int y = (evt.getY()-10) / 20;System.out.println(x+" "+y);if (evt.getModifiers()==MouseEvent.BUTTON1_MASK){cm.play(x,y);System.out.println(cm.getisOdd()+" "+cm.getarrMapShow()[x][y]); repaint();if(cm.judgeSuccess(x,y,cm.getisOdd())){cm.showSuccess(this);evt.consume();ChessFrame.iscomputer=false;}判断是否为人机对弈if(ChessFrame.iscomputer&&!cm.getisExist()){puterDo(cm.getWidth(),cm.getHeight());repaint();if(cm.judgeSuccess(cm.getX(),cm.getY(),cm.getisOdd())){ cm.showDefeat(this);evt.consume();}}}}public void mouseClicked(MouseEvent evt){}public void mouseReleased(MouseEvent evt){}public void mouseEntered(MouseEvent mouseevt){}public void mouseExited(MouseEvent mouseevent){}public void mouseDragged(MouseEvent evt){}响应鼠标的拖动事件public void mouseMoved(MouseEvent moveevt){int x = (moveevt.getX()-10) / 20;int y = (moveevt.getY()-10) / 20;cm.readyplay(x,y);repaint();}}import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;响应退出窗口class ChessWindowEvent extends WindowAdapter{public void windowClosing(WindowEvent e){System.exit(0);}ChessWindowEvent(){}}四.程序调试与运行运行:标准棋盘改进棋盘:扩大棋盘:外观类型二:外观类型三:人机对战:结果:五.结论通过对五子棋游戏的编写,使自己对java语言有了更深的了解。
C语言程序设计课程大型作业答辩
设置鼠标的移动范围
SetMouseArea(int x0,int y0,int x1,int y1) { union REGS regs;
regs.x.ax=7;regs.x.cx=x0;regs.x.dx=x1; int86(0x33,®s;®s); regs.x.ax=8;regs.x.cx=y0;regs.x.dx=y1; int86(0x33,®s,®s); }
鼠标简介
鼠标系统实际上由两个主要元素组成: 鼠标机制和称作鼠标驱动程序的内存驻 留程序。鼠标驱动程序提供与鼠标通信 所需的全部低级支持。此外,它自动维 持鼠标光标位置和发现是否按下了某个 键。一旦装入驱动程序,鼠标就可以被 随后执行的任意程序使用。
鼠标简介续
可以通过PC中断33H访问鼠标和鼠标驱 动程序的各种功能。所选择的特定函数 依赖于中断时AX寄存器的值。三个其它 寄存器(BX、CX和DX)用于把各种参数 传送给鼠标例程。同样,鼠标函数使用 这四个寄存器把鼠标的位置和按钮的状 态返回给调用函数。
取得字节某一位的值
int getbit(unsigned char byte,int bit) { if(bit<0||bit>7)
return 0; return (byte>>bit)&0x1; } 函 数 getbit 用 于 得 出 一 个 字 节 中 每 个 位 (bit)是0还是1。
显示24点阵的汉字
• 提交开发文档,说明程序的主要模块及功能、 主要数据结构及意义、程序采用的核心算法及 实现方式、小组成员的分工及完成情况
C语言高级实验班小组登记表格 小组名称
C语言围棋对弈程序设计
C语言围棋对弈程序设计用C语言编写一个围棋对弈棋室的程序,模仿两人对弈的过程,其中包括自动提子功能,和自动点目功能。
1、围棋的一些基本常识:(1)围棋棋子的“气”见右图1所示黑棋1有4“气”,分别是水平方向上的左右各有一气,垂直方向上的上下各有一气,对角上的不是它的气。
图1棋子外“气”(2)提子(吃子),当下在棋盘上的棋子没有外气时便被提掉(死棋)。
图2、打吃状态图3、提子图2中黑1和白2都只有一口外气,图3黑先下7位白2没有外气被提掉。
图4、倒扑提子过程图5死穴图4演示了倒扑提子全过程,图中左上为原型,左下黑先黑41扑,右上白64提,右下黑93反提把白棋全吃掉。
(3)死穴:上图5黑1、3、5、7四颗黑子中间交差点对白棋来说是死穴,白棋下不进处,但对黑棋不影响可下见图下方。
2、自动提子功能实现下在棋盘上的棋子同类别的在某一方位上可能是一颗或是一片(纵横连续的),要实现自动提子首要的是计算清楚这些同类棋子的所有外气是多少,如果已经没有外气提掉。
一颗棋子下在棋盘上最多有4口外气(见图1),在边上有3气,在角上只有2气。
在程序中对于每一颗棋子检测外气描述如下:检测棋子可能有的方向上(上、下、左、右)是否有棋子,如果有,那么在该方向上没有外气。
如果在所有的方向上都有棋子,那么它在棋盘上是无外气的。
如果在它所有方向上没有同类棋子而且又无外气,那么该颗棋子可以提掉(见图3)。
如果在某一方向上有同类棋子,必须计算完连在一起同类的所有外气。
如果整片无外气,该片可以提掉(见图4)。
为了方便操作,在程序中对棋子定义了数据结构:typedef struct{int r; //行号int c; //列号int s; //棋类别int f; //棋子存活期int q; //棋子外气数int l; //棋子队列号int n; //有无棋子}QZ;QZ QiZiBF[400];QZ BOXBF[19][19];检测棋盘上某一位置的外气实现函数:int Get_QI(int r,int c){int t=0;if(r>0)if(BOXBF[r-1][c].n==0)t++;if(r<18)if(BOXBF[r+1][c].n==0)t++;if(c>0)if(BOXBF[r][c-1].n==0)t++;if(c<18)if(BOXBF[r][c+1].n==0)t++;return t;}为了更好的计算棋子的外气,把同类连在一起的棋子(纵横方向相连)编成一个列队,就是用一个统一的代号表示它们。