零基礎寫出三子棋遊戲;全網最詳細解析三子棋的C語言寫法!
阿新 • • 發佈:2018-12-14
作為一個遊戲你首先得有選單!於是我們做了個選單~
void menu() { printf("┏━━━━━━━━━━━━━━━━━━━━━━━━┓\n"); printf("┃ 歡迎來到三子棋 ┃\n"); printf("┣━━━━━━━━━━━━━━━━━━━━━━━━┫\n"); printf("┃ 1.開始遊戲 ┃\n"); printf("┣━━━━━━━━━━━━━━━━━━━━━━━━┫\n"); printf("┃ 0.退出遊戲 ┃\n"); printf("┗━━━━━━━━━━━━━━━━━━━━━━━━┛\n"); }
選單做好了你得讓人家選吧,弄個input接受一哈。對應選單,選一進入遊戲,選零退出程式,有故意亂輸的先告訴他選錯了,然後再給他次機會,所以這裡用一手do while就很愜意了~
int main() { int input = 0; srand((unsigned int)time(NULL));//後面rand電腦下子座標用的 do { menu();//列印選單 printf("請選擇:"); scanf("%d",&input); switch(input) { case 1: game(); break; case 0: printf("退出遊戲\n"); break; default: printf("選擇錯誤\n"); break; } } while(input); return 0; }
在原始檔中新填一個game.c,開始寫遊戲主體函式啦~ 下面進入遊戲的主體函式,我會在備註中講解( ̄▽ ̄)/
void game() { int input = 0;//用於判斷誰先行的 int count = 0;//用count記錄回合數 char board[ROWS][COLS] = {0};//初始化一個二維陣列用以存座標 init_board(board,ROWS,COLS);//初始化棋盤 print_board(board,ROWS,COLS);//列印棋盤 printf("若您想先行,輸入1,想讓電腦先行則輸入其他數字:"); scanf("%d",&input); if(1 != input)//電腦先行的情況 { printf("電腦落子:\n"); com_move(board,ROWS,COLS); //電腦落子 print_board(board,ROWS,COLS); //慣例列印棋盤 count++; //記一次回合數 } while(1) { if(9 == count)//9回合未分勝負則輸出平局 { printf("~~~旗鼓相當的對手~~~\n"); break; } printf("玩家落子:\n"); //玩家回合 player_move(board,ROWS,COLS); //玩家落子 print_board(board,ROWS,COLS); //慣例列印棋盤 if(' ' != is_win(board,ROWS,COLS))//回合結束判斷勝負 break; count++; //記一次回合數 printf("電腦落子:\n"); //電腦回合 com_move(board,ROWS,COLS); //電腦落子 print_board(board,ROWS,COLS); //慣例列印棋盤 if(' ' != is_win(board,ROWS,COLS))//回合結束判斷勝負 break; count++; //記一次回合數 } if('X' == is_win(board,ROWS,COLS))//判斷勝負 { printf("電腦勝利!!!!!!\n"); } else if('*' == is_win(board,ROWS,COLS))//判斷勝負 { printf("你贏了!!!!!!\n"); } re_menu();//返回主選單 }
然後就是補充在遊戲中涉及到但沒寫的函式
初始化棋盤函式 就是把字元型的二維陣列用空格填滿
void init_board(char board[ROWS][COLS], int rows, int cols)
{
int i = 0;
int j = 0;
for(i=0; i<rows; i++)
{
for(j=0; j<cols; j++)
{
board[i][j] = ' ';
}
}
}
列印棋盤函式 為了讓我們的函式不僅僅侷限於3*3,所以這裡不能直接一行三個這樣設計排版,而是要一個一個輸出;此處的程式碼可以仔細研究
void print_board(char board[ROWS][COLS], int rows, int cols)
{
int i = 0;
int j = 0;
for(i=0; i<rows; i++)
{
for(j=0; j<cols; j++)
{
printf(" %c ",board[i][j]);
if(j<cols-1)
printf("┃");
}
printf("\n");
if(i<rows-1)
{
for(j=0; j<cols-1; j++)
{
printf("━━━╋");
}
printf("━━━");
}
printf("\n");
}
}
玩家下子函式 注意兩點:1,座標和元素下標要區分開; 2,要檢驗輸入的是否可用,有沒有被佔用 ps:這裡我沒有區分“已被佔用”和“輸入座標錯誤”~觀眾闊以改一哈
void player_move(char board[ROWS][COLS], int rows, int cols)
{
int x = 0;
int y = 0;
while(1)
{
printf("輸入你要落子的座標:");
scanf("%d%d",&x,&y);
if(' ' == board[x-1][y-1])
{
board[x-1][y-1] = '*';
break;
}
else
printf("該座標已被佔用!\n");
}
}
電腦下子函式 電腦選擇的座標是根據時間隨即生成的;由於模3後只會有0,1, 2三個結果,滿足下標的要求,所以只需要在判斷蛤有沒有被佔用就闊以了
void com_move(char board[ROWS][COLS], int rows, int cols)
{
int x = 0;
int y = 0;
while(1)
{
x = rand()%3;//開頭主函式中有宣告喲~可以回去看一眼
y = rand()%3;
if(' ' == board[x][y])
{
board[x][y] = 'X';
break;
}
}
}
判斷輸贏函式 把所有勝利條件窮舉出來,沒啥好說的,別輸錯下標就行
char is_win(char board[ROWS][COLS], int rows, int cols)
{
int i = 0;
for(i=0; i<rows; i++)
{
if((board[i][0]==board[i][1])&&(board[i][1]==board[i][2])&&(' '!=board[i][1]))
return board[i][1];
}
for(i=0; i<cols; i++)
{
if((board[0][i]==board[1][i])&&(board[1][i]==board[2][i])&&(' '!=board[1][i]))
return board[1][i];
}
if ((board[0][0] == board[1][1])&&(board[1][1] == board[2][2])&&(' '!=board[1][1]))
return board[1][1];
if ((board[0][2] == board[1][1])&&(board[1][1] == board[2][0])&&(' '!=board[1][1]))
return board[1][1];
return ' ';
}
返回選單函式 花裡胡哨的搞個倒計時清屏,在第二次進入目錄前清屏闊以更乾淨,不過不要也沒關係
void re_menu()
{
printf("三秒後返回選單頁面\n");
printf("3\n");
Sleep(1000);
printf("2\n");
Sleep(1000);
printf("1\n");
system("cls");
}
這是我自己創的game庫函式,把所有引標頭檔案,函式宣告,定義常量等操作放在這
#ifndef __game_h__
#define __game_h__
#define ROWS 3
#define COLS 3
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
void game();
void init_board(char board[ROWS][COLS], int rows, int cols);
void print_board(char board[ROWS][COLS], int rows, int cols);
void player_move(char board[ROWS][COLS], int rows, int cols);
void com_move(char board[ROWS][COLS], int rows, int cols);
char is_win(char board[ROWS][COLS], int rows, int cols);
void re_menu();
#endif //__game_h__
執行一次! 讀秒完成後會回到主選單 ok,三子棋的C語言寫法就是這樣了,只要思路清晰,完成這個遊戲不會太難的!