1. 程式人生 > >完成簡單的三子琪遊 戲

完成簡單的三子琪遊 戲

基本思路

  1. 初始化棋盤:
  2. 下棋:
  3. 判斷輸贏

實現

1、初始化棋盤

void init_board(char board[ROW][COL], int row, int col)
{
 memset(&board[0][0],' ',row*col*sizeof(board[0][0]));
}

2、列印棋盤

void print_board(char board[ROW][COL], int row, int col)
{
 int i = 0;
 for (i = 0; i < row; i++)
 {
  int j =
0; for (j = 0; j < col; j++) { printf(" %c ",board[i][j]); if (j < col - 1) printf("|"); } printf("\n"); for (j = 0; j < col; j++) { printf("---"); if (j < col - 1) { printf("|"); } } printf("\n"); } }

3、下棋
第一步:玩家走

void play_move(char board[ROW]
[COL], int row, int col,int n) { int x = 0, y = 0; while (1) { printf("請玩家輸入座標:->"); scanf("%d%d",&x,&y); if (x >=1 && x <= n&& y>=1 && y <=n && board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = 'X'; break; } else printf("輸入錯誤請重新輸入\n"
); } }

第二步:電腦走

void compture_move(char board[ROW][COL], int row, int col,int n)
{
 while (1)
 {
  
  int x = rand() % n;
  int y = rand() % n;
  printf("電腦走\n");
  if (board[x][y] == ' ')
  {
   board[x][y] = 'Y';
   break;
  }
 }
}

4、判斷輸贏

char IF_WIN(char board[ROW][COL], int row, int col,int n )
{
 int i = 0;
 //判斷行是否相等,如果相等返回此行第一個字元
  for (i = 0; i < row; i++)
  {
   int j = 0;
   int count = 0;
   char  ret = board[i][0];
   for (j = 1; j < col; j++)
   {
    if (ret== board[i][j])
    {
     count++;
    }
   }if (count == n-1)
   {
    return board[i][0];
   }
  }
  //判斷列是否相等,如果相等返回此列第一個字元
  for (i = 0; i < row; i++)
  {
   int j = 0, count = 0;
   char  ret = board[0][i];
   for (j = 1; j < col; j++)
   {
    if (ret== board[j][i])
    {
     count++;
    }
   }
   if (count == n-1)
   {
    return board[0][i];
   }
  }
  //判斷主對角線是否相等,如果相等返回此對角線第一個字元
    for (i = 0; i < row; i++)
  {
   int j = 0, count = 0;
   char ret = board[0][0];
   for (j = i; j <= i; j++)
   {
    if (ret== board[i][j])
    {
     count++;
    }
   }
   if (count == n-1)
   {
    return board[0][0];
   }
  }
   //判斷次對角線是否相等,如果相等返回此對角線第一個字元
  for (i = 0; i < row; i++)
  {
   int j = 0, count = 0;
   char ret = board[0][2];
   for (j = 1-i; j <=1- i; j++)
   {
    if (ret==board[j][i])
    {
     count++;
    }
   }
   if (count == n-1)
   {
    return board[0][2];
   }
   }
   //判斷平局
   if (1 == is_full(board, ROW, COL))///呼叫is_full函式
  {
   return 'Q';
  }
}
//判斷棋盤是否已滿
int is_full(char board[ROW][COL], int row, int col)
{
 int i = 0;
 char ret = 0;
 for (i = 0; i < row; i++)
 {
  int j = 0;
  for (j = 0; j < col; j++)
  {
   ret += board[i][j];
  }
 }
 if (ret == (('X '*(row-1)*(col-1))+('Y '*(row-1)*(col-1)))
  return 1;
}

主函式

#define _CRT_SECURE_NO_DEPRECATE 1
#include <stdio.h>
#include "game.h"
void game(char board[ROW][COL], int row, int col,int n)
{
 char ch = { 0 };
 init_board(board, ROW, COL);
 print_board(board, ROW, COL);
 while (1)
 {
  play_move(board, ROW, COL,n);
  ch=IF_WIN(board, ROW, COL,n);
  if ('X' == ch)
  {
   printf("玩家贏\n");
  }
  else if ('Y' == ch)
  {
   printf("電腦贏\n");
  }
  else if ('Q' == ch)
  {
   printf("平局\n");
  }
  print_board(board, ROW, COL);
  compture_move(board, ROW, COL,n);
  ch = IF_WIN(board, ROW, COL, n);
  if ('X' == ch)
  {
   printf("玩家贏\n");
  }
  else if ('Y' == ch)
  {
   printf("電腦贏\n");
  }
  else if ('Q' == ch)
  {
   printf("平局\n");
  }
  print_board(board, ROW, COL);
 }
}
int main()
{
 char board[ROW][COL] = {0};
 int input = 0;
 int n = 0;
 printf("請選擇要玩的几子琪\n");
 scanf("%d", &n);
 srand((unsigned int)time(NULL));
 do 
 {
  menu();
  printf("請輸入選擇:>\n");
  scanf("%d", &input);
  switch (input)
  {
  case 1:game(board,ROW,COL,n); break;
  case 0:break;
  default:printf("輸入錯誤請,請重新輸入:>"); break;
  }
 } while (input);
 return 0;
}