1. 程式人生 > 程式設計 >C語言三子棋小遊戲的實現

C語言三子棋小遊戲的實現

前言

三子棋又叫九宮棋、圈圈叉叉、一條龍、井字棋等。

三子棋遊戲規則:三子連成一片即為贏,如果雙方都沒有連成線,即為平局。

一、如何實現?

1.棋盤大小如何確定?

我們要實現一個3×3的棋盤,就需要定義一個3行3列的陣列,但是陣列的下標從0開始,玩家選擇落子座標很不方便,所以要定義一個4×4的陣列,第0行第0列不使用,如下圖紅框內的行和列不使用。這樣就方便玩家選擇落子座標。

C語言三子棋小遊戲的實現

2.如何判定輸贏?

三子棋的規則很簡單,只要判斷每一行、每一列、對角線中是否有連成線的,即為贏。

程式碼思路:

1、判斷是否有相同的行並且不能為空格(陣列初始化為空格)。
2、判斷是否有相同的列並且不能為空格。
3、判斷主次對角線是否相同並且不能為空格。

4、棋盤下滿後是否為平局。

程式碼如下:

//判斷誰贏,'X'表示玩家贏,'0'表示電腦贏,'p'表示平局
char IsWin(char map[ROWS][COLS],int row,int col)
{
 int i = 0;
 int j = 0;
 int ret = IsFull(map,ROWS,COLS);
 //判斷行
 for (i = 1; i < row; i++)
 {
 if (map[i][1] == map[i][2] && map[i][2] == map[i][3] && map[i][1] != ' ')
 {
 return map[i][1];
 }
 }
 //判斷列
 for (j = 1; j < col; j++)
 {
 if (map[1][j] == map[2][j] && map[2][j] == map[3][j] && map[1][j] != ' ')
 {
 return map[1][j];
 }
 }
 //判斷主對角線
 if (map[1][1] == map[2][2] && map[2][2] == map[3][3] && map[1][1] != ' ') 
 {
 return map[1][1];
 }
 //判斷次對角線
 if (map[1][3] == map[2][2] && map[2][2] == map[3][1] && map[1][3] != ' ')
 {
 return map[1][3];
 }
 //判斷是否為平局
 if (ret == 0)
 {
 return 'p';
 }
 else
 {
 return ' ';//防止編譯器報錯
 }
}

注意:

1、三個值比較時不可以使用連等,==是關係操作符,==是從左到右進行運算的,計算表示式 a == b == c 時,首先會進行邏輯運算 a == b得出邏輯值1或0,得到的結果作為返回值,然後進行邏輯運算 “返回值” == c 得出邏輯值1或0,作為整個表示式的返回值。所以不能這樣用。
2、判斷完是否平局後,要加一個else,返回一個字元,不然編譯器會報錯:

C語言三子棋小遊戲的實現

因為編譯器認為還有一種情況:當所有的if都不滿足時,沒有返回值,所以要加一個else返回一個對結果沒有影響的字元。

二、具體程式碼實現

1.標頭檔案game.h

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

#define ROW 3
#define COL 3
#define ROWS ROW+1
#define COLS COL+1

//初始化棋盤
void InitMap(char map[][COLS],int col);

//列印棋盤
void DisplayMap(char map[][COLS],int col);

//玩家落子
void PlayerMove(char map[][COLS],int col);

//電腦落子
void ComputerMove(char map[][COLS],int col);

//判斷棋盤是否滿,0表示滿,1表示未滿
int IsFull(char map[][COLS],int col);

//判斷誰贏,'X'表示玩家贏,'0'表示電腦贏,'p'表示平局
char IsWin(char map[][COLS],int col);

2.主函式main.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"

void menu()
{
 printf("***********************************************\n");
 printf("********  三子棋  *********\n");
 printf("***********************************************\n");
 printf("*************** 1.play **************\n");
 printf("*************** 0.exit **************\n");
 printf("***********************************************\n");
}

