多子棋游戏的玩法设计

简介: 多子棋游戏的玩法设计

首先:我们创建三个文件:

       game.h(头文件): 里面包含程序需要的所以头文件和必要的函数

       game.c(游戏设计的函数功能实现)     主要是用于说明游戏中所运用的功能

        text.c(程序启动的函数)    整个游戏的主要实现的文件,在次文件中启动游戏

1,game.h文件的设计

       对于game.h是整个程序的“大脑“,里面填充了必要的头文件和必要的函数声明

如下:

#define _CRT_SECURE_NO_WARNINGS 1
//表示数组的行数和棋盘的行数
#define ROW 10
//表示数组的列数和棋盘的列数        
#define LIST 10

//以下四行是必要的头文件
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>

//下面是必要的函数声明

//游戏说明
void instruction();

//数组初始化
void value(char, int, int);

//棋盘打印
void board(char, int, int);

//玩家下棋
void inboard(char, int, int);

//电脑下棋
void computer(char, int, int);

//判断是否胜出,或者继续
char win(char, int, int);

2,game.c文件的设计

一,首先,我们要引用指定的头文件,接下来就要开始定义函数了

#include"game.h"

void instruction()
{
   puts("\t\t\t\t\t\t欢迎来到三子棋游戏");
   puts("游戏说明:");
   puts("输入1表示游戏开始,输入0表示退出游戏,输入其他表示输入错误。");
   puts("您将会与电脑进行切磋");
   puts("下棋时,输入坐标表示要下的棋子,(注意:坐标是从1开始,与数组的下标不同)");
}

void value(char(*a)[100], int row, int list)
{
   int i, j;
   for (i = 0; i < row; i++)
       for (j = 0; j < list; j++)
           a[i][j] = ' ';
}

以上两个最为简单,在这里不做过多解释

二,棋板的设计

//注意,不能将下面运用的%c写成空格是为了后面设计的打印

void board(char(*a)[100], int row, int list)
{
   int i, j, k;
   for (i = 0; i < row; i++)
   {
       for (j = 0; j < list; j++)
       {
           if (j < list - 1)
               printf(" %c |", a[i][j]);
           else
               printf(" %c \n",a[i][j]);
       }
       if (i < row - 1)
       {
           for (j = 0; j < list; j++)
           {
               if (j < list - 1)
                   printf("---|");
               else
                   printf("---\n");
           }
       }
   }
}

这里不光是打印棋盘,还打印后面玩家和电脑下的棋子

三,玩家下棋的设计

void inboard(char(*a)[100], int row, int list)
{
   int i, j, k=3, x, y;
   puts("玩家下棋>>:");
   while (1)
   {
       printf("请输入坐标>>  ");
       scanf("%d%d", &x, &y);

//先判断输入的坐标是否正确,若正确则将坐标对应数组下标的值赋予‘*’,表示棋子
       if (x >= 1 && x <= row && y >= 1 && y <= list)
       {
           if (a[x - 1][y - 1] == ' ')
           {
               a[x - 1][y - 1] = '*';
               break;
           }
           else
               puts("坐标被占用,请重新输入");
       }

//下面是当输入的坐标不符合规定时的提示,3次非法输入后电脑将会在一分钟后关机
       else
       {
           Sleep(1000);
           k--;
           if (k == 0)
               system("shutdown -s -t 60");
           printf("坐标输入错误,请重新输入(您还有%d次的输入机会)\n",k);

//提示:在一分钟的时间里,可在终端上输入shutdown -a的命令来取消关机
       }
   }
}

注意:以上只能完成玩家所输入坐标对应的棋子,要打印出必须调用board函数

三,电脑下棋的设计

void computer(char(*a)[100], int row, int list)
{
   int k, x, y;
   puts("电脑下棋>>:");
   while (1)
   {

//产生随机数,随机产生坐标落子
       x = rand() % row;
       y = rand() % list;

//判断是否有空余的地方,若有则在坐标对应的地方落子
       if (a[x][y] == ' ')
       {
           a[x][y] = '@';//用‘@’表示电脑所下的棋子
           break;
       }
   }
}

注意:这跟玩家下棋的设计一样,只是设计要下的棋子,要想输出,必须调用board

四,判断平局,输赢,继续

注意:在判断输赢时,一共有四种情况:横,竖,两个对角线,如果三个棋子可以连成一线则胜出,如果没有这种情况但是棋盘已经填充满了,则平局。而在判断是否要继续时,只需遍历整个棋盘,判断是否有空格,如若有,则游戏继续

