蟲子 三子棋 眾神起步,萬語之基,軟硬橋梁,帝國大廈
三子棋
test.c文件
菜單函數
game函數
三子棋
test.c文件
菜單函數
game函數
game.c文件
InitBoard初始化棋盤函數
DisplayBoard打印棋盤函數
PlayerMove玩家移動函數
ComputerMove電腦移動函數
IsFull判斷棋盤是否下滿函數
IsWin判斷是否贏函數
game.h文件
宏
函數聲明
測試圖
三子棋
這是一個用C語言寫的簡單小游戲,也是我第一個用C語言寫的小游戲,游戲雖小,代碼俱全。
test.c文件
為了方便自述,還是從main進入(我也優化過三子棋代碼,不能無限輸錯)
int main() { int input = 0; int timer = 3;//游戲剩余次數 int flag = 1;//進入游戲標志 srand((unsigned)time(NULL));//設置隨機起點(運用時間戳) /*為了體會一下游戲的可玩性,先玩一把然后再決定玩與不玩 因此用do while循環*/ do { Menu(); //菜單函數 printf("請選擇:>"); scanf("%d",&input); switch (input)//選擇模式 { case 1: flag = 0; //玩游戲時游戲標志清零 game(); break; case 0: printf("退出\n"); break; default: if (flag == 0) //將游戲標記置一 { flag = 1; timer = 3;//可玩次數重新置三 } timer--; if (timer == 0)//當沒有游戲次數時就不能玩了 { printf("沒有選擇機會了,已退出游戲。"); break; } printf("選擇錯誤,可以重新選擇,還有%d錯誤就強制退出。time = %d\n",timer,timer); break; } } while(input&&timer);//可玩次數為0,自己不想玩都可以退出游戲 return 0; }
菜單函數
void Menu() { printf("**********************\n"); printf("***1.play 2.exit***\n"); printf("**********************\n"); }
game函數
void game() { char ret = 0; char board[ROW][COL];//棋盤數組 InitBoard(board,ROW,COL);//初始化棋盤 DisplayBoard(board,ROW,COL);//打印棋盤 /*玩家和電腦對打是有來有回的因此循環*/ while (1) { PlayerMove(board, ROW, COL); //玩家移動 DisplayBoard(board, ROW, COL);//打印棋盤 ret = IsWin(board, ROW, COL); //判斷輸贏函數 if (ret != 'C') //不能繼續就退出 { break; } ComputerMove(board, ROW, COL);//電腦移動 DisplayBoard(board, ROW, COL);//打印棋盤 ret = IsWin(board, ROW, COL); //判斷輸贏函數 if (ret != 'C') //不能繼續就退出 { break; } } if (ret == '*') { printf("玩家贏\n"); } else if (ret == '#') { printf("電腦贏\n"); } else { printf("平局\n"); } }
game.c文件
InitBoard初始化棋盤函數
這里為什么要用傳過來的row,col呢,有人會說不是有ROW,COL嗎理論上是沒有問題的,但不用自己傳過來的參數,用COL,ROW是被限制了的,獨立性下降了許多,受到到了限制,用自己傳過來的參數,是靈活變化的,不是依賴于COL,ROW的
void InitBoard(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++) { board[i][j] = ' '; } } }
DisplayBoard打印棋盤函數
棋盤設計每個人可能多多少少有點不同,這個就是棋盤界面,沒有花里胡哨,只有普通的分割行,數據行
void DisplayBoard(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]); } printf("\n"); }*/ int i = 0; for (i = 0; i <= row; i++) { int j = 0; for ( j = 0; j <= col; j++) { //打印分割行 printf("*"); if(j
PlayerMove玩家移動函數
玩家移動,為了體現自己的價值,所以先手永遠都是給玩家先走,誒我可以給電腦走可是就不給,就是玩。為了方便視覺觀察,玩家移動電腦移動都用漢字提示
void PlayerMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; int time = 3;//我們也不能放縱玩家瞎玩,連續瞎移動3次也讓你此局報廢 int flag = 1; printf("玩家移動:>\n"); while (time) { printf("請輸入坐標;>"); scanf("%d%d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (flag == 0)//到了這里說明你還是想玩的,標記置1,次數充滿 { flag = 1; time = 3; } if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = '*'; break; } else { printf("已經被占用,請重新落子:\n"); } } else { flag = 0;//到了這個代碼塊首先標記置0 time--;//可玩次數減少 if (time == 0)//這里我們也賦予棋盤爆怒情緒 { printf("你不想玩就滾,當我沒脾氣啊.\n"); break; } printf("坐標非法,超出范圍:你還有%d次機會\n", time); } } }
ComputerMove電腦移動函數
電腦移動,你永遠都是后手
void ComputerMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("電腦移動:>"); while (1) { x = rand() % row;//這里的rand是和srand配合使用的 y = rand() % col; if (board[x][y] == ' ') { board[x][y] = '#'; break; } } }
IsFull判斷棋盤是否下滿函數
int IsFull(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (board[i][j] == ' ') return 0; } } return 1;//兩層循環都沒有空格說明滿了 }
IsWin判斷是否贏函數
判斷游戲輸贏 返回4種不同的狀態: return ‘*’ 玩家贏 return ‘#’ 電腦贏 return ‘Q’ 平局 return ‘C’ 繼續
char IsWin(char board[ROW][COL], int row, int col) { //判斷輸贏 int i = 0; for ( i = 0; i < row; i++)//行判斷 { if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ') return board[i][0]; //這步非常不錯省了不少代碼,因為打印的符號和返回的符號相同 } for (i = 0; i < col; i++)//列判斷 { if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ') return board[0][i]; } if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')//對角線判斷 return board[0][0]; if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')//對角線判斷 return board[1][1]; //判斷平局,只需要看一下棋盤是不是滿了就行 if (IsFull(board, row, col)) return 'Q'; //游戲繼續 return 'C'; }
game.h文件
宏
宏的出現大大加大了代碼的可移植性
#define ROW 3//行 #define COL 3//列
函數聲明
void InitBoard(char board[ROW][COL], int row, int col); void DisplayBoard(char board[ROW][COL], int row, int col); void PlayerMove(char board[ROW][COL], int row, int col); void ComputerMove(char board[ROW][COL], int row, int col); char IsWin(char board[ROW][COL], int row, int col); int IsFull(char board[ROW][COL], int row, int col);
測試圖
瞎選的后果
只要在最后以后選正確,次數充滿
下面多條測試
5G游戲 軟件開發
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。