完成簡單的三子琪遊 戲
阿新 • • 發佈:2018-12-05
基本思路
- 初始化棋盤:
- 下棋:
- 判斷輸贏
實現
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;
}