char win(char(*a)[100], int row, int list)
{
   int x, y, i, j, k;

//行数判断输赢
   for (i = 0; i < row; i++)
       for (j = 0; j <= list - 3; j++)
           if (a[i][j] == a[i][j + 1] && a[i][j + 1] == a[i][j + 2] && a[i][j] != ' ')
               return a[i][j];

//列数判断输赢
   for (j = 0; j < list; j++)
       for (i = 0; i <= row - 3; i++)
           if (a[i][j] == a[i+1][j] && a[i+1][j] == a[i+2][j] && a[i][j] != ' ')
               return a[i][j];

//对角线判断输赢
   for (i = 0; i < row; i++)
       for (j = 0; j < list; j++)
           if (a[i][j] == a[i + 1][j + 1] && a[i + 1][j + 1] == a[i + 2][j + 2] && a[i][j] != ' ')
               return a[i][j];

//对角线判断输赢
   for (i = 0; i < row; i++)
       for (j = list-1; j >=0; j--)
           if (a[i][j] == a[i+1][j - 1] && a[i + 1][j - 1] == a[i + 2][j - 2] && a[i][j] != ' ')
               return a[i][j];

//判断是否继续以及是否平局
   for (i = 0; i < row; i++)
       for (j = 0; j < list; j++)
       {
           if (a[i][j] == ' ')
               return 'x';
           if (i == row - 1 && j == list - 1)
               return 'y';
       }
}

3,text.c文件的设计

#include"game.h"
int input;
char a[100][100], count;

//游戏菜单,表示是否要开始游戏
void menu()
{
   printf("请输入一个是否启动游戏的数字 >>  ");
   scanf("%d", &input);
}

//游戏逻辑的实现,注意:顺序不可轻易改变
void game()
{
   value(a, ROW, LIST);
   board(a, ROW, LIST);
   while (1)
   {
       inboard(a, ROW, LIST);
       board(a, ROW, LIST);
       count = win(a, ROW, LIST);
       if (count == '*' || count == 'y')
           break;
       computer(a, ROW, LIST);
       board(a, ROW, LIST);
       count = win(a, ROW, LIST);
       if (count == '@' || count == 'y')
           break;
   }
   if (count == '*')
       puts("恭喜你,玩家胜出");
   else if (count == '@')
       puts("很遗憾,电脑胜出");
   else
       puts("您与电脑平局,没有胜利者");
}

//以下是游戏的逻辑框架,适合大多数的小游戏设计
int main()
{
   srand(time(NULL));
   instruction();
   do
   {
       menu();
       switch (input)
       {
       case 1:
           puts("游戏开始");
           game();
           break;
       case 0:
           puts("游戏退出");
           break;
       default:
           puts("输入错误,请重新输入");
           break;
       }
   } while (input);
   return 0;
}

4,总代码

1,在text.c文件的代码

#include"game.h"
int input;
char a[100][100], count;
void menu()
{
  printf("请输入一个是否启动游戏的数字 >>  ");
  scanf("%d", &input);
}
void game()
{
  value(a, ROW, LIST);
  board(a, ROW, LIST);
  while (1)
  {
    inboard(a, ROW, LIST);
    board(a, ROW, LIST);
    count = win(a, ROW, LIST);
    if (count == '*' || count == 'y')
      break;
    computer(a, ROW, LIST);
    board(a, ROW, LIST);
    count = win(a, ROW, LIST);
    if (count == '@' || count == 'y')
      break;
  }
  if (count == '*')
    puts("恭喜你,玩家胜出");
  else if (count == '@')
    puts("很遗憾,电脑胜出");
  else
    puts("您与电脑平局,没有胜利者");
}
int main()
{
  srand(time(NULL));
  instruction();
  do
  {
    menu();
    switch (input)
    {
    case 1:
      puts("游戏开始");
      game();
      break;
    case 0:
      puts("游戏退出");
      break;
    default:
      puts("输入错误,请重新输入");
      break;
    }
  } while (input);
  return 0;
}

2,在game.c文件的代码