void game()
{
 char map[ROWS][COLS];
 char ret = ' ';//用來接收IsWin()的返回值
 InitMap(map,COLS);//初始化棋盤
 DisplayMap(map,COLS);//列印棋盤
 do
 {
 PlayerMove(map,COLS);//玩家落子 
 ret = IsWin(map,COLS);
 if (ret == 'X')
 {
 printf("玩家贏......\n");
 break;
 }
 else if (ret == 'p')
 {
 printf("平局......\n");
 break;
 }
 ComputerMove(map,COLS);//電腦落子
 ret = IsWin(map,COLS);
 if (ret == '0')
 {
 printf("電腦贏......\n");
 break;
 }
 }while (IsFull(map,COLS));//棋盤已滿,結束迴圈
}

void test()
{
 int input = 0;
 srand((unsigned)time(NULL));
 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();
 return 0;
}

3.函式game.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"

void InitMap(char map[][COLS],int col)
{
 int i = 0;
 int j = 0;
 for (i = 1; i < row; i++)
 {
 for (j = 1; j < col; j++)
 {
 map[i][j] = ' ';
 }
 }
}

void DisplayMap(char map[][COLS],int col)
{
 int i = 0; 
 int j = 0;
 for (i = 1; i < row; i++)
 {
 for (j = 1; j <= col; j++)
 {
 printf("%3c",map[i][j]);
 if (j < col - 1)
 {
 printf(" | ");
 }
 }
 printf("\n");
 if (i < row - 1)
 {
 for (j = 1; j < col; j++)
 {
 printf(" --- ");
 }
 } 
 printf("\n");
 }
}

void PlayerMove(char map[][COLS],int col)
{
 int x = 0;
 int y = 0;
 printf("玩家走->\n");
 while (1)
 {
 printf("請選擇落子座標->");
 scanf("%d %d",&x,&y);
 if (x >= 1 && x <= 3 && y >= 1 && y <= 3)
 {
 if (map[x][y] == ' ') 
 {
 map[x][y] = 'X';
 break;//落子成功就跳出迴圈
 }
 else
 {
 printf("該位置已被佔用請重新輸入->\n");
 }
 }
 else
 {
 printf("座標非法,請重新輸入......\n");
 }
 }
 DisplayMap(map,COLS);
}

void ComputerMove(char map[][COLS],int col)
{
 int x = 0;
 int y = 0;
 printf("電腦走->\n");
 while (1)
 {
 x = rand() % 3 + 1;//1-3
 y = rand() % 3 + 1;//1-3
 if (map[x][y] == ' ')
 {
 map[x][y] = '0';
 break;
 }
 }
 DisplayMap(map,COLS);
 }

//判斷棋盤是否滿,0表示滿,1表示未滿
int IsFull(char map[][COLS],int col)
{
 int i = 0;
 int j = 0;
 int count = 0;//計算落子過的格子
 for (i = 1; i < row; i++)
 {
 for (j = 1; j < col; j++)
 {
 if (map[i][j] == 'X' || map[i][j] == '0')
 {
 count++;
 }
 }
 }
 if (count == ROW * COL)
 {
 return 0;//滿
 }
 else
 {
 return 1;
 }
}

//判斷誰贏,'X'表示玩家贏,'0'表示電腦贏,'p'表示平局
char IsWin(char map[ROWS][COLS],COLS);
 //判斷行
 for (i = 1; i < row; i++)
 {
 if (map[i][1] == map[i][2] && map[i][2] == map[i][3] && map[i][1] != ' ')
 {
 return map[i][1];
 }
 }
 //判斷列
 for (j = 1; j < col; j++)
 {
 if (map[1][j] == map[2][j] && map[2][j] == map[3][j] && map[1][j] != ' ')
 {
 return map[1][j];
 }
 }
 //判斷主對角線
 if (map[1][1] == map[2][2] && map[2][2] == map[3][3] && map[1][1] != ' ') 
 {
 return map[1][1];
 }
 //判斷次對角線
 if (map[1][3] == map[2][2] && map[2][2] == map[3][1] && map[1][3] != ' ')
 {
 return map[1][3];
 }
 //判斷是否為平局
 if (ret == 0)
 {
 return 'p';
 }
 else
 {
 return ' ';//防止編譯器報錯
 }
}

4、執行結果示例

C語言三子棋小遊戲的實現

C語言三子棋小遊戲的實現

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。