• 五子棋项目


      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 }
  • 相关阅读:
    嵌套矩形
    Multiplication Puzzle
    animate.css在vue项目中的使用
    服务器相关知识
    webpack-cli安装和插件的安装
    新买阿里云linux服务器如何设置账号密码xshell远程登陆
    主流请求库axios库的使用
    什么是回调函数
    js------match() 方法
    cookie
  • 原文地址:https://www.cnblogs.com/liugangjiayou/p/10686886.html
Copyright © 2020-2023  润新知