C语言小游戏——三子棋
?
C語言 -- 三子棋
? ? ? ?本篇主要是用二維數組和多個函數來實現三子棋游戲。
? ? ? ?讓我們先來看看這個編寫這個游戲的思路:首先要打印三子棋的棋盤,然后是玩家下棋,電腦下棋,最后判斷誰贏了,或者看看是否平局。
? ? ? ?我們用一個頭文件 game.h ,一個源文件 game.c(主要的代碼都在這里面哦!)和一個源文件測試文件 text.c(主要寫整個游戲的具體思路)來編寫我們的代碼。
?
?
*首先我們看看頭文件(game.h):
#ifndef __GAME_H__ #define __GAME_H__#include<stdio.h> #include<stdlib.h> #include<time.h>#define ROW 3 //行 自己可以改變棋盤的大小 #define COL 3 //列 同上(不能小于三哦)void init_board(char board[ROW][COL], int row, int col); void print_board(char board[ROW][COL], int row, int col); void player_move(char board[ROW][COL], int row, int col); void computer_board(char board[ROW][COL], int row, int col); char is_win(char board[ROW][COL], int row, int col); //以上是后面源文件中需要調用的函數enum OPTION {EXIT,PLAY }; //枚舉 #endif // ! __GAME_H__? ? ? ?
*再來看看測試文件 (test.c):
#include"game.h"void menu() {printf(" 三子棋游戲 \n");printf("\n");printf("***********************************\n");printf("******* 1. play *******\n");printf("******* 0. exit *******\n");printf("***********************************\n"); }void game() {int row = 0;int col = 0;char ret = '0';char board[ROW][COL] = { '0' }; //創建一個數組(棋盤)init_board(board, ROW, COL); //初始化棋盤,使其都是空格。print_board(board, ROW, COL); //打印棋盤while (1){player_move(board, ROW, COL); //玩家下棋print_board(board, ROW, COL); ret = is_win(board, ROW, COL);//判斷輸贏平局if (ret == 'X'){printf("恭喜你,贏了!\n");break;}else if (ret == 'Q'){printf("平局\n");break;}computer_board(board, ROW, COL); //電腦下棋print_board(board, ROW, COL);ret = is_win(board, ROW, COL);//判斷if (ret == 'O'){printf("電腦贏了!\n");break;}else if (ret == 'Q'){printf("平局\n");break;}} }int main() {int input = 0;srand((unsigned int)(time(NULL)));menu(); //打印菜單do{printf("請選擇:");scanf_s("%d", &input);switch (input){case PLAY:game();break;case EXIT:printf("退出游戲\n");break;default:printf("選擇錯誤,請重新選擇!\n");break;}} while (input);return 0; }? ? ? ??
?
*最后來看看最重要的 game.c ,讓我們分部來看: ? ? ??
初始化數組,元素都是空格
void init_board(char board[ROW][COL], int row, int col) {memset(board, ' ', sizeof(board[0][0]) * row * col); }不知道memset函數的點擊這里?==>?點擊打開鏈接
?
接下來就要打印棋盤了,如下圖(3*3棋盤),我們將它分成后面這個圖看看。
? ? ? ? ? ? ? ? ? ? ?
看紅色的(橫著看),發現最后一個紅框里面比前面的少一個 ‘ | ’;
再看紫色的,發現最后一行比上面少底下一行;
觀察完了,我們來實現代碼
void print_board(char board[ROW][COL], int row, int col) {int i = 0;int j = 0;for (i = 0; i < col; i++){for (j = 0; j < row; j++){printf(" %c ", board[i][j]);if (j != row - 1){printf("|");}}printf("\n");if (i != col - 1){for (j = 0; j < row; j++){printf("---");if (j != row - 1){printf("|");}}printf("\n");} } }?
*玩家下棋
void player_move(char board[ROW][COL], int row, int col) {int x = 0;int y = 0;while (1){printf("玩家走\n");printf("請輸入你要下棋的坐標:");scanf_s("%d %d", &x, &y);if (((x > 0) && (x <= row)) && ((y > 0) && (y <= col))) //下棋的坐標要在棋盤內。 {if (board[x - 1][y - 1] == ' ') //注:玩家輸入的坐標假如是(1 1),寫代碼的應該知道其實是(0 0){board[x - 1][y - 1] = 'X';break;}else{printf("輸入的坐標已有棋子,請重新輸入!\n");}}else{printf("輸入棋子的坐標有誤,請重新輸入!\n");}} }注:玩家輸入的坐標假如是(1 1),寫代碼的應該知道其實是(0 0){board[x - 1][y - 1] = 'X';break;}else{printf("輸入的坐標已有棋子,請重新輸入!\n");}}else{printf("輸入棋子的坐標有誤,請重新輸入!\n");}} }?
*電腦下棋
void computer_board(char board[ROW][COL], int row, int col) {printf("電腦走\n");while (1){int x = rand() % row; //srand((unsigned int)(time(NULL))int y = rand() % col;if (board[x][y] == ' '){board[x][y] = 'O';break;}} }?
*判斷輸贏還有平局
char is_win(char board[ROW][COL], int row, int col) {int x = 0;int y = 0;for (x = 1; x < row - 1; x++){for (y = 0; y < col; y++){if ((board[x][y] == board[x - 1][y]) && (board[x][y] == board[x + 1][y]) && board[x][y] != ' '){return board[x][y];}}}for (x = 0; x < row; x++){for (y = 1; y < col - 1; y++){if ((board[x][y] == board[x][y - 1]) && (board[x][y] == board[x][y + 1]) && board[x][y] != ' '){return board[x][y];}}}for (x = 1; x < row - 1; x++){for (y = 1; y < col - 1; y++){if (((board[x][y] == board[x - 1][y - 1]) && (board[x][y] == board[x + 1][y + 1]) && board[x][y] != ' ')|| ((board[x][y] == board[x - 1][y + 1]) && (board[x][y] == board[x + 1][y - 1])) && board[x][y] != ' ')return board[x][y];}}if (is_full(board, ROW, COL) == 1) //判斷棋盤是否滿了(平局){return 'Q'; //表示棋盤滿了} } static int is_full(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++){if (board[i][j] == ' '){return 0;}}}return 1; }想想上面那段代碼可以優化嗎?
? ? ? 我們可以把玩家或者電腦下棋的坐標傳過來,以這個坐標為中心判斷輸贏,就不用重新一個一個的找,一個一個判斷。(可以自己試試哦!)
?
?
最后我們來看看結果(3*3棋盤)
?
再來看一個(5*5棋盤)
? ? ? ? ? ? ? ? ? ? ?
?
?
? ? ? ?好了,這樣這個三子棋代碼就完成了!學會了嗎?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的C语言小游戏——三子棋的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一维数组中的一些问题
- 下一篇: 二维数组中的一些问题