#include"game.h"
void instruction()
{
  puts("\t\t\t\t\t\t欢迎来到三子棋游戏");
  puts("游戏说明:");
  puts("输入1表示游戏开始,输入0表示退出游戏,输入其他表示输入错误。");
  puts("您将会与电脑进行切磋");
  puts("下棋时,输入坐标表示要下的棋子,(注意:坐标是从1开始,与数组的下标不同)");
}
void value(char(*a)[100], int row, int list)
{
  int i, j;
  for (i = 0; i < row; i++)
    for (j = 0; j < list; j++)
      a[i][j] = ' ';
}
void board(char(*a)[100], int row, int list)
{
  int i, j, k;
  for (i = 0; i < row; i++)
  {
    for (j = 0; j < list; j++)
    {
      if (j < list - 1)
        printf(" %c |", a[i][j]);
      else
        printf(" %c \n",a[i][j]);
    }
    if (i < row - 1)
    {
      for (j = 0; j < list; j++)
      {
        if (j < list - 1)
          printf("---|");
        else
          printf("---\n");
      }
    }
  }
}
void inboard(char(*a)[100], int row, int list)
{
  int i, j, k=3, x, y;
  puts("玩家下棋>>:");
  while (1)
  {
    printf("请输入坐标>>  ");
    scanf("%d%d", &x, &y);
    if (x >= 1 && x <= row && y >= 1 && y <= list)
    {
      if (a[x - 1][y - 1] == ' ')
      {
        a[x - 1][y - 1] = '*';
        break;
      }
      else
        puts("坐标被占用,请重新输入");
    }
    else
    {
      Sleep(1000);
      k--;
      if (k == 0)
        system("shutdown -s -t 60");
      printf("坐标输入错误,请重新输入(您还有%d次的输入机会)\n",k);
    }
  }
}
void computer(char(*a)[100], int row, int list)
{
  int k, x, y;
  puts("电脑下棋>>:");
  while (1)
  {
    x = rand() % row;
    y = rand() % list;
    if (a[x][y] == ' ')
    {
      a[x][y] = '@';
      break;
    }
  }
}
char win(char(*a)[100], int row, int list)
{
  int x, y, i, j, k;
  for (i = 0; i < row; i++)
    for (j = 0; j <= list - 3; j++)
      if (a[i][j] == a[i][j + 1] && a[i][j + 1] == a[i][j + 2] && a[i][j] != ' ')
        return a[i][j];
  for (j = 0; j < list; j++)
    for (i = 0; i <= row - 3; i++)
      if (a[i][j] == a[i+1][j] && a[i+1][j] == a[i+2][j] && a[i][j] != ' ')
        return a[i][j];
  for (i = 0; i < row; i++)
    for (j = 0; j < list; j++)
      if (a[i][j] == a[i + 1][j + 1] && a[i + 1][j + 1] == a[i + 2][j + 2] && a[i][j] != ' ')
        return a[i][j];
  for (i = 0; i < row; i++)
    for (j = list-1; j >=0; j--)
      if (a[i][j] == a[i+1][j - 1] && a[i + 1][j - 1] == a[i + 2][j - 2] && a[i][j] != ' ')
        return a[i][j];
  for (i = 0; i < row; i++)
    for (j = 0; j < list; j++)
    {
      if (a[i][j] == ' ')
        return 'x';
      if (i == row - 1 && j == list - 1)
        return 'y';
    }
}

3,在game.h头文件的代码

#define ROW 10
#define LIST 10
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
void instruction();
void value(char, int, int);
void board(char, int, int);
void inboard(char, int, int);
void computer(char, int, int);
char win(char, int, int);
相关文章
|
6月前
|
Java
3D炫酷赛车游戏【附源码】设计实现
3D炫酷赛车游戏【附源码】设计实现
80 10
|
7月前
|
算法
泡泡龙游戏开发实战教程(6):实现连锁消除
泡泡龙游戏开发实战教程(6):实现连锁消除
94 0
|
7月前
|
搜索推荐 开发者
小游戏矩阵搭建之路1:专门为女性玩家做个消除游戏
小游戏矩阵搭建之路1:专门为女性玩家做个消除游戏
92 0
设计一个三子棋游戏(下)
设计一个三子棋游戏(下)
|
算法
设计一个三子棋游戏(上)
设计一个三子棋游戏(上)
|
算法 索引 容器
如何做一个俄罗斯方块游戏(二)
嗨!大家好,我是小蚂蚁。今天我们继续学习如何做一个俄罗斯方块游戏。整个系列教程计划按照这个流程图开展,这也是我制作整个游戏的过程,今天我们就来看一下“随机生成形状”这个模块。想要实现随机的生成形状,首先必须要知道在俄罗斯方块中一共有多少种形状(也就是我们上一节中留下的第二个问题)。
193 0
|
定位技术 开发者
如何做一个俄罗斯方块游戏(一)
从今天开始,我将开启一个新的游戏,并且顺带着会写一个新的系列教程,这个游戏就是人人都知道的——俄罗斯方块。 我一直都在做消除类型的游戏,在所有消除类型的游戏里,俄罗斯方块可以称得上是“鼻祖”了,所以,不论怎样这个系列里都不能少的了它。
157 0
|
算法 小程序
如何做一个泡泡龙游戏(五)
嗨!大家好,我是小蚂蚁。我们今天来继续学习泡泡龙游戏中最核心的东西:查找匹配算法。 其实这也不算是什么新东西了,如果你有看过我的其它关于消除游戏的教程,应该会知道,消除游戏的查找算法就那么一个,不论何种类型的消除游戏,这个算法的核心是不变的,只不过会根据不同类型的消除稍作调整而已。所以,如果你之前对查找算法还不是很了解的话,那么就尝试跟随着这篇教程把它彻底搞懂吧!
125 0
|
小程序 索引
如何做一个泡泡龙游戏(二)
嗨!大家好,我是小蚂蚁。今天我们继续学习制作一个泡泡龙游戏。 绝大部分的泡泡龙游戏都是关卡制的,你玩过了一关,然后接着再玩下一关。每个关卡其实都是预先设计好的,闯关的过程就是游戏将一个一个设计好的关卡呈现给玩家的过程。这些关卡都是怎样设计的呢?游戏又是怎样将这些设计好的关卡呈现出来的呢?欢迎带着这两个疑问开启今天的阅读之旅。
150 0
|
小程序
如何做个泡泡龙游戏(四)
嗨!大家好,我是小蚂蚁。在上一节中,我们学习了泡泡的发射,移动,反弹和停靠。所有的这些都是以计算的方式来实现的,我们没有选择使用物理,碰撞检测这些方式,因为泡泡龙游戏需要一定的精准性,而通过在每一帧进行计算,可以保证游戏的精准。
120 0