C语言——三子棋游戏

简单方法实现三子棋游戏

思想:(一)主函数中可以有一个测试函数test(),完成用户的整个游戏体验。
(二)test()函数中应该有菜单menu()和游戏game()部分。
game()函数为重点完成部分。


(三) game()函数可单独创建一个源文件game.c
game()函数所需完成的内容:
1,棋盘有行和列,因此首先定义一个二维数组arr[ROW][COL]。ROW为行,COL为列。
2,在游戏开始前将数组内容赋值为空格。----调用InIt()函数。

3,先把棋盘打印出来,展示给玩家。----调用Display()函数。

4,开始玩游戏。玩游戏部分定义在循环中,游戏结束后才可跳出循环。
(1)电脑走。----调用ComputerGo()函数。

每走一步展示一次棋盘。----调用函数Display()。

每走一步判断一次输赢。----调用IsWin()函数。

(2)玩家走。----调用PlayerGo()函数。


每走一步展示一次棋盘。----调用函数Display()。

每走一步判断一次输赢。----调用IsWin()函数。


(四)创建一个头文件game.h
将函数的声明,引用的头文件,define定义的标识符常量都放在所定义的头文件中,则源文件中就可以省略。
每个源文件中只需声明头文件,就可调用头文件中的所有内容。

</font><br /> 

头文件如下:

#ifndef  __GAME__H__
#define  __GAME__H__

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define  ROW 3
#define  COL 3

void menu();
void InIt(char arr[ROW][COL], int row, int col);
void Display(char arr[ROW][COL],int row,int col);
void ComputerGo(char arr[ROW][COL], int row, int col);
void PlayerGo(char arr[ROW][COL], int row, int col);
char IsWin(char arr[ROW][COL], int row, int col);

#endif  __GAME__H__

游戏主体部分如下:

#define _CRT_SECURE_NO_WARNINGS

#include "game.h"
#include <stdlib.h>

//打印菜单
void menu()
{
 printf("**********************\n");
 printf("****** 1. play  ******\n");
 printf("****** 0. exit  ******\n");
 printf("**********************\n");
}

//游戏函数
void game()
{
 char arr[ROW][COL] = { 0 };
 char ret = 0;
 
 //输入坐标全为空格
 InIt(arr, ROW, COL);
 
 //打印棋盘
 Display(arr, ROW, COL);
 while (1)
 {
 
  //(1)电脑走
     //电脑赢--'*'
     //玩家赢--'1'
     //平局----'='
     //游戏继续-' '
  ComputerGo(arr, ROW, COL);
  Display(arr, ROW, COL);
  ret = IsWin(arr, ROW, COL);
  if (' ' != ret)
  {
   if ('*' == ret)
   {
    printf("电脑赢。\n");
    break;
   }
   if ('=' == ret)
   {
    printf("平局。\n");
    break;
   }
  }
  else
  {
   printf("游戏继续。。。\n");
  }
  
  //(2)玩家走
  PlayerGo(arr, ROW, COL);
  Display(arr, ROW, COL);
  ret = IsWin(arr, ROW, COL);
  if (' ' != ret)
  {
   if ('1' == ret)
   {
    printf("玩家赢。\n");
    break;
   }
   if ('=' == ret)
   {
    printf("平局。\n");
    break;
   }
  }
  else
  {
   printf("游戏继续。。。\n");
  }
 }
}

//测试函数
void test()
{
 int input = 0;
 do
 {
  menu();
  printf("请选择:>");
  scanf("%d", &input);
  switch (input)
  {
  case 1:
   game();
   break;
  case 0:
   printf("退出游戏......\n");
   break;
  default:
   printf("输入错误!!请重新输入!!!\n");
   break;
  }
 } while (input);
}

//主函数
int main()
{
     test();
     system("pause");
     return 0;
}

游戏部分函数如下:

#define _CRT_SECURE_NO_WARNINGS
#include "game.h"

//输入坐标,全部坐标赋值为空格
void InIt(char arr[ROW][COL], int row, int col)
{
 int i = 0;
 int j = 0;
 for (i = 0; i < row; i++)
 {
  for (j = 0; j < col; j++)
  {
   arr[i][j] = ' ';
  }
 }
}

//展示棋盘
void Display(char arr[ROW][COL], int row, int col)
{
 int i = 0;
 int j = 0;
 for (i = 0; i < row ; i++)
 {
  for (j = 0; j < col; j++)
  {
   printf(" %c ", arr[i][j]);
   if (j < col - 1)
   {
    printf("|");
   }
   else
   {
    printf("\n");
   }
  }
  if (i < row - 1)
  {
   for (j = 0; j < col; j++)
   {
    printf("___");
    if (j < col - 1)
    {
     printf(".");
    }
    else
    {
     printf("\n");
    }
   }
  }
  printf("\n");
 }
}

//电脑走
void ComputerGo(char arr[ROW][COL], int row, int col)
{
 srand((unsigned)time(NULL));
 printf("电脑走:\n\n");
 while (1)
 {
  int x = rand() % row;
  int y = rand() % col;
  
  //坐标合法
  if (x >= 0 && x < row && y >= 0 && y < col )
  {
  
   //判断坐标是否被占用
   if (' ' == arr[x][y])
   {
    arr[x][y] = '*';
    break;
   }
  }
  
  //坐标不合法,此处不用再判断,如果不满足以上条件,直接进入下一次循环
 }
}

//玩家走
void PlayerGo(char arr[ROW][COL]。, int row, int col)
{
 int x = 0;
 int y = 0;
 while (1)
 {
  printf("玩家走:> ");
  
  //输入的坐标以玩家体验为前提,输入坐标(1,1)则表示arr[0][0],以此类推
  scanf("%d%d", &x, &y);
  printf("\n\n");
  
  //坐标合法
  if (x-1 >= 0 && x-1 < row && y-1 >= 0 && y-1 < col)
  { 

//判断坐标是否被占用
   if (' ' == arr[x-1][y-1])
   {
    arr[x - 1][y - 1] = '1';
    break;
   }
   else
   {
    printf("该坐标已被占用,请重新输入!!!\n");
   }
  }

//坐标不合法
  else
  {
   printf("输入的坐标不符合要求,请重新输入!!!\n");
  }
 }
}

//判断谁赢
   //1.电脑赢
   //.玩家赢
   //3.平局
   //4.游戏继续
char IsWin(char arr[ROW][COL], int row, int col)
{
 int x = 0;
 int y = 0;
 int count = 0;
 
 //判断谁赢--电脑赢,玩家赢,平局
 //判断行
 for (x = 0; x < row; x++)
 {
  if (arr[x][0] == arr[x][1] && arr[x][1] == arr[x][2] && arr[x][0] != ' ')
  {
   return arr[x][0];
   break;
  }
 }
 
 //判断列
 for (x = 0; x < col; x++)
 {
  if (arr[0][x] == arr[1][x] && arr[1][x] == arr[2][x] && arr[0][x] != ' ')
  {
   return arr[0][x];
   break;
  }
 }
 
 //判断对角线
 if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] != ' ')
 {
  return arr[1][1];
 }
 if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ')
 {
  return arr[1][1];
 }
 
 //平局 和 游戏继续 
 for (x = 0; x < row; x++)
 {
  for (y = 0; y < col; y++)
  {
   if (' ' != arr[x][y])
   {
    count++;
   }
  }
 }
 if (row * col == count)
 {
  return '=';
 }
 else
 {
  return ' ';
 }
 }

猜你喜欢

转载自blog.csdn.net/xmfjmcwf/article/details/83049869