简单井字棋设计
?前言:
? ? ? 大家好,歡迎閱讀簡單井字棋設計,本片適合初學者閱讀與學習,所以程序并沒有那麼復雜。
? ? ? 首先介紹一下井字棋規則:在3*3的9宮格內自己的三個棋子連成一條直線為勝利。
前期準備:
? ? ? 首先我們需要創建兩個源文件和一個頭文件,如下圖所示
首先我們規定test.c :
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?用于游戲開始時菜單的打印;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?開始游戲和退出游戲的操作,以及循環游玩游戲的操作;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?游戲主體如何調用函數;
game.c主要負責:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 游戲開始菜單的實現;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 數組的初始化;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 棋盤的打印;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 玩家下棋;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 電腦下棋;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 輸贏的判斷;
game.h主要負責:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 行號、列好;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 函數的聲明;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 庫函數的包含;
程序的實現:
gitee鏈接:井字棋(csdn版) · 風夏/c語言初級學習 - 碼云 - 開源中國 (gitee.com)
test.c(并不完整)
開始時我們只需要書寫能想到的步驟即可,不需要開始時文件寫的就特別完整,后續需要時我們在往里面添加。
#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void game() {//創建數組,存放變量char board[ROW][COL] = { 0 };//用于判斷勝利char ret = '0';//初始化數組內容,和打印棋盤init_board(board, ROW, COL);printf_board(board, ROW, COL);//玩家下棋和電腦下棋player_move(board, ROW, COL);ret=is_win(board, ROW, COL);computer_move(board, ROW, COL);ret=is_win(board, ROW, COL); }int main() {//用input來接收變量,判斷是否開始游戲int input = 0;//此處設置隨機值,讓電腦隨機下棋srand((unsigned int)time(NULL));do{printf("請選擇:\n");//打印開始菜單menu();scanf("%d ", &input);switch (input){case 0:printf("已退出游戲!\n");break;case 1:printf("開始游戲\n");game();break;default:printf("輸入錯誤,請重新輸入:\n");break;}}while (input);return 0;}game.c文件(完整版)
#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"//打印菜單的實現 void menu() {printf("******************************************\n");printf("************ 1 . 開始游戲 ************\n");printf("************ 0 . 退出游戲 ************\n");printf("******************************************\n"); }//初始化函數的實現 void init_board(char board[ROW][COL], int row, int col) {for (int i = 0; i < row; i++){for (int j = 0; j < col; j++)board[i][j] = ' ';} }void printf_board(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++){printf(" %c ", board[i][j]);if (j < col - 1)printf("|");}printf("\n");//打印分割行if (i < row - 1){for (j = 0; j < col; j++){printf("___");if (j < col - 1)printf("|");}}//到了最后一行為了保持對稱和美觀只打印了‘|’else{for (j = 0; j < col; j++){printf(" ");if (j < col -1 )printf("|");}}printf("\n");} }//玩家下棋 void player_move(char board[ROW][COL], int row, int col) {int x = 0;int y = 0;do {do{printf("請輸入坐標:\n");scanf("%d %d", &x, &y);if (x > 0 && x <= row && y > 0 && y <= col)break;elseprintf("輸入坐標錯誤,請重新輸入:\n");} while (1);if (board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = '*';break;}else{printf("輸入坐標已被占用,請重新輸入:\n");}} while (1);printf_board(board, row, col); }//電腦隨機下棋 void computer_move(char board[ROW][COL], int row, int col) {int x = 0;int y = 0;do {x = rand() % row;y = rand() % col;if (board[x][y] == ' '){board[x][y] = '#';break;}} while (1);printf_board(board, row, col); }//判斷勝負 //*代表玩家勝 //#代表電腦勝 //Q平局C繼續 char is_win(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[1][1] != ' ') || (board[0][2] == board[1][1] && board[1][1] == board[2][0]) && board[1][1] != ' ')return board[1][1];//判斷平局或繼續for (i = 0; i < row; i++){for (int j = 0; j < col; j++)if (board[i][j] == ' ')return 'C';}return 'Q'; }注釋:is_win的返回值
//*代表玩家勝
//#代表電腦勝
//Q平局C繼續
這時候可以返回來,完成我們text.c文件(完整版)
#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void game() {//創建數組,存放變量char board[ROW][COL] = { 0 };//用于判斷勝利char ret = '0';//初始化數組內容,和打印棋盤init_board(board, ROW, COL);printf_board(board, ROW, COL);//玩家下棋和電腦下棋do{player_move(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C')break;computer_move(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C')break;} while (1);//輸出結果if (ret == '*'){printf("玩家勝\n");}else if(ret=='#'){printf("電腦勝\n");}else{printf("平局\n");} }int main() {//用input來接收變量,判斷是否開始游戲int input = 0;//此處設置隨機值,讓電腦隨機下棋srand((unsigned int)time(NULL));do{//打印開始菜單menu();printf("請選擇:\n");scanf("%d", &input);switch (input){case 0:printf("已退出游戲!\n");break;case 1:printf("開始游戲\n");game();break;default:printf("輸入錯誤,請重新輸入:\n");break;}}while (input);return 0;}最后我們可以完整一下game.h文件(完整版)
#pragma once//庫函數的包含 //引用了輸入輸出函數 #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 printf_board(char board[ROW][COL], int row, int col); void player_move(char board[ROW][COL], int row, int col); void computer_move(char board[ROW][COL], int row, int col); char is_win(char board[ROW][COL], int row, int col);總結:
? ? ? 三子棋的邏輯并沒有特別復雜,非常適合初學者。初學者要保持良好的心態,自己動手嘗試寫出來。
? ? ? 首先我們要明白、了解三子棋的最基本思路
? ? ? 然后逐步完成每個文件,并不需要一次性寫的非常完整,到程序需要的時候在往上面補充,也是個不錯的選擇。
? ? ? 最后每完成一個步驟,我們能對他進行調試,以保證正確性,除非是計算機大神就當我沒說過。
? 完結:
? ? ? ? 希望大家越學越好哦!!!
? ? ? ? 下一次,我將在此次的基礎上添加智能攔截,智能獲勝功能,敬請期待。。。。。。
? ? ? ??
總結
- 上一篇: 在一维的世界里寻找迭代次数的影子
- 下一篇: python的seek用法