C語言三子棋小遊戲的實現
阿新 • • 發佈:2020-12-18
前言
三子棋又叫九宮棋、圈圈叉叉、一條龍、井字棋等。
三子棋遊戲規則:三子連成一片即為贏,如果雙方都沒有連成線,即為平局。
一、如何實現?
1.棋盤大小如何確定?
我們要實現一個3×3的棋盤,就需要定義一個3行3列的陣列,但是陣列的下標從0開始,玩家選擇落子座標很不方便,所以要定義一個4×4的陣列,第0行第0列不使用,如下圖紅框內的行和列不使用。這樣就方便玩家選擇落子座標。
2.如何判定輸贏?
三子棋的規則很簡單,只要判斷每一行、每一列、對角線中是否有連成線的,即為贏。
程式碼思路:
1、判斷是否有相同的行並且不能為空格(陣列初始化為空格)。
2、判斷是否有相同的列並且不能為空格。
3、判斷主次對角線是否相同並且不能為空格。
程式碼如下:
//判斷誰贏,'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,返回一個字元,不然編譯器會報錯:
因為編譯器認為還有一種情況:當所有的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、執行結果示例
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。