五子棋项目

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<time.h>
  4 #include<easyx.h>
  5 
  6 #define ROW 15
  7 #define COL 15
  8 #define SIZE 40
  9 /*
 10 
 11     1. 五子棋的规则  棋盘上  黑白棋走    
 12 
 13       棋盘--->二维数组  旗子    黑-1  白1  空白0
 14 
 15       判断输赢  连成5个  判断落子附近有没有成5个就行
 16 
 17       下棋   先白 然后黑   写一个函数 鼠标点击的位置 转换成数组的下标
 18         对应的元素有没有值   不赋值 视为无效操作
 19                         否则   下棋 
 20 
 21 
 22 
 23      悔棋  记录每一步的操作  
 24      判断棋盘满--->步数>=棋盘大小
 25      记录当前棋盘  存档  读档
 26      认输  可以设置一个键  按下这个键就认输
 27 
 28 
 29     游戏结束  1.一方成了5
 30              2.格子满了 无法放新的棋
 31 
 32 
 33 
 34     返回值只能返回一个数据 --->返回多个  数组?堆内存可以  或者结构体
 35 
 36 */
 37 typedef struct coor
 38 {
 39     int x;
 40     int y;
 41 }COOR;
 42 
 43 void drawMap(int map[][COL]);
 44 COOR play(int map[][COL],int flag);
 45 int judge(int map[][COL], int x, int y);
 46 
 47 int main()
 48 {
 49     int map[ROW][COL] = { 0 };
 50 
 51     initgraph(COL * SIZE, ROW * SIZE);
 52     COOR add;//得到点击的位置
 53 
 54     int flag = 1;
 55     while (1)
 56     {
 57         drawMap(map);
 58         add=play(map,flag);
 59 
 60         //判断游戏是否结束
 61         if (judge(map, add.x, add.y) == 1)
 62         {
 63             drawMap(map);
 64             //游戏结束
 65             if (flag == 1) //白赢了
 66             {
 67                 MessageBox(0, L"白win", L"good", MB_OK);
 68                 break;
 69             }
 70             else
 71             {
 72                 MessageBox(0, L"黑win", L"good", MB_OK);
 73                 break;
 74             }
 75         }
 76 
 77 
 78 
 79         flag = -flag;
 80     }
 81     
 82     getchar();
 83     closegraph();
 84     return 0;
 85 }
 86 
 87 void  drawMap(int map[][COL])
 88 {
 89     BeginBatchDraw();
 90     setbkcolor(RGB(32, 178, 170));
 91     cleardevice();
 92     //  竖着 20,20     20,20+40*COL
 93     for (int i = 0; i < ROW; ++i)//画横线
 94     {
 95         line(SIZE / 2 , SIZE / 2+ i*SIZE, SIZE*ROW-  SIZE / 2 ,SIZE/2+i*SIZE);
 96     }
 97     for (int j = 0; j <= COL; ++j)
 98     {
 99         line(j*SIZE-SIZE/2, SIZE/2, j*SIZE-SIZE/2, SIZE*COL -SIZE/2);
100     }
101 
102     for (int i = 0; i < ROW; ++i)
103     {
104         for (int j = 0; j < COL; ++j)
105         {
106             switch (map[i][j])
107             {
108             case -1://黑棋
109                 setfillcolor(BLACK);
110                 solidcircle(j*SIZE+SIZE/2, i*SIZE+SIZE/2, SIZE / 3);
111                 break;
112             case 1://白棋
113                 setfillcolor(WHITE);
114                 solidcircle(j*SIZE + SIZE / 2, i*SIZE + SIZE / 2, SIZE / 3);
115                 break;
116             default:
117                 break;
118             }
119         }
120     }
121     EndBatchDraw();
122 }
123 
124 COOR play(int map[][COL], int flag)//如果是黑 -1  如果是白  1
125 {
126     MOUSEMSG msg;
127     while (1)
128     {
129         msg = GetMouseMsg();
130         switch (msg.uMsg)
131         {
132         case WM_LBUTTONDOWN:
133         //    msg.y/SIZE-->行下标
134         //    msg.x/SIZE-->列下标
135             if (map[msg.y / SIZE][msg.x / SIZE] == 0)
136             {
137                 map[msg.y / SIZE][msg.x / SIZE] = flag;
138                 COOR add = { msg.y / SIZE, msg.x / SIZE };
139                 return add;//返回点击的位置
140             }
141 
142             break;
143         }
144     }
145 }
146 
147 
148 int judge(int map[][COL], int x, int y)
149 {
150     //判断有没有成5的
151     int arr[4] = { 0 };//四个方向
152     //判断上下
153     int i = 1;
154     while (x - i >= 0 && map[x - i][y] == map[x][y]){ ++i, arr[0]++; }
155     i = 1;
156     while (x+i<ROW&&map[x + i][y] == map[x][y]){ ++i, arr[0]++; }
157 
158     //左右
159     i = 1;
160     while (y - i >= 0 && map[x][y - i] == map[x][y]){ ++i, arr[1]++; }
161     i = 1;
162     while (y + i<COL&&map[x ][y+ i] == map[x][y]){ ++i, arr[1]++; }
163 
164     //左上 右下
165     i = 1;
166     while (x - i >= 0&&y-i>=0&& map[x - i][y-i] == map[x][y]){ ++i, arr[2]++; }
167     i = 1;
168     while (x + i<ROW&&y+i<COL&&map[x + i][y+i] == map[x][y]){ ++i, arr[2]++; }
169 
170     //左下右上
171     i = 1;
172     while (x - i >= 0 && y + i <COL && map[x - i][y + i] == map[x][y]){ ++i, arr[3]++; }
173     i = 1;
174     while (x + i<ROW&&y - i>=0&&map[x + i][y - i] == map[x][y]){ ++i, arr[3]++; }
175 
176     for (int i = 0; i < 4; ++i)
177     {
178         if (arr[i] >= 4) return 1;//表示结束  赢
179     }
180     return 0;//没有赢
181 }

 

转载于:https://www.cnblogs.com/liugangjiayou/p/10686886.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include<graphics.h> #include<conio.h> #include <mmsystem.h> #pragma comment(lib,"winmm.lib") void Beginning(); //开始图片 void Background(); //显示背景 void ShowPlate(); //显示棋盘 void PlayGame(); //玩游戏 void Judgewin(int,int); //判断输赢 void Blackwin(); //黑棋赢 void Whitewin(); //白棋赢 bool flag=true; //走棋顺序 int piece[16][16]; //棋子变量 int ti,tj; int f=1; void main() { for(int i=0;i<16;i++) for(int j=0;j<16;j++) piece[i][j]=0; //初始化棋子变量 initgraph(965,642); //设置窗口大小 mciSendString("play 2.mp3",0,0,0);//播放背景音乐 Background(); //显示背景 PlayGame(); //玩游戏 getch(); //保持窗口开着 } void Background() { IMAGE img; getimage(&img, "2.jpg"); putimage(0,0, &img); //设置背景图片 } void ShowPlate() { setfillstyle(RGB(213,176,146)); bar(270,30,730,490); //棋盘大小 for(int x=290,y=50;x<=710,y<=470;x+=30,y+=30) //画棋盘线 { setcolor(BLACK); line(x,50,x,470); line(290,y,710,y); } setfillstyle(BLACK); bar(284,44,286,476); bar(284,44,716,46); bar(714,44,716,476); bar(284,474,716,476);//棋盘线周围的一圈粗线 fillellipse(380,140,4,4); fillellipse(620,140,4,4); fillellipse(380,380,4,4); fillellipse(620,380,4,4); fillellipse(500,260,4,4);//棋盘的五个小黑点 setcolor(BLACK); setfillstyle(RGB(213,176,146)); bar3d(800,100,900,140,0,0); bar3d(800,200,900,240,0,0); bar3d(800,300,900,340,0,0); setfont(24,0,"华文行楷"); outtextxy(805,110,"重新开始");//重新开始 按钮 outtextxy(827,210,"悔棋");//悔棋按钮 outtextxy(827,310,"投降");//投降按钮 setcolor(RGB(213,176,146)); setfillstyle(WHITE); fillellipse(820,28,20,20); setcolor(RGB(213,176,146)); setfillstyle(BLACK); fillellipse(880,28,20,20); for(int i=0;i<15;i++) { for(int j=0;j<15;j++) { if(piece[i][j]==-1) { setcolor(WHITE); setfillstyle(WHITE); fillellipse(290+j*30,50+i*30,12,12); } else if(piece[i][j]==1) { setcolor(BLACK); setfillstyle(BLACK); fillellipse(290+j*30,50+i*30,12,12); } } } } void PlayGame() { int h=0; int y=0; int Y; int ti=0,tj=0; while(f) { MOUSEMSG msg=GetMouseMsg(); //得到鼠标输入 while(msg.uMsg==WM_LBUTTONUP) { h++; if(h==1) { ShowPlate(); } else break; } if(h>2) { int a,b,c,d; a=(msg.x-290)%30; b=(msg.y-50)%30; c=(msg.x-290)/30+a/15;//落子点的横坐标 d=(msg.y-50)/30+b/15;//落子点的纵坐标 if(msg.x>800&&msg.x<840&&msg.y>8&&msg.y<48&&y==0) flag=false; else if(msg.x>860&&msg.x<900&&msg.y>8&&msg.y<48&&y==0) flag=true; if(a==15||b==15) //判断是否在两格中间 continue; if(msg.uMsg==WM_LBUTTONUP&&piece[d][c]==0&&(c>=0&&c<15&&d>=0&&d<15)) //判断是否在棋盘内且无棋子 { mciSendString("play 3.mp3",0,0,0); if(flag==true) { piece[d][c]=1; setcolor(BLACK); setfillstyle(BLACK); fillellipse(290+c*30,50+d*30,12,12); flag=false; ti=d; tj=c; y++; } else { piece[d][c]=-1; setcolor(WHITE); setfillstyle(WHITE); fillellipse(290+c*30,50+d*30,12,12); flag=true; ti=d; tj=c; y++; } } Judgewin(c,d); if(msg.uMsg==WM_LBUTTONUP) if((msg.x>=800&&msg.x<=900)&&(msg.y>=300&&msg.y<=340)) //投降 { if(flag==true) Whitewin(); else Blackwin(); } if(msg.uMsg==WM_LBUTTONUP) if((msg.x>=800&&msg.x<=900)&&(msg.y>=100&&msg.y<=140)) //中途重新开始 { y=0; for (c=0;c<16;c++) { for (d=0;d<16;d++) { piece[c][d]=0; } } ShowPlate(); } if(msg.uMsg==WM_LBUTTONUP) { if ((msg.x>=800&&msg.x<=900)&&(msg.y>=200&&msg.y<=240)&&(Y!=y)) //悔棋 { Y=y; if(flag==true) flag=false; else flag=true; piece[ti][tj]=0; ShowPlate(); } } } while(!f) //结束后重新开始 { MOUSEMSG msg=GetMouseMsg(); if(msg.uMsg==WM_LBUTTONUP) if((msg.x>=800&&msg.x<=900)&&(msg.y>=100&&msg.y<=140)) { for (int c1=0;c1<16;c1++) { for (int d1=0;d1<16;d1++) { piece[c1][d1]=0; } } ShowPlate(); f=1; PlayGame(); } } } } void Judgewin(int c,int d) { for(int i=0;i<15;i++)//判断是否五子连珠——横向 { int s=0; for(int j=i;j<i+5;j++) { s=s+piece[d][j]; if(s==5) Blackwin(); if(s==-5) Whitewin(); } } for(int m=0;m<15;m++)//判断是否五子连珠——纵向 { int s=0; for(int n=m;n<m+5;n++) { s=s+piece[n][c]; if(s==5) Blackwin(); if(s==-5) Whitewin(); } } for(int p=d-5,q=c-5;p<15;p++,q++)//判断是否五子连珠——左上到右下 { int s=0; for(int t=0;t<5;t++) { s=s+piece[p+t][q+t]; if(s==5) Blackwin(); if(s==-5) Whitewin(); } } for(int P=d+5,Q=c-5;Q<15;P--,Q++)//判断是否五子连珠——左下到右上 { int s=0; for(int t=0;t<5;t++) { s=s+piece[P-t][Q+t]; if(s==5) Blackwin(); if(s==-5) Whitewin(); } } } void Blackwin() { setcolor(WHITE); setfillstyle(BLACK); fillellipse(500,260,70,30); outtextxy(470,250,"黑子赢"); f=0; mciSendString("play 4.mp3",0,0,0); } void Whitewin() { setcolor(BLACK); setfillstyle(WHITE); fillellipse(500,260,70,30); outtextxy(470,250,"白子赢"); f=0; mciSendString("play 4.mp3",0,0,0); }